diff --git a/materialsystem/cmaterialsystem.h b/materialsystem/cmaterialsystem.h
index 60aad1fd8..75cbbed7b 100644
--- a/materialsystem/cmaterialsystem.h
+++ b/materialsystem/cmaterialsystem.h
@@ -501,6 +501,7 @@ class CMaterialSystem : public CTier2AppSystem< IMaterialSystemInternal >, publi
 	DELEGATE_TO_OBJECT_0( bool,				OnFlushBufferedPrimitives, GetRenderContextInternal() );
 	void									OnThreadEvent( uint32 threadEvent );
 	ShaderAPITextureHandle_t				GetShaderAPITextureBindHandle( ITexture *pTexture, int nFrame, int nTextureChannel ); // JasonM ????
+	uint32_t				GetShaderAPIGLTexture( ITexture *pTexture, int nFrame, int nTextureChannel ); // fuck
 
 
 
diff --git a/materialsystem/gltexturehack.cpp b/materialsystem/gltexturehack.cpp
new file mode 100644
index 000000000..8748cce19
--- /dev/null
+++ b/materialsystem/gltexturehack.cpp
@@ -0,0 +1,53 @@
+#include "pch_materialsystem.h"
+#include "togl/rendermechanism.h"
+
+#define MATSYS_INTERNAL
+
+#include "cmaterialsystem.h"
+//-----------------------------------------------------------------------------
+// The Base implementation of the shader rendering interface
+//-----------------------------------------------------------------------------
+class CShaderAPIBase : public IShaderAPI
+{
+public:
+	// constructor, destructor
+	CShaderAPIBase();
+	virtual ~CShaderAPIBase();
+
+	// Called when the device is initializing or shutting down
+	virtual bool OnDeviceInit() = 0;
+	virtual void OnDeviceShutdown() = 0;
+
+	// Pix events
+	virtual void BeginPIXEvent( unsigned long color, const char *szName ) = 0;
+	virtual void EndPIXEvent() = 0;
+	virtual void AdvancePIXFrame() = 0;
+
+	// Release, reacquire objects
+	virtual void ReleaseShaderObjects() = 0;
+	virtual void RestoreShaderObjects() = 0;
+
+	// Resets the render state to its well defined initial value
+	virtual void ResetRenderState( bool bFullReset = true ) = 0;
+
+	// Returns a d3d texture associated with a texture handle
+	virtual IDirect3DBaseTexture9* GetD3DTexture( ShaderAPITextureHandle_t hTexture ) = 0;
+
+	// Queues a non-full reset of render state next BeginFrame.
+	virtual void QueueResetRenderState() = 0;
+
+	// Methods of IShaderDynamicAPI
+public:
+	virtual void GetCurrentColorCorrection( ShaderColorCorrectionInfo_t* pInfo );
+
+protected:
+};
+
+uint32_t CMaterialSystem::GetShaderAPIGLTexture( ITexture *pTexture, int nFrame, int nTextureChannel )
+{
+	ShaderAPITextureHandle_t handle = ShaderSystem()->GetShaderAPITextureBindHandle( pTexture, nFrame, nTextureChannel );
+	IDirect3DTexture9* pTex = ((CShaderAPIBase*)g_pShaderAPI)->GetD3DTexture(handle);
+	IDirect3DSurface9* surf = pTex->m_surfZero;
+	CGLMTex *tex = surf->m_tex;
+	return tex->GetTexName();
+}
diff --git a/materialsystem/mat_stub.cpp b/materialsystem/mat_stub.cpp
index c9820c2c2..bae40c859 100644
--- a/materialsystem/mat_stub.cpp
+++ b/materialsystem/mat_stub.cpp
@@ -2276,7 +2276,7 @@ class CDummyMaterialSystem : public IMaterialSystemStub, public CRefCounted1<IMa
 	{
 		return false;	
 	}
-
+	virtual uint32_t GetShaderAPIGLTexture(ITexture*, int, int) {return 0;}
 };
 
 
diff --git a/materialsystem/wscript b/materialsystem/wscript
index 7a758c590..a3037f7f0 100755
--- a/materialsystem/wscript
+++ b/materialsystem/wscript
@@ -45,6 +45,7 @@ def build(bld):
 		'cmatrendercontext.cpp',
 		'cmatqueuedrendercontext.cpp',
 		'ctexturecompositor.cpp',
+		'gltexturehack.cpp',
 		'../public/tier0/memoverride.cpp'
 	]
 
diff --git a/public/materialsystem/imaterialsystem.h b/public/materialsystem/imaterialsystem.h
index 7d71c31f1..6463ba0e1 100644
--- a/public/materialsystem/imaterialsystem.h
+++ b/public/materialsystem/imaterialsystem.h
@@ -1093,6 +1093,7 @@ abstract_class IMaterialSystem : public IAppSystem
 
 	// Performs final verification of all compositor templates (after they've all been initially loaded).
 	virtual bool				VerifyTextureCompositorTemplates( ) = 0;
+	virtual uint32_t GetShaderAPIGLTexture( ITexture *pTexture, int nFrame, int nTextureChannel ) = 0;
 };
 
 
diff --git a/public/openvr/openvr.h b/public/openvr/openvr.h
deleted file mode 100644
index abceb8ba6..000000000
--- a/public/openvr/openvr.h
+++ /dev/null
@@ -1,1095 +0,0 @@
-#pragma once
-
-// openvr.h
-//========= Copyright Valve Corporation ============//
-// Dynamically generated file. Do not modify this file directly.
-
-#ifndef _OPENVR_API
-#define _OPENVR_API
-
-#include <stdint.h>
-
-
-// vrtypes.h
-namespace vr
-{
-
-#if defined(__linux__) || defined(__APPLE__) 
-	// The 32-bit version of gcc has the alignment requirement for uint64 and double set to
-	// 4 meaning that even with #pragma pack(8) these types will only be four-byte aligned.
-	// The 64-bit version of gcc has the alignment requirement for these types set to
-	// 8 meaning that unless we use #pragma pack(4) our structures will get bigger.
-	// The 64-bit structure packing has to match the 32-bit structure packing for each platform.
-	#pragma pack( push, 4 )
-#else
-	#pragma pack( push, 8 )
-#endif
-
-// right-handed system
-// +y is up
-// +x is to the right
-// -z is going away from you
-// Distance unit is  meters
-struct HmdMatrix34_t
-{
-	float m[3][4];
-};
-
-struct HmdMatrix44_t
-{
-	float m[4][4];
-};
-
-struct HmdVector3_t
-{
-	float v[3];
-};
-
-struct HmdVector3d_t
-{
-	double v[3];
-};
-
-struct HmdVector2_t
-{
-	float v[2];
-};
-
-struct HmdQuaternion_t
-{
-	double w, x, y, z;
-};
-
-struct HmdQuad_t
-{
-	HmdVector3_t vCorners[ 4 ];
-};
-
-/** Used to return the post-distortion UVs for each color channel. 
-* UVs range from 0 to 1 with 0,0 in the upper left corner of the 
-* source render target. The 0,0 to 1,1 range covers a single eye. */
-struct DistortionCoordinates_t
-{
-	float rfRed[2];
-	float rfGreen[2];
-	float rfBlue[2];
-};
-
-enum Hmd_Eye
-{
-	Eye_Left = 0,
-	Eye_Right = 1
-};
-
-enum GraphicsAPIConvention
-{
-	API_DirectX = 0, // Normalized Z goes from 0 at the viewer to 1 at the far clip plane
-	API_OpenGL = 1,  // Normalized Z goes from 1 at the viewer to -1 at the far clip plane
-};
-
-enum HmdTrackingResult
-{
-	TrackingResult_Uninitialized			= 1,
-
-	TrackingResult_Calibrating_InProgress	= 100,
-	TrackingResult_Calibrating_OutOfRange	= 101,
-
-	TrackingResult_Running_OK				= 200,
-	TrackingResult_Running_OutOfRange		= 201,
-};
-
-static const uint32_t k_unTrackingStringSize = 32;
-static const uint32_t k_unMaxTrackedDeviceCount = 16;
-static const uint32_t k_unTrackedDeviceIndex_Hmd = 0;
-
-/** Describes what kind of object is being tracked at a given ID */
-enum TrackedDeviceClass
-{
-	TrackedDeviceClass_Invalid = 0,				// the ID was not valid.
-	TrackedDeviceClass_HMD = 1,					// Head-Mounted Displays
-	TrackedDeviceClass_Controller = 2,			// Tracked controllers
-	TrackedDeviceClass_TrackingReference = 4,	// Camera and base stations that serve as tracking reference points
-
-	TrackedDeviceClass_Other = 1000,
-};
-
-
-/** describes a single pose for a tracked object */
-struct TrackedDevicePose_t
-{
-	HmdMatrix34_t mDeviceToAbsoluteTracking;
-	HmdVector3_t vVelocity;				// velocity in tracker space in m/s
-	HmdVector3_t vAngularVelocity;		// angular velocity in radians/s (?)
-	HmdTrackingResult eTrackingResult;
-	bool bPoseIsValid;
-
-	// This indicates that there is a device connected for this spot in the pose array.
-	// It could go from true to false if the user unplugs the device.
-	bool bDeviceIsConnected;
-};
-
-/** Identifies which style of tracking origin the application wants to use
-* for the poses it is requesting */
-enum TrackingUniverseOrigin
-{
-	TrackingUniverseSeated = 0,		// Poses are provided relative to the seated zero pose
-	TrackingUniverseStanding = 1,	// Poses are provided relative to the safe bounds configured by the user
-	TrackingUniverseRawAndUncalibrated = 2,	// Poses are provided in the coordinate system defined by the driver. You probably don't want this one.
-};
-
-
-/** Each entry in this enum represents a property that can be retrieved about a
-* tracked device. Many fields are only valid for one TrackedDeviceClass. */
-enum TrackedDeviceProperty
-{
-	// general properties that apply to all device classes
-	Prop_TrackingSystemName_String			= 1000,
-	Prop_ModelNumber_String					= 1001,
-	Prop_SerialNumber_String				= 1002,
-	Prop_RenderModelName_String				= 1003,
-	Prop_WillDriftInYaw_Bool				= 1004,
-	Prop_ManufacturerName_String			= 1005,
-	Prop_TrackingFirmwareVersion_String		= 1006,
-	Prop_HardwareRevision_String			= 1007,
-
-	// Properties that are unique to TrackedDeviceClass_HMD
-	Prop_ReportsTimeSinceVSync_Bool			= 2000,
-	Prop_SecondsFromVsyncToPhotons_Float	= 2001,
-	Prop_DisplayFrequency_Float				= 2002,
-	Prop_UserIpdMeters_Float				= 2003,
-	Prop_CurrentUniverseId_Uint64			= 2004, 
-	Prop_PreviousUniverseId_Uint64			= 2005, 
-	Prop_DisplayFirmwareVersion_String		= 2006,
-
-	// Properties that are unique to TrackedDeviceClass_Controller
-	Prop_AttachedDeviceId_String			= 3000,
-	Prop_SupportedButtons_Uint64			= 3001,
-	Prop_Axis0Type_Int32					= 3002, // Return value is of type EVRControllerAxisType
-	Prop_Axis1Type_Int32					= 3003, // Return value is of type EVRControllerAxisType
-	Prop_Axis2Type_Int32					= 3004, // Return value is of type EVRControllerAxisType
-	Prop_Axis3Type_Int32					= 3005, // Return value is of type EVRControllerAxisType
-	Prop_Axis4Type_Int32					= 3006, // Return value is of type EVRControllerAxisType
-
-	// Properties that are unique to TrackedDeviceClass_TrackingReference
-	Prop_FieldOfViewLeftDegrees_Float		= 4000,
-	Prop_FieldOfViewRightDegrees_Float		= 4001,
-	Prop_FieldOfViewTopDegrees_Float		= 4002,
-	Prop_FieldOfViewBottomDegrees_Float		= 4003,
-	Prop_TrackingRangeMinimumMeters_Float	= 4004,
-	Prop_TrackingRangeMaximumMeters_Float	= 4005,
-};
-
-/** Used to pass device IDs to API calls */
-typedef uint32_t TrackedDeviceIndex_t;
-static const uint32_t k_unTrackedDeviceIndexInvalid = 0xFFFFFFFF;
-
-/** No string property will ever be longer than this length */
-static const uint32_t k_unMaxPropertyStringSize = 32 * 1024;
-
-/** Used to return errors that occur when reading properties. */
-enum TrackedPropertyError
-{
-	TrackedProp_Success						= 0,
-	TrackedProp_WrongDataType				= 1,
-	TrackedProp_WrongDeviceClass			= 2,
-	TrackedProp_BufferTooSmall				= 3,
-	TrackedProp_UnknownProperty				= 4,
-	TrackedProp_InvalidDevice				= 5,
-	TrackedProp_CouldNotContactServer		= 6,
-	TrackedProp_ValueNotProvidedByDevice	= 7,
-	TrackedProp_StringExceedsMaximumLength	= 8,
-};
-
-
-/** a single vertex in a render model */
-struct RenderModel_Vertex_t
-{
-	HmdVector3_t vPosition;		// position in meters in device space
-	HmdVector3_t vNormal;		
-	float rfTextureCoord[ 2 ];
-};
-
-/** A texture map for use on a render model */
-struct RenderModel_TextureMap_t
-{
-	uint16_t unWidth, unHeight; // width and height of the texture map in pixels
-	const uint8_t *rubTextureMapData;	// Map texture data. All textures are RGBA with 8 bits per channel per pixel. Data size is width * height * 4ub
-};
-
-/** Contains everything a game needs to render a single tracked or static object for the user. */
-struct RenderModel_t
-{
-	uint64_t ulInternalHandle;					// Used internally by SteamVR
-	const RenderModel_Vertex_t *rVertexData;			// Vertex data for the mesh
-	uint32_t unVertexCount;						// Number of vertices in the vertex data
-	const uint16_t *rIndexData;						// Indices into the vertex data for each triangle
-	uint32_t unTriangleCount;					// Number of triangles in the mesh. Index count is 3 * TriangleCount
-	RenderModel_TextureMap_t diffuseTexture;	// RGBA diffuse texture for the model
-};
-
-
-/** The types of events that could be posted (and what the parameters mean for each event type) */
-enum EVREventType
-{
-	VREvent_None = 0,
-
-	VREvent_TrackedDeviceActivated		= 100,
-	VREvent_TrackedDeviceDeactivated	= 101,
-	VREvent_TrackedDeviceUpdated		= 102,
-
-	VREvent_ButtonPress					= 200, // data is controller
-	VREvent_ButtonUnpress				= 201, // data is controller
-	VREvent_ButtonTouch					= 202, // data is controller
-	VREvent_ButtonUntouch				= 203, // data is controller
-
-	VREvent_MouseMove					= 300, // data is mouse
-	VREvent_MouseButtonDown				= 301, // data is mouse
-	VREvent_MouseButtonUp				= 302, // data is mouse
-
-	VREvent_InputFocusCaptured			= 400, // data is process
-	VREvent_InputFocusReleased			= 401, // data is process
-};
-
-
-/** VR controller button and axis IDs */
-enum EVRButtonId
-{
-	k_EButton_System			= 0,
-	k_EButton_ApplicationMenu	= 1,
-	k_EButton_Grip				= 2,
-
-	k_EButton_Axis0				= 32,
-	k_EButton_Axis1				= 33,
-	k_EButton_Axis2				= 34,
-	k_EButton_Axis3				= 35,
-	k_EButton_Axis4				= 36,
-
-	// aliases for well known controllers
-	k_EButton_SteamVR_Touchpad	= k_EButton_Axis0,
-	k_EButton_SteamVR_Trigger	= k_EButton_Axis1,
-
-	k_EButton_Max				= 64
-};
-
-inline uint64_t ButtonMaskFromId( EVRButtonId id ) { return 1ull << id; }
-
-/** used for controller button events */
-struct VREvent_Controller_t
-{
-	EVRButtonId button;
-};
-
-
-/** used for simulated mouse events in overlay space */
-enum EVRMouseButton
-{
-	VRMouseButton_Left					= 0x0001,
-	VRMouseButton_Right					= 0x0002,
-	VRMouseButton_Middle				= 0x0004,
-};
-
-
-/** used for simulated mouse events in overlay space */
-struct VREvent_Mouse_t
-{
-	float x, y;
-	EVRMouseButton button;
-};
-
-
-/** Used for events about processes */
-struct VREvent_Process_t
-{
-	uint32_t pid;
-	uint32_t oldPid;
-};
-
-
-/** Not actually used for any events. It is just used to reserve
-* space in the union for future event types */
-struct VREvent_Reserved_t
-{
-	uint64_t reserved0;
-	uint64_t reserved1;
-};
-
-/** If you change this you must manually update openvr_interop.cs.py */
-typedef union
-{
-	VREvent_Reserved_t reserved;
-	VREvent_Controller_t controller;
-	VREvent_Mouse_t mouse;
-	VREvent_Process_t process;
-} VREvent_Data_t;
-
-/** An event posted by the server to all running applications */
-struct VREvent_t
-{
-	EVREventType eventType;
-	TrackedDeviceIndex_t trackedDeviceIndex;
-	VREvent_Data_t data;
-	float eventAgeSeconds;
-};
-
-
-/** The mesh to draw into the stencil (or depth) buffer to perform 
-* early stencil (or depth) kills of pixels that will never appear on the HMD.
-* This mesh draws on all the pixels that will be hidden after distortion. 
-*
-* If the HMD does not provide a visible area mesh pVertexData will be
-* NULL and unTriangleCount will be 0. */
-struct HiddenAreaMesh_t
-{
-	const HmdVector2_t *pVertexData;
-	uint32_t unTriangleCount;
-};
-
-
-/** Identifies what kind of axis is on the controller at index n. Read this type 
-* with pVRSystem->Get( nControllerDeviceIndex, Prop_Axis0Type_Int32 + n );
-*/
-enum EVRControllerAxisType
-{
-	k_eControllerAxis_None = 0,
-	k_eControllerAxis_TrackPad = 1,
-	k_eControllerAxis_Joystick = 2,
-	k_eControllerAxis_Trigger = 3, // Analog trigger data is in the X axis
-};
-
-
-/** contains information about one axis on the controller */
-struct VRControllerAxis_t
-{
-	float x; // Ranges from -1.0 to 1.0 for joysticks and track pads. Ranges from 0.0 to 1.0 for triggers were 0 is fully released.
-	float y; // Ranges from -1.0 to 1.0 for joysticks and track pads. Is always 0.0 for triggers.
-};
-
-
-/** the number of axes in the controller state */
-static const uint32_t k_unControllerStateAxisCount = 5;
-
-
-/** Holds all the state of a controller at one moment in time. */
-struct VRControllerState001_t
-{
-	// If packet num matches that on your prior call, then the controller state hasn't been changed since 
-	// your last call and there is no need to process it
-	uint32_t unPacketNum;
-
-	// bit flags for each of the buttons. Use ButtonMaskFromId to turn an ID into a mask
-	uint64_t ulButtonPressed;
-	uint64_t ulButtonTouched;
-
-	// Axis data for the controller's analog inputs
-	VRControllerAxis_t rAxis[ k_unControllerStateAxisCount ];
-};
-
-
-typedef VRControllerState001_t VRControllerState_t;
-
-
-/** determines how to provide output to the application of various event processing functions. */
-enum EVRControllerEventOutputType
-{
-	ControllerEventOutput_OSEvents = 0,
-	ControllerEventOutput_VREvents = 1,
-};
-
-
-/** Allows the application to customize how the overlay appears in the compositor */
-struct Compositor_OverlaySettings
-{
-	uint32_t size; // sizeof(Compositor_OverlaySettings)
-	bool curved, antialias;
-	float scale, distance, alpha;
-	float uOffset, vOffset, uScale, vScale;
-	float gridDivs, gridWidth, gridScale;
-	HmdMatrix44_t transform;
-};
-
-
-/** error codes returned by Vr_Init */
-enum HmdError
-{
-	HmdError_None = 0,
-	HmdError_Unknown = 1,
-
-	HmdError_Init_InstallationNotFound	= 100,
-	HmdError_Init_InstallationCorrupt	= 101,
-	HmdError_Init_VRClientDLLNotFound	= 102,
-	HmdError_Init_FileNotFound			= 103,
-	HmdError_Init_FactoryNotFound		= 104,
-	HmdError_Init_InterfaceNotFound		= 105,
-	HmdError_Init_InvalidInterface		= 106,
-	HmdError_Init_UserConfigDirectoryInvalid = 107,
-	HmdError_Init_HmdNotFound			= 108,
-	HmdError_Init_NotInitialized		= 109,
-	HmdError_Init_PathRegistryNotFound	= 110,
-	HmdError_Init_NoConfigPath			= 111,
-	HmdError_Init_NoLogPath				= 112,
-	HmdError_Init_PathRegistryNotWritable = 113,
-
-	HmdError_Driver_Failed				= 200,
-	HmdError_Driver_Unknown				= 201,
-	HmdError_Driver_HmdUnknown			= 202,
-	HmdError_Driver_NotLoaded			= 203,
-	HmdError_Driver_RuntimeOutOfDate	= 204,
-	HmdError_Driver_HmdInUse			= 205,
-
-	HmdError_IPC_ServerInitFailed		= 300,
-	HmdError_IPC_ConnectFailed			= 301,
-	HmdError_IPC_SharedStateInitFailed	= 302,
-	HmdError_IPC_CompositorInitFailed	= 303,
-	HmdError_IPC_MutexInitFailed		= 304,
-
-	HmdError_VendorSpecific_UnableToConnectToOculusRuntime = 1000,
-
-	HmdError_Steam_SteamInstallationNotFound = 2000,
-
-};
-
-#pragma pack( pop )
-
-}
-
-// vrannotation.h
-#ifdef __clang__
-# define VR_CLANG_ATTR(ATTR) __attribute__((annotate( ATTR )))
-#else
-# define VR_CLANG_ATTR(ATTR)
-#endif
-
-#define VR_METHOD_DESC(DESC) VR_CLANG_ATTR( "desc:" #DESC ";" )
-#define VR_IGNOREATTR() VR_CLANG_ATTR( "ignore" )
-#define VR_OUT_STRUCT() VR_CLANG_ATTR( "out_struct: ;" )
-#define VR_OUT_STRING() VR_CLANG_ATTR( "out_string: ;" )
-#define VR_OUT_ARRAY_CALL(COUNTER,FUNCTION,PARAMS) VR_CLANG_ATTR( "out_array_call:" #COUNTER "," #FUNCTION "," #PARAMS ";" )
-#define VR_OUT_ARRAY_COUNT(COUNTER) VR_CLANG_ATTR( "out_array_count:" #COUNTER ";" )
-#define VR_ARRAY_COUNT(COUNTER) VR_CLANG_ATTR( "array_count:" #COUNTER ";" )
-#define VR_ARRAY_COUNT_D(COUNTER, DESC) VR_CLANG_ATTR( "array_count:" #COUNTER ";desc:" #DESC )
-#define VR_BUFFER_COUNT(COUNTER) VR_CLANG_ATTR( "buffer_count:" #COUNTER ";" )
-#define VR_OUT_BUFFER_COUNT(COUNTER) VR_CLANG_ATTR( "out_buffer_count:" #COUNTER ";" )
-#define VR_OUT_STRING_COUNT(COUNTER) VR_CLANG_ATTR( "out_string_count:" #COUNTER ";" )
-// ivrsystem.h
-namespace vr
-{
-
-class IVRSystem
-{
-public:
-
-
-	// ------------------------------------
-	// Display Methods
-	// ------------------------------------
-
-	/** Size and position that the window needs to be on the VR display. */
-	virtual void GetWindowBounds( int32_t *pnX, int32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0;
-
-	/** Suggested size for the intermediate render target that the distortion pulls from. */
-	virtual void GetRecommendedRenderTargetSize( uint32_t *pnWidth, uint32_t *pnHeight ) = 0;
-
-	/** Gets the viewport in the frame buffer to draw the output of the distortion into */
-	virtual void GetEyeOutputViewport( Hmd_Eye eEye, uint32_t *pnX, uint32_t *pnY, uint32_t *pnWidth, uint32_t *pnHeight ) = 0;
-	
-	/** The projection matrix for the specified eye */
-	virtual HmdMatrix44_t GetProjectionMatrix( Hmd_Eye eEye, float fNearZ, float fFarZ, GraphicsAPIConvention eProjType ) = 0;
-
-	/** The components necessary to build your own projection matrix in case your
-	* application is doing something fancy like infinite Z */
-	virtual void GetProjectionRaw( Hmd_Eye eEye, float *pfLeft, float *pfRight, float *pfTop, float *pfBottom ) = 0;
-
-	/** Returns the result of the distortion function for the specified eye and input UVs. UVs go from 0,0 in 
-	* the upper left of that eye's viewport and 1,1 in the lower right of that eye's viewport. */
-	virtual DistortionCoordinates_t ComputeDistortion( Hmd_Eye eEye, float fU, float fV ) = 0;
-
-	/** Returns the transform from eye space to the head space. Eye space is the per-eye flavor of head
-	* space that provides stereo disparity. Instead of Model * View * Projection the sequence is Model * View * Eye^-1 * Projection. 
-	* Normally View and Eye^-1 will be multiplied together and treated as View in your application. 
-	*/
-	virtual HmdMatrix34_t GetEyeToHeadTransform( Hmd_Eye eEye ) = 0;
-
-	/** Returns the number of elapsed seconds since the last recorded vsync event. This 
-	*	will come from a vsync timer event in the timer if possible or from the application-reported
-	*   time if that is not available. If no vsync times are available the function will 
-	*   return zero for vsync time and frame counter and return false from the method. */
-	virtual bool GetTimeSinceLastVsync( float *pfSecondsSinceLastVsync, uint64_t *pulFrameCounter ) = 0;
-
-	/** [D3D9 Only]
-	* Returns the adapter index that the user should pass into CreateDevice to set up D3D9 in such
-	* a way that it can go full screen exclusive on the HMD. Returns -1 if there was an error.
-	*/
-	virtual int32_t GetD3D9AdapterIndex() = 0;
-
-	/** [D3D10/11 Only]
-	* Returns the adapter index and output index that the user should pass into EnumAdapters and EnumOutputs 
-	* to create the device and swap chain in DX10 and DX11. If an error occurs both indices will be set to -1.
-	*/
-	virtual void GetDXGIOutputInfo( int32_t *pnAdapterIndex, int32_t *pnAdapterOutputIndex ) = 0;
-
-	/** [Windows Only]
-	* Notifies the system that the VR output will appear in a particular window.
-	*/
-	virtual bool AttachToWindow( void *hWnd ) = 0;
-
-	// ------------------------------------
-	// Tracking Methods
-	// ------------------------------------
-
-	/** The pose that the tracker thinks that the HMD will be in at the specified number of seconds into the 
-	* future. Pass 0 to get the state at the instant the method is called. Most of the time the application should
-	* calculate the time until the photons will be emitted from the display and pass that time into the method.
-	*
-	* This is roughly analogous to the inverse of the view matrix in most applications, though 
-	* many games will need to do some additional rotation or translation on top of the rotation
-	* and translation provided by the head pose.
-	*
-	* For devices where bPoseIsValid is true the application can use the pose to position the device
-	* in question. The provided array can be any size up to k_unMaxTrackedDeviceCount. 
-	*
-	* Seated experiences should call this method with TrackingUniverseSeated and receive poses relative
-	* to the seated zero pose. Standing experiences should call this method with TrackingUniverseStanding 
-	* and receive poses relative to the chaperone soft bounds. TrackingUniverseRawAndUncalibrated should 
-	* probably not be used unless the application is the chaperone calibration tool itself, but will provide
-	* poses relative to the hardware-specific coordinate system in the driver.
-	*/
-	virtual void GetDeviceToAbsoluteTrackingPose( TrackingUniverseOrigin eOrigin, float fPredictedSecondsToPhotonsFromNow, VR_ARRAY_COUNT(unTrackedDevicePoseArrayCount) TrackedDevicePose_t *pTrackedDevicePoseArray, uint32_t unTrackedDevicePoseArrayCount ) = 0;
-
-	/** Sets the zero pose for the seated tracker coordinate system to the current position and yaw of the HMD. After 
-	* ResetSeatedZeroPose all GetDeviceToAbsoluteTrackingPose calls that pass TrackingUniverseSeated as the origin 
-	* will be relative to this new zero pose. The new zero coordinate system will not change the fact that the Y axis 
-	* is up in the real world, so the next pose returned from GetDeviceToAbsoluteTrackingPose after a call to 
-	* ResetSeatedZeroPose may not be exactly an identity matrix. */
-	virtual void ResetSeatedZeroPose() = 0;
-
-	/** Returns the transform from the seated zero pose to the standing absolute tracking system. This allows 
-	* applications to represent the seated origin to used or transform object positions from one coordinate
-	* system to the other. 
-	*
-	* The seated origin may or may not be inside the soft or hard bounds returned by IVRChaperone. Its position 
-	* depends on what the user has set in the chaperone calibration tool and previous calls to ResetSeatedZeroPose. */
-	virtual HmdMatrix34_t GetSeatedZeroPoseToStandingAbsoluteTrackingPose() = 0;
-
-	// ------------------------------------
-	// RenderModel methods
-	// ------------------------------------
-
-	/** Loads and returns a render model for use in the application. pchRenderModelName should be a render model name
-	* from the Prop_RenderModelName_String property or an absolute path name to a render model on disk. 
-	*
-	* The resulting render model is valid until VR_Shutdown() is called or until FreeRenderModel() is called. When the 
-	* application is finished with the render model it should call FreeRenderModel() to free the memory associated
-	* with the model.
-	*
-	* The method returns false if the model could not be loaded.
-	*
-	* The API expects that this function will be called at startup or when tracked devices are connected and disconnected.
-	* If it is called every frame it will hurt performance.
-	*/
-	virtual bool LoadRenderModel( const char *pchRenderModelName, RenderModel_t *pRenderModel ) = 0;
-
-
-	/** Frees a previously returned render model */
-	virtual void FreeRenderModel( RenderModel_t *pRenderModel ) = 0;
-
-	// ------------------------------------
-	// Property methods
-	// ------------------------------------
-
-	/** Returns the device class of a tracked device. If there has not been a device connected in this slot
-	* since the application started this function will return TrackedDevice_Invalid. For previous detected
-	* devices the function will return the previously observed device class. 
-	*
-	* To determine which devices exist on the system, just loop from 0 to k_unMaxTrackedDeviceCount and check
-	* the device class. Every device with something other than TrackedDevice_Invalid is associated with an 
-	* actual tracked device. */
-	virtual TrackedDeviceClass GetTrackedDeviceClass( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0;
-
-	/** Returns true if there is a device connected in this slot. */
-	virtual bool IsTrackedDeviceConnected( vr::TrackedDeviceIndex_t unDeviceIndex ) = 0;
-
-	/** Returns a bool property. If the device index is not valid or the property is not a bool type this function will return false. */
-	virtual bool GetBoolTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, TrackedDeviceProperty prop, TrackedPropertyError *pError = 0L ) = 0;
-
-	/** Returns a float property. If the device index is not valid or the property is not a float type this function will return 0. */
-	virtual float GetFloatTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, TrackedDeviceProperty prop, TrackedPropertyError *pError = 0L ) = 0;
-
-	/** Returns an int property. If the device index is not valid or the property is not a int type this function will return 0. */
-	virtual int32_t GetInt32TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, TrackedDeviceProperty prop, TrackedPropertyError *pError = 0L ) = 0;
-
-	/** Returns a uint64 property. If the device index is not valid or the property is not a uint64 type this function will return 0. */
-	virtual uint64_t GetUint64TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, TrackedDeviceProperty prop, TrackedPropertyError *pError = 0L ) = 0;
-
-	/** Returns a matrix property. If the device index is not valid or the property is not a matrix type, this function will return identity. */
-	virtual HmdMatrix34_t GetMatrix34TrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, TrackedDeviceProperty prop, TrackedPropertyError *pError = 0L ) = 0;
-
-	/** Returns a string property. If the device index is not valid or the property is not a float type this function will 
-	* return 0. Otherwise it returns the length of the number of bytes necessary to hold this string including the trailing
-	* null. Strings will generally fit in buffers of k_unTrackingStringSize characters. */
-	virtual uint32_t GetStringTrackedDeviceProperty( vr::TrackedDeviceIndex_t unDeviceIndex, TrackedDeviceProperty prop, VR_OUT_STRING() char *pchValue, uint32_t unBufferSize, TrackedPropertyError *pError = 0L ) = 0;
-
-	/** returns a string that corresponds with the specified property error. The string will be the name 
-	* of the error enum value for all valid error codes */
-	virtual const char *GetPropErrorNameFromEnum( TrackedPropertyError error ) = 0;
-
-	// ------------------------------------
-	// Event methods
-	// ------------------------------------
-
-	/** Returns true and fills the event with the next event on the queue if there is one. If there are no events
-	* this method returns false */
-	virtual bool PollNextEvent( VREvent_t *pEvent ) = 0;
-
-	/** Returns true and fills the event with the next event on the queue if there is one. If there are no events
-	* this method returns false. Fills in the pose of the associated tracked device in the provided pose struct. 
-	* This pose will always be older than the call to this function and should not be used to render the device. */
-	virtual bool PollNextEventWithPose( TrackingUniverseOrigin eOrigin, vr::VREvent_t *pEvent, vr::TrackedDevicePose_t *pTrackedDevicePose ) = 0;
-
-	/** returns the name of an EVREvent enum value */
-	virtual const char *GetEventTypeNameFromEnum( EVREventType eType ) = 0;
-
-	// ------------------------------------
-	// Rendering helper methods
-	// ------------------------------------
-
-	/** Returns the stencil mesh information for the current HMD. If this HMD does not have a stencil mesh the vertex data and count will be
-	* NULL and 0 respectively. This mesh is meant to be rendered into the stencil buffer (or into the depth buffer setting nearz) before rendering
-	* each eye's view. The pixels covered by this mesh will never be seen by the user after the lens distortion is applied and based on visibility to the panels.
-	* This will improve perf by letting the GPU early-reject pixels the user will never see before running the pixel shader.
-	* NOTE: Render this mesh with backface culling disabled since the winding order of the vertices can be different per-HMD or per-eye.
-	*/
-	virtual HiddenAreaMesh_t GetHiddenAreaMesh( Hmd_Eye eEye ) = 0;
-
-
-	// ------------------------------------
-	// Controller methods
-	// ------------------------------------
-
-	/** Fills the supplied struct with the current state of the controller. Returns false if the controller index
-	* is invalid. */
-	virtual bool GetControllerState( vr::TrackedDeviceIndex_t unControllerDeviceIndex, vr::VRControllerState_t *pControllerState ) = 0;
-
-	/** fills the supplied struct with the current state of the controller and the provided pose with the pose of 
-	* the controller when the controller state was updated most recently. Use this form if you need a precise controller
-	* pose as input to your application when the user presses or releases a button. */
-	virtual bool GetControllerStateWithPose( TrackingUniverseOrigin eOrigin, vr::TrackedDeviceIndex_t unControllerDeviceIndex, vr::VRControllerState_t *pControllerState, TrackedDevicePose_t *pTrackedDevicePose ) = 0;
-
-	/** Trigger a single haptic pulse on a controller. After this call the application may not trigger another haptic pulse on this controller
-	* and axis combination for 5ms. */
-	virtual void TriggerHapticPulse( vr::TrackedDeviceIndex_t unControllerDeviceIndex, uint32_t unAxisId, unsigned short usDurationMicroSec ) = 0;
-
-	/** returns the name of an EVRButtonId enum value */
-	virtual const char *GetButtonIdNameFromEnum( EVRButtonId eButtonId ) = 0;
-
-	/** returns the name of an EVRControllerAxisType enum value */
-	virtual const char *GetControllerAxisTypeNameFromEnum( EVRControllerAxisType eAxisType ) = 0;
-
-	/** Processes mouse input from the specified controller as though it were a mouse pointed at a compositor overlay with the
-	* specified settings. The controller is treated like a laser pointer on the -z axis. The point where the laser pointer would
-	* intersect with the overlay is the mouse position, the trigger is left mouse, and the track pad is right mouse. When using 
-	* system event output the caller should ensure that it has focus so that it receives the system events. 
-	*
-	* Return true if the controller is pointed at the overlay and an event was generated. */
-	virtual bool HandleControllerOverlayInteractionAsMouse( const vr::Compositor_OverlaySettings & overlaySettings, 
-		vr::HmdVector2_t vecWindowClientPositionOnScreen, vr::HmdVector2_t vecWindowClientSize,
-		vr::TrackedDeviceIndex_t unControllerDeviceIndex, 
-		vr::EVRControllerEventOutputType eOutputType
-		) = 0;
-
-	/** Tells OpenVR that this process wants exclusive access to controller button states and button events. Other apps will be notified that 
-	* they have lost input focus with a VREvent_InputFocusCaptured event. Returns false if input focus could not be captured for
-	* some reason. */
-	virtual bool CaptureInputFocus() = 0;
-
-	/** Tells OpenVR that this process no longer wants exclusive access to button states and button events. Other apps will be notified 
-	* that input focus has been released with a VREvent_InputFocusReleased event. */
-	virtual void ReleaseInputFocus() = 0;
-
-	/** Returns true if input focus is captured by another process. */
-	virtual bool IsInputFocusCapturedByAnotherProcess() = 0;
-};
-
-static const char * const IVRSystem_Version = "IVRSystem_003";
-
-}
-
-// ivrchaperone.h
-namespace vr
-{
-
-#if defined(__linux__) || defined(__APPLE__) 
-	// The 32-bit version of gcc has the alignment requirement for uint64 and double set to
-	// 4 meaning that even with #pragma pack(8) these types will only be four-byte aligned.
-	// The 64-bit version of gcc has the alignment requirement for these types set to
-	// 8 meaning that unless we use #pragma pack(4) our structures will get bigger.
-	// The 64-bit structure packing has to match the 32-bit structure packing for each platform.
-	#pragma pack( push, 4 )
-#else
-	#pragma pack( push, 8 )
-#endif
-
-enum ChaperoneCalibrationState
-{
-	// OK!
-	ChaperoneCalibrationState_OK = 1,									// Chaperone is fully calibrated and working correctly
-
-	// Warnings
-	ChaperoneCalibrationState_Warning = 100,
-	ChaperoneCalibrationState_Warning_BaseStationMayHaveMoved = 101,	// A base station thinks that it might have moved
-	ChaperoneCalibrationState_Warning_BaseStationRemoved = 102,			// There are less base stations than when calibrated
-	ChaperoneCalibrationState_Warning_SeatedBoundsInvalid = 103,		// Seated bounds haven't been calibrated for the current tracking center
-
-	// Errors
-	ChaperoneCalibrationState_Error = 200,
-	ChaperoneCalibrationState_Error_BaseStationUninitalized = 201,		// Tracking center hasn't be calibrated for at least one of the base stations
-	ChaperoneCalibrationState_Error_BaseStationConflict = 202,			// Tracking center is calibrated, but base stations disagree on the tracking space
-	ChaperoneCalibrationState_Error_SoftBoundsInvalid = 203,			// Soft bounds haven't been calibrated for the current tracking center
-	ChaperoneCalibrationState_Error_HardBoundsInvalid = 204,			// Hard bounds haven't been calibrated for the current tracking center
-};
-
-/** SOFT BOUNDS ASSUMPTIONS
-* Corners are in clockwise order.
-* Tracking space center (0,0,0) is contained within the Soft Bounds.
-* Angles of corners are between 25 and 155 degrees. 
-* Quadrilateral formed is convex. 
-* One side will run parallel to the X axis. 
-* Height of every corner is 0Y (on the floor). */
-struct ChaperoneSoftBoundsInfo_t
-{
-	HmdQuad_t quadCorners;
-};
-
-struct ChaperoneSeatedBoundsInfo_t
-{
-	HmdVector3_t vSeatedHeadPosition;
-	HmdVector3_t vDeskEdgePositions[ 2 ];
-};
-
-/** HIGH LEVEL TRACKING SPACE ASSUMPTIONS:
-* 0,0,0 is the preferred standing area center.
-* 0Y is the floor height.
-* -Z is the preferred forward facing direction. */
-class IVRChaperone
-{
-public:
-
-	/** Get the current state of Chaperone calibration. This state can change at any time during a session due to physical base station changes. */
-	virtual ChaperoneCalibrationState GetCalibrationState() = 0;
-
-	/** Returns the 4 corner positions of the Soft Bounds (also know as Safe Zone and Play Space). */
-	virtual bool GetSoftBoundsInfo( ChaperoneSoftBoundsInfo_t *pInfo ) = 0;
-
-	/** Returns the quads representing the Hard Bounds (static physical obstacles). */
-	virtual bool GetHardBoundsInfo( VR_OUT_ARRAY_COUNT(punQuadsCount) HmdQuad_t *pQuadsBuffer, uint32_t* punQuadsCount ) = 0;
-
-	/** Returns the preferred seated position and front edge of their desk. */
-	virtual bool GetSeatedBoundsInfo( ChaperoneSeatedBoundsInfo_t *pInfo ) = 0;
-
-};
-
-static const char * const IVRChaperone_Version = "IVRChaperone_002";
-
-#pragma pack( pop )
-
-}
-// ivrcompositor.h
-namespace vr
-{
-
-#if defined(__linux__) || defined(__APPLE__) 
-	// The 32-bit version of gcc has the alignment requirement for uint64 and double set to
-	// 4 meaning that even with #pragma pack(8) these types will only be four-byte aligned.
-	// The 64-bit version of gcc has the alignment requirement for these types set to
-	// 8 meaning that unless we use #pragma pack(4) our structures will get bigger.
-	// The 64-bit structure packing has to match the 32-bit structure packing for each platform.
-	#pragma pack( push, 4 )
-#else
-	#pragma pack( push, 8 )
-#endif
-
-/** Identifies the graphics API for the associated device */
-enum Compositor_DeviceType
-{
-	Compositor_DeviceType_None,
-	Compositor_DeviceType_D3D9,
-	Compositor_DeviceType_D3D9Ex,
-	Compositor_DeviceType_D3D10,
-	Compositor_DeviceType_D3D11,
-	Compositor_DeviceType_OpenGL
-};
-
-
-/** Provides a single frame's timing information to the app */
-struct Compositor_FrameTiming
-{
-	uint32_t size; // sizeof(Compositor_FrameTiming)
-	double frameStart;
-	float frameVSync; // seconds from frame start
-	uint32_t droppedFrames;
-	uint32_t frameIndex;
-	vr::TrackedDevicePose_t pose;
-};
-
-
-/** Allows the application to control what part of the provided texture will be used in the
-* frame buffer. */
-struct Compositor_TextureBounds
-{
-	float uMin, vMin;
-	float uMax, vMax;
-};
-
-#pragma pack( pop )
-
-
-/** Allows the application to interact with the compositor */
-class IVRCompositor
-{
-public:
-	/** Returns the last error that occurred in the compositor */
-	virtual uint32_t GetLastError( VR_OUT_STRING() char* pchBuffer, uint32_t unBufferSize ) = 0;
-
-	/** Turns vsync on or off on the compositor window */
-	virtual void SetVSync( bool bVSync ) = 0;
-
-	/** Returns true if vsync is enabled in the compositor window */
-	virtual bool GetVSync() = 0;
-
-	/** Sets gamma for the compositor window */
-	virtual void SetGamma( float fGamma ) = 0;
-
-	/** Returns the gamma for the compositor window */
-	virtual float GetGamma() = 0;
-
-	/** Sets the graphics device or context for the application that is going to feed 
-	* images to the compositor. The type of the pDevice parameter must match the 
-	* type that is provided:
-	*	Compositor_DeviceType_D3D9		IDirect3DDevice9*
-	*	Compositor_DeviceType_D3D9Ex	IDirect3DDevice9Ex*
-	*	Compositor_DeviceType_D3D10		ID3D10Device*
-	*	Compositor_DeviceType_D3D11		ID3D11Device*
-	*	Compositor_DeviceType_OpenGL	HGLRC
-	*
-	* Note: D3D9 and D3D9Ex are not implemented at this time
-	*/
-	virtual void SetGraphicsDevice( Compositor_DeviceType eType, void* pDevice ) = 0;
-
-	/** Returns pose(s) to use to render scene. */
-	virtual void WaitGetPoses( VR_ARRAY_COUNT(unPoseArrayCount) TrackedDevicePose_t* pPoseArray, uint32_t unPoseArrayCount ) = 0;
-
-	/** Updated scene texture to display. If pBounds is NULL the entire texture will be used.
-	*
-	* OpenGL dirty state:
-	*	glBindTexture
-	*/
-	virtual void Submit( Hmd_Eye eEye, void* pTexture, Compositor_TextureBounds* pBounds ) = 0;
-
-	/** Clears the frame that was sent with the last call to Submit. This will cause the 
-	* compositor to show the grid until Submit is called again. */
-	virtual void ClearLastSubmittedFrame() = 0;
-
-	/** returns the default settings that will be used for the overlay texture. Fetching these defaults 
-	* can be useful if you mostly want the default values but want to change a few settings. */
-	virtual void GetOverlayDefaults( Compositor_OverlaySettings* pSettings ) = 0;
-
-	/** Texture to draw over the scene at distortion time. This texture will appear over the world on a quad.
-	* The pSettings parameter controls the size and position of the quad. */
-	virtual void SetOverlay(void* pTexture, Compositor_OverlaySettings* pSettings ) = 0;
-
-	/** Separate interface for providing the data as a stream of bytes, but there is an upper bound on data that can be sent */
-	virtual void SetOverlayRaw(void* buffer, uint32_t width, uint32_t height, uint32_t depth, Compositor_OverlaySettings* pSettings ) = 0;
-
-	/** Separate interface for providing the image through a filename: 
-	* can be png or jpg, and should not be bigger than 1920x1080 */
-	virtual void SetOverlayFromFile( const char *pchFilePath, Compositor_OverlaySettings* pSettings ) = 0;
-
-	/** Removes the scene overlay texture. */
-	virtual void ClearOverlay() = 0;
-
-	/** Returns true if timing data is filled it.  Sets oldest timing info if nFramesAgo is larger than the stored history.
-	* Be sure to set timing.size = sizeof(Compositor_FrameTiming) on struct passed in before calling this function. */
-	virtual bool GetFrameTiming( Compositor_FrameTiming *pTiming, uint32_t unFramesAgo = 0 ) = 0;
-
-	/** Fades the view on the HMD to the specified color. The fade will take fSeconds, and the color values are between 
-	* 0.0 and 1.0. This color is faded on top of the scene based on the alpha parameter. Removing the fade color instantly 
-	* would be FadeToColor( 0.0, 0.0, 0.0, 0.0, 0.0 ). */
-	virtual void FadeToColor( float fSeconds, float fRed, float fGreen, float fBlue, float fAlpha, bool bBackground = false ) = 0;
-
-	/** Fading the Grid in or out in fSeconds */
-	virtual void FadeGrid( float fSeconds, bool bFadeIn ) = 0;
-
-	/** Brings the compositor window to the front. This is useful for covering any other window that may be on the HMD 
-	* and is obscuring the compositor window. */
-	virtual void CompositorBringToFront() = 0;
-
-	/** Pushes the compositor window to the back. This is useful for allowing other applications to draw directly to the HMD. */
-	virtual void CompositorGoToBack() = 0;
-
-	/** Tells the compositor process to clean up and exit. You do not need to call this function at shutdown. Under normal 
-	* circumstances the compositor will manage its own life cycle based on what applications are running. */
-	virtual void CompositorQuit() = 0;
-	
-	/** Return whether the compositor is fullscreen */
-	virtual bool IsFullscreen() = 0;
-
-	/** Computes the overlay-space pixel coordinates of where the ray intersects the overlay with the
-	* specified settings. Returns false if there is no intersection. */
-	virtual bool ComputeOverlayIntersection( const Compositor_OverlaySettings* pSettings, float fAspectRatio, vr::TrackingUniverseOrigin eOrigin, vr::HmdVector3_t vSource, vr::HmdVector3_t vDirection, vr::HmdVector2_t *pvecIntersectionUV, vr::HmdVector3_t *pvecIntersectionTrackingSpace ) = 0;
-
-	/** Sets tracking space returned by WaitGetPoses */
-	virtual void SetTrackingSpace( TrackingUniverseOrigin eOrigin ) = 0;
-
-	/** Gets current tracking space returned by WaitGetPoses */
-	virtual TrackingUniverseOrigin GetTrackingSpace() = 0;
-};
-
-static const char * const IVRCompositor_Version = "IVRCompositor_005";
-
-} // namespace vr
-
-
-// ivrcontrolpanel.h
-namespace vr
-{
-
-class IVRControlPanel
-{
-public:
-
-	// ------------------------------------
-	// Driver enumeration methods
-	// ------------------------------------
-
-	/** the number of active drivers */
-	virtual uint32_t GetDriverCount() = 0;
-
-	/** The ID of the specified driver as a UTF-8 string. Returns the length of the ID in bytes. If 
-	* the buffer is not large enough to fit the ID an empty string will be returned. In general, 128 bytes
-	* will be enough to fit any ID. */
-	virtual uint32_t GetDriverId( uint32_t unDriverIndex, char *pchBuffer, uint32_t unBufferLen ) = 0;
-
-	// ------------------------------------
-	// Display Enumeration Methods
-	// ------------------------------------
-
-	/** the number of active displays on the specified driver */
-	virtual uint32_t GetDriverDisplayCount( const char *pchDriverId ) = 0;
-
-	/** The ID of the specified display in the specified driver as a UTF-8 string. Returns the 
-	* length of the ID in bytes. If the buffer is not large enough to fit the ID an empty
-	* string will be returned. In general, 128 bytes will be enough to fit any ID. */
-	virtual uint32_t GetDriverDisplayId( const char *pchDriverId, uint32_t unDisplayIndex, char *pchBuffer, uint32_t unBufferLen ) = 0;
-
-	// ------------------------------------
-	// Display Detail Methods
-	// ------------------------------------
-
-	/** The model name of the specified driver in the specified driver as a UTF-8 string. Returns the 
-	* length of the model name in bytes. If the buffer is not large enough to fit the model name an empty
-	* string will be returned. In general, 128 bytes will be enough to fit any model name. Returns 0 if
-	* the display or driver was not found. */
-	virtual uint32_t GetDriverDisplayModelNumber( const char *pchDriverId, const char *pchDisplayId, char *pchBuffer, uint32_t unBufferLen ) = 0;
-
-	/** The serial number of the specified driver in the specified driver as a UTF-8 string. Returns the 
-	* length of the serial number in bytes. If the buffer is not large enough to fit the serial number an empty
-	* string will be returned. In general, 128 bytes will be enough to fit any model name. Returns 0 if
-	* the display or driver was not found. */
-	virtual uint32_t GetDriverDisplaySerialNumber( const char *pchDriverId, const char *pchDisplayId, char *pchBuffer, uint32_t unBufferLen ) = 0;
-
-	/** Returns the IVRSystem interface for the current display that matches the specified version number. 
-	* This is usually unnecessary and the return value of VR_Init can be used without calling this method. */
-	VR_IGNOREATTR()
-	virtual class IVRSystem *GetCurrentDisplayInterface( const char *pchHmdInterfaceVersion ) = 0;
-
-	// ------------------------------------
-	// Shared Resource Methods
-	// ------------------------------------
-
-	/** Loads the specified resource into the provided buffer if large enough.
-	* Returns the size in bytes of the buffer required to hold the specified resource. */
-	virtual uint32_t LoadSharedResource( const char *pchResourceName, char *pchBuffer, uint32_t unBufferLen ) = 0;
-
-	// ------------------------------------
-	// IPD Methods
-	// ------------------------------------
-
-	/** Gets the current IPD (Interpupillary Distance) in meters. */
-	virtual float GetIPD() = 0;
-
-	/** Sets the current IPD (Interpupillary Distance) in meters. */
-	virtual void SetIPD( float fIPD ) = 0;
-
-	// ------------------------------------
-	// Compositor Methods
-	// ------------------------------------
-
-	/** Returns the IVRCompositor interface that matches the specified interface version.  This will only
-	* return the compositor interface if it has already been initialized by the current process. */
-	virtual class IVRCompositor *GetCurrentCompositorInterface( const char *pchInterfaceVersion ) = 0;
-};
-
-static const char * const IVRControlPanel_Version = "IVRControlPanel_001";
-
-}// End
-
-#endif // _OPENVR_API
-
-
-namespace vr
-{
-	// figure out how to import from the VR API dll
-#if defined(_WIN32)
-
-#ifdef VR_API_EXPORT
-#define VR_INTERFACE extern "C" __declspec( dllexport )
-#else
-#define VR_INTERFACE extern "C" __declspec( dllimport )
-#endif
-
-#elif defined(GNUC) || defined(COMPILER_GCC)
-
-#ifdef VR_API_EXPORT
-#define VR_INTERFACE extern "C" __attribute__((visibility("default")))
-#else
-#define VR_INTERFACE extern "C" 
-#endif
-
-#else
-#error "Unsupported Platform."
-#endif
-
-
-#if defined( _WIN32 )
-#define VR_CALLTYPE __cdecl
-#else
-#define VR_CALLTYPE 
-#endif
-
-	/** Finds the active installation of the VR API and initializes it. The provided path must be absolute 
-	* or relative to the current working directory. These are the local install versions of the equivalent
-	* functions in steamvr.h and will work without a local Steam install.
-	*
-	* This path is to the "root" of the VR API install. That's the directory with 
-	* the "drivers" directory and a platform (i.e. "win32") directory in it, not the directory with the DLL itself.
-	*/
-	VR_INTERFACE vr::IVRSystem *VR_CALLTYPE VR_Init( vr::HmdError *peError );
-
-	/** unloads vrclient.dll. Any interface pointers from the interface are 
-	* invalid after this point */
-	VR_INTERFACE void VR_CALLTYPE VR_Shutdown();
-
-	/** Returns true if there is an HMD attached. This check is as lightweight as possible and
-	* can be called outside of VR_Init/VR_Shutdown. It should be used when an application wants
-	* to know if initializing VR is a possibility but isn't ready to take that step yet.
-	*/
-	VR_INTERFACE bool VR_CALLTYPE VR_IsHmdPresent();
-
-	/** Returns the string version of an HMD error. This function may be called outside of VR_Init()/VR_Shutdown(). */
-	VR_INTERFACE const char *VR_CALLTYPE VR_GetStringForHmdError( vr::HmdError error );
-
-	/** Returns the interface of the specified version. This method must be called after VR_Init. The
-	* pointer returned is valid until VR_Shutdown is called.
-	*/
-	VR_INTERFACE void *VR_CALLTYPE VR_GetGenericInterface( const char *pchInterfaceVersion, vr::HmdError *peError );
-
-}
\ No newline at end of file
diff --git a/public/openvr/openvr_capi.h b/public/openvr/openvr_capi.h
deleted file mode 100644
index 4da0e779d..000000000
--- a/public/openvr/openvr_capi.h
+++ /dev/null
@@ -1,130 +0,0 @@
-//====== Copyright (c) 1996-2014, Valve Corporation, All rights reserved. =======
-//
-// Purpose: Header for flatted SteamAPI. Use this for binding to other languages.
-// This file is auto-generated, do not edit it.
-//
-//=============================================================================
-
-#ifndef __OPENVR_API_FLAT_H__
-#define __OPENVR_API_FLAT_H__
-#ifdef _WIN32
-#pragma once
-#endif
-
-// OPENVR API export macro
-#if defined( _WIN32 ) && !defined( _X360 )
-	#if defined( OPENVR_API_EXPORTS )
-	#define S_API extern "C" __declspec( dllexport ) 
-	#elif defined( OPENVR_API_NODLL )
-	#define S_API extern "C"
-	#else
-	#define S_API extern "C" __declspec( dllimport ) 
-	#endif // OPENVR_API_EXPORTS
-#elif defined( GNUC )
-	#if defined( OPENVR_API_EXPORTS )
-	#define S_API extern "C" __attribute__ ((visibility("default"))) 
-	#else
-	#define S_API extern "C" 
-	#endif // OPENVR_API_EXPORTS
-#else // !WIN32
-	#if defined( OPENVR_API_EXPORTS )
-	#define S_API extern "C"  
-	#else
-	#define S_API extern "C" 
-	#endif // OPENVR_API_EXPORTS
-#endif
-
-
-#include <stdint.h>
-#include "openvr.h"
-#include "ivrsystem.h"
-#include "ivrcameraaccess.h"
-#include "ivrchaperone.h"
-#include "ivrchaperonesetup.h"
-#include "ivrcompositor.h"
-
-
-S_API void VR_IVRSystem_GetWindowBounds(intptr_t instancePtr, int32_t * pnX, int32_t * pnY, uint32_t * pnWidth, uint32_t * pnHeight);
-S_API void VR_IVRSystem_GetRecommendedRenderTargetSize(intptr_t instancePtr, uint32_t * pnWidth, uint32_t * pnHeight);
-S_API void VR_IVRSystem_GetEyeOutputViewport(intptr_t instancePtr, vr::Hmd_Eye eEye, uint32_t * pnX, uint32_t * pnY, uint32_t * pnWidth, uint32_t * pnHeight);
-S_API struct vr::HmdMatrix44_t VR_IVRSystem_GetProjectionMatrix(intptr_t instancePtr, vr::Hmd_Eye eEye, float fNearZ, float fFarZ, vr::GraphicsAPIConvention eProjType);
-S_API void VR_IVRSystem_GetProjectionRaw(intptr_t instancePtr, vr::Hmd_Eye eEye, float * pfLeft, float * pfRight, float * pfTop, float * pfBottom);
-S_API struct vr::DistortionCoordinates_t VR_IVRSystem_ComputeDistortion(intptr_t instancePtr, vr::Hmd_Eye eEye, float fU, float fV);
-S_API struct vr::HmdMatrix34_t VR_IVRSystem_GetEyeToHeadTransform(intptr_t instancePtr, vr::Hmd_Eye eEye);
-S_API bool VR_IVRSystem_GetTimeSinceLastVsync(intptr_t instancePtr, float * pfSecondsSinceLastVsync, uint64_t * pulFrameCounter);
-S_API int32_t VR_IVRSystem_GetD3D9AdapterIndex(intptr_t instancePtr);
-S_API void VR_IVRSystem_GetDXGIOutputInfo(intptr_t instancePtr, int32_t * pnAdapterIndex, int32_t * pnAdapterOutputIndex);
-S_API bool VR_IVRSystem_AttachToWindow(intptr_t instancePtr, void * hWnd);
-S_API void VR_IVRSystem_GetDeviceToAbsoluteTrackingPose(intptr_t instancePtr, vr::TrackingUniverseOrigin eOrigin, float fPredictedSecondsToPhotonsFromNow, struct vr::TrackedDevicePose_t * pTrackedDevicePoseArray, uint32_t unTrackedDevicePoseArrayCount);
-S_API void VR_IVRSystem_ResetSeatedZeroPose(intptr_t instancePtr);
-S_API struct vr::HmdMatrix34_t VR_IVRSystem_GetSeatedZeroPoseToStandingAbsoluteTrackingPose(intptr_t instancePtr);
-S_API bool VR_IVRSystem_LoadRenderModel(intptr_t instancePtr, const char * pchRenderModelName, struct vr::RenderModel_t * pRenderModel);
-S_API void VR_IVRSystem_FreeRenderModel(intptr_t instancePtr, struct vr::RenderModel_t * pRenderModel);
-S_API vr::TrackedDeviceClass VR_IVRSystem_GetTrackedDeviceClass(intptr_t instancePtr, vr::TrackedDeviceIndex_t unDeviceIndex);
-S_API bool VR_IVRSystem_IsTrackedDeviceConnected(intptr_t instancePtr, vr::TrackedDeviceIndex_t unDeviceIndex);
-S_API bool VR_IVRSystem_GetBoolTrackedDeviceProperty(intptr_t instancePtr, vr::TrackedDeviceIndex_t unDeviceIndex, vr::TrackedDeviceProperty prop, vr::TrackedPropertyError * pError);
-S_API float VR_IVRSystem_GetFloatTrackedDeviceProperty(intptr_t instancePtr, vr::TrackedDeviceIndex_t unDeviceIndex, vr::TrackedDeviceProperty prop, vr::TrackedPropertyError * pError);
-S_API int32_t VR_IVRSystem_GetInt32TrackedDeviceProperty(intptr_t instancePtr, vr::TrackedDeviceIndex_t unDeviceIndex, vr::TrackedDeviceProperty prop, vr::TrackedPropertyError * pError);
-S_API uint64_t VR_IVRSystem_GetUint64TrackedDeviceProperty(intptr_t instancePtr, vr::TrackedDeviceIndex_t unDeviceIndex, vr::TrackedDeviceProperty prop, vr::TrackedPropertyError * pError);
-S_API struct vr::HmdMatrix34_t VR_IVRSystem_GetMatrix34TrackedDeviceProperty(intptr_t instancePtr, vr::TrackedDeviceIndex_t unDeviceIndex, vr::TrackedDeviceProperty prop, vr::TrackedPropertyError * pError);
-S_API uint32_t VR_IVRSystem_GetStringTrackedDeviceProperty(intptr_t instancePtr, vr::TrackedDeviceIndex_t unDeviceIndex, vr::TrackedDeviceProperty prop, char * pchValue, uint32_t unBufferSize, vr::TrackedPropertyError * pError);
-S_API const char * VR_IVRSystem_GetPropErrorNameFromEnum(intptr_t instancePtr, vr::TrackedPropertyError error);
-S_API bool VR_IVRSystem_PollNextEvent(intptr_t instancePtr, struct vr::VREvent_t * pEvent);
-S_API bool VR_IVRSystem_PollNextEventWithPose(intptr_t instancePtr, vr::TrackingUniverseOrigin eOrigin, vr::VREvent_t * pEvent, vr::TrackedDevicePose_t * pTrackedDevicePose);
-S_API const char * VR_IVRSystem_GetEventTypeNameFromEnum(intptr_t instancePtr, vr::EVREventType eType);
-S_API struct vr::HiddenAreaMesh_t VR_IVRSystem_GetHiddenAreaMesh(intptr_t instancePtr, vr::Hmd_Eye eEye);
-S_API bool VR_IVRSystem_GetControllerState(intptr_t instancePtr, vr::TrackedDeviceIndex_t unControllerDeviceIndex, vr::VRControllerState_t * pControllerState);
-S_API bool VR_IVRSystem_GetControllerStateWithPose(intptr_t instancePtr, vr::TrackingUniverseOrigin eOrigin, vr::TrackedDeviceIndex_t unControllerDeviceIndex, vr::VRControllerState_t * pControllerState, struct vr::TrackedDevicePose_t * pTrackedDevicePose);
-S_API void VR_IVRSystem_TriggerHapticPulse(intptr_t instancePtr, vr::TrackedDeviceIndex_t unControllerDeviceIndex, uint32_t unAxisId, unsigned short usDurationMicroSec);
-S_API const char * VR_IVRSystem_GetButtonIdNameFromEnum(intptr_t instancePtr, vr::EVRButtonId eButtonId);
-S_API const char * VR_IVRSystem_GetControllerAxisTypeNameFromEnum(intptr_t instancePtr, vr::EVRControllerAxisType eAxisType);
-S_API bool VR_IVRSystem_HandleControllerOverlayInteractionAsMouse(intptr_t instancePtr, const vr::Compositor_OverlaySettings & overlaySettings, vr::HmdVector2_t vecWindowClientPositionOnScreen, vr::HmdVector2_t vecWindowClientSize, vr::TrackedDeviceIndex_t unControllerDeviceIndex, vr::EVRControllerEventOutputType eOutputType);
-S_API bool VR_IVRSystem_CaptureInputFocus(intptr_t instancePtr);
-S_API void VR_IVRSystem_ReleaseInputFocus(intptr_t instancePtr);
-S_API bool VR_IVRSystem_IsInputFocusCapturedByAnotherProcess(intptr_t instancePtr);
-S_API uint32_t VR_IVRCameraAccess_GetCameraCount(intptr_t instancePtr);
-S_API uint32_t VR_IVRCameraAccess_GetCameraId(intptr_t instancePtr, uint32_t unCameraIndex, char * pchBuffer, uint32_t unBufferLen);
-S_API bool VR_IVRCameraAccess_EnableCamera(intptr_t instancePtr, uint32_t unCameraIndex, bool bEnabled);
-S_API bool VR_IVRCameraAccess_GetCameraInfo(intptr_t instancePtr, uint32_t unCameraIndex, struct vr::CameraInfo_t * pCameraInfo);
-S_API bool VR_IVRCameraAccess_GetCameraImage(intptr_t instancePtr, uint32_t unCameraIndex, struct vr::CameraImage_t * pCameraImage);
-S_API vr::ChaperoneCalibrationState VR_IVRChaperone_GetCalibrationState(intptr_t instancePtr);
-S_API bool VR_IVRChaperone_GetSoftBoundsInfo(intptr_t instancePtr, struct vr::ChaperoneSoftBoundsInfo_t * pInfo);
-S_API bool VR_IVRChaperone_GetHardBoundsInfo(intptr_t instancePtr, struct vr::HmdQuad_t * pQuadsBuffer, uint32_t * punQuadsCount);
-S_API bool VR_IVRChaperone_GetSeatedBoundsInfo(intptr_t instancePtr, struct vr::ChaperoneSeatedBoundsInfo_t * pInfo);
-S_API bool VR_IVRChaperoneSetup_CommitWorkingCopy(intptr_t instancePtr, const char * pchCalibrationName);
-S_API void VR_IVRChaperoneSetup_RevertWorkingCopy(intptr_t instancePtr);
-S_API bool VR_IVRChaperoneSetup_GetWorkingSoftBoundsInfo(intptr_t instancePtr, struct vr::ChaperoneSoftBoundsInfo_t * pInfo);
-S_API bool VR_IVRChaperoneSetup_GetWorkingHardBoundsInfo(intptr_t instancePtr, struct vr::HmdQuad_t * pQuadsBuffer, uint32_t * punQuadsCount);
-S_API bool VR_IVRChaperoneSetup_GetWorkingSeatedZeroPoseToRawTrackingPose(intptr_t instancePtr, struct vr::HmdMatrix34_t * pmatSeatedZeroPoseToRawTrackingPose);
-S_API bool VR_IVRChaperoneSetup_GetWorkingStandingZeroPoseToRawTrackingPose(intptr_t instancePtr, struct vr::HmdMatrix34_t * pmatStandingZeroPoseToRawTrackingPose);
-S_API void VR_IVRChaperoneSetup_SetWorkingSoftBoundsInfo(intptr_t instancePtr, const struct vr::ChaperoneSoftBoundsInfo_t * pInfo);
-S_API void VR_IVRChaperoneSetup_SetWorkingHardBoundsInfo(intptr_t instancePtr, struct vr::HmdQuad_t * pQuadsBuffer, uint32_t unQuadsCount);
-S_API void VR_IVRChaperoneSetup_SetWorkingSeatedZeroPoseToRawTrackingPose(intptr_t instancePtr, const struct vr::HmdMatrix34_t & matSeatedZeroPoseToRawTrackingPose);
-S_API void VR_IVRChaperoneSetup_SetWorkingStandingZeroPoseToRawTrackingPose(intptr_t instancePtr, const struct vr::HmdMatrix34_t & matStandingZeroPoseToRawTrackingPose);
-S_API uint32_t VR_IVRCompositor_GetLastError(intptr_t instancePtr, char * pchBuffer, uint32_t unBufferSize);
-S_API void VR_IVRCompositor_SetVSync(intptr_t instancePtr, bool bVSync);
-S_API bool VR_IVRCompositor_GetVSync(intptr_t instancePtr);
-S_API void VR_IVRCompositor_SetGamma(intptr_t instancePtr, float fGamma);
-S_API float VR_IVRCompositor_GetGamma(intptr_t instancePtr);
-S_API void VR_IVRCompositor_SetGraphicsDevice(intptr_t instancePtr, vr::Compositor_DeviceType eType, void * pDevice);
-S_API void VR_IVRCompositor_WaitGetPoses(intptr_t instancePtr, struct vr::TrackedDevicePose_t * pPoseArray, uint32_t unPoseArrayCount);
-S_API void VR_IVRCompositor_Submit(intptr_t instancePtr, vr::Hmd_Eye eEye, void * pTexture, struct vr::Compositor_TextureBounds * pBounds);
-S_API void VR_IVRCompositor_ClearLastSubmittedFrame(intptr_t instancePtr);
-S_API void VR_IVRCompositor_GetOverlayDefaults(intptr_t instancePtr, struct vr::Compositor_OverlaySettings * pSettings);
-S_API void VR_IVRCompositor_SetOverlay(intptr_t instancePtr, void * pTexture, struct vr::Compositor_OverlaySettings * pSettings);
-S_API void VR_IVRCompositor_SetOverlayRaw(intptr_t instancePtr, void * buffer, uint32_t width, uint32_t height, uint32_t depth, struct vr::Compositor_OverlaySettings * pSettings);
-S_API void VR_IVRCompositor_SetOverlayFromFile(intptr_t instancePtr, const char * pchFilePath, struct vr::Compositor_OverlaySettings * pSettings);
-S_API void VR_IVRCompositor_ClearOverlay(intptr_t instancePtr);
-S_API bool VR_IVRCompositor_GetFrameTiming(intptr_t instancePtr, struct vr::Compositor_FrameTiming * pTiming, uint32_t unFramesAgo);
-S_API void VR_IVRCompositor_FadeToColor(intptr_t instancePtr, float fSeconds, float fRed, float fGreen, float fBlue, float fAlpha, bool bBackground);
-S_API void VR_IVRCompositor_FadeGrid(intptr_t instancePtr, float fSeconds, bool bFadeIn);
-S_API void VR_IVRCompositor_CompositorBringToFront(intptr_t instancePtr);
-S_API void VR_IVRCompositor_CompositorGoToBack(intptr_t instancePtr);
-S_API void VR_IVRCompositor_CompositorQuit(intptr_t instancePtr);
-S_API bool VR_IVRCompositor_IsFullscreen(intptr_t instancePtr);
-S_API bool VR_IVRCompositor_ComputeOverlayIntersection(intptr_t instancePtr, const struct vr::Compositor_OverlaySettings * pSettings, float fAspectRatio, vr::TrackingUniverseOrigin eOrigin, vr::HmdVector3_t vSource, vr::HmdVector3_t vDirection, vr::HmdVector2_t * pvecIntersectionUV, vr::HmdVector3_t * pvecIntersectionTrackingSpace);
-S_API void VR_IVRCompositor_SetTrackingSpace(intptr_t instancePtr, vr::TrackingUniverseOrigin eOrigin);
-S_API vr::TrackingUniverseOrigin VR_IVRCompositor_GetTrackingSpace(intptr_t instancePtr);
-#endif // __OPENVR_API_FLAT_H__
-
-
diff --git a/sourcevr/sourcevirtualreality.cpp b/sourcevr/sourcevirtualreality.cpp
index de7180cc0..770205242 100644
--- a/sourcevr/sourcevirtualreality.cpp
+++ b/sourcevr/sourcevirtualreality.cpp
@@ -80,7 +80,7 @@ CSourceVirtualReality::CSourceVirtualReality()
 	m_textureGeneratorRight( vr::Eye_Right )
 {
 	m_bActive = false;
-	m_bUsingOffscreenRenderTarget = false;
+	m_bUsingOffscreenRenderTarget = true;
 	m_pHmd = NULL;
 }
 
@@ -207,7 +207,11 @@ void CDistortionTextureRegen::RegenerateTextureBits( ITexture *pTexture, IVTFTex
 			float u = ( (float)x + 0.5f) / fWidth;
 			float v = ( (float)y + 0.5f) / fHeight;
 
-			DistortionCoordinates_t coords = g_SourceVirtualReality.GetHmd()->ComputeDistortion( m_eEye, u, v );
+			DistortionCoordinates_t coords;
+			if(!g_SourceVirtualReality.GetHmd()->ComputeDistortion( m_eEye, u, v, &coords ))
+			{
+				Warning("ComputeDistortion failed");
+			}
 
 			coords.rfRed[0] = Clamp( coords.rfRed[0], 0.f, 1.f ) * fUScale + fUOffset;
 			coords.rfGreen[0] = Clamp( coords.rfGreen[0], 0.f, 1.f ) * fUScale + fUOffset;
@@ -277,9 +281,9 @@ bool CSourceVirtualReality::GetDisplayBounds( VRRect_t *pRect )
 {
 	if( m_pHmd )
 	{
-		int32_t x, y;
-		uint32_t width, height;
-		m_pHmd->GetWindowBounds( &x, &y, &width, &height );
+		int32_t x = 0, y = 0;
+		uint32_t width = 1024, height = 1024;
+		m_pExtDisplay->GetWindowBounds( &x, &y, &width, &height );
 		pRect->nX = x;
 		pRect->nY = y;
 		pRect->nWidth = width;
@@ -420,8 +424,9 @@ void CSourceVirtualReality::GetViewportBounds( VREye eEye, int *pnX, int *pnY, i
 	}
 	else
 	{
-		uint32_t x, y, w, h;
-		m_pHmd->GetEyeOutputViewport( SourceEyeToHmdEye( eEye ), &x, &y, &w, &h );
+		uint32_t x = 0, y = 0, w = 640, h = 480;
+//		m_pHmd->GetEyeOutputViewport( SourceEyeToHmdEye( eEye ), &x, &y, &w, &h );
+		m_pExtDisplay->GetEyeOutputViewport( SourceEyeToHmdEye( eEye ), &x, &y, &w, &h );
 		if( pnX && pnY )
 		{
 			*pnX = x;
@@ -446,14 +451,14 @@ VMatrix CSourceVirtualReality::GetMideyePose()
 // ----------------------------------------------------------------------
 inline static void ComposeProjectionTransform(float fLeft, float fRight, float fTop, float fBottom, float zNear, float zFar, float fovScale, VMatrix *pmProj )
 {
-	if( fovScale != 1.0f  && fovScale > 0.f )
+	/*if( fovScale != 1.0f  && fovScale > 0.f )
 	{
 		float fFovScaleAdjusted = tan( atan( fTop  ) / fovScale ) / fTop;
 		fRight *= fFovScaleAdjusted;
 		fLeft *= fFovScaleAdjusted;
 		fTop *= fFovScaleAdjusted;
 		fBottom *= fFovScaleAdjusted;
-	}
+	}*/
 
 	float idx = 1.0f / (fRight - fLeft);
 	float idy = 1.0f / (fBottom - fTop);
@@ -530,15 +535,21 @@ bool CSourceVirtualReality::WillDriftInYaw()
 void CSourceVirtualReality::AcquireNewZeroPose()
 {
 	// just let the next tracker update re-zero us
-	if( m_pHmd )
-		m_pHmd->ResetSeatedZeroPose();
+	if( m_pChap )
+		m_pChap->ResetZeroPose(TrackingUniverseSeated);
 }
 
 bool CSourceVirtualReality::SampleTrackingState ( float PlayerGameFov, float fPredictionSeconds )
 {
 	if( !m_pHmd || !m_bActive )
 		return false;
-
+	vr::VREvent_t event;
+	while( m_pHmd->PollNextEvent( &event, sizeof( event ) ) )
+	{
+		//ProcessVREvent( event );
+	}
+	vr::TrackedDevicePose_t m_rTrackedDevicePose[ vr::k_unMaxTrackedDeviceCount ];
+	vr::VRCompositor()->WaitGetPoses(m_rTrackedDevicePose, vr::k_unMaxTrackedDeviceCount, NULL, 0 );
 	// If tracker can't return a pose (it's possibly recalibrating itself)
 	// then we will freeze tracking at its current state, rather than
 	// snapping it back to the zero position
@@ -572,6 +583,7 @@ bool CSourceVirtualReality::SampleTrackingState ( float PlayerGameFov, float fPr
 
 	return true;
 }
+#include "togl/rendermechanism.h"
 
 
 // ----------------------------------------------------------------------
@@ -589,10 +601,16 @@ bool CSourceVirtualReality::DoDistortionProcessing ( VREye eEye )
 	CMatRenderContextPtr pRenderContext( materials );
 
 	IMaterial	*pDistortMaterial;
+	ITexture *pDistortTexture;
+	
 	if( eEye == VREye_Left )
 		pDistortMaterial = m_DistortLeftMaterial;
 	else
 		pDistortMaterial = m_DistortRightMaterial;
+	if( eEye == VREye_Left )
+		pDistortTexture = m_pDistortionTextureLeft;
+	else
+		pDistortTexture = m_pDistortionTextureRight;
 
 	if( !UsingOffscreenRenderTarget() )
 	{
@@ -602,17 +620,48 @@ bool CSourceVirtualReality::DoDistortionProcessing ( VREye eEye )
 			return false;
 
 		Rect_t	r;
+		r.x = !eEye?0:640;
+		r.y = 0;
+		r.width = 640;
+		r.height = 480;
 		this->GetViewportBounds( eEye, &r.x, &r.y, &r.width, &r.height );
 		pRenderContext->CopyRenderTargetToTextureEx( pFullFrameFB1, 0, &r, &r );
 	}
 
 	// This is where we are rendering to
 	uint32_t x, y, w, h;
-	m_pHmd->GetEyeOutputViewport( SourceEyeToHmdEye( eEye ), &x, &y, &w, &h );
-
-	pRenderContext->DrawScreenSpaceRectangle (	pDistortMaterial,
-		x, y, w, h,
-		0, 0, distortionTextureSize-1,distortionTextureSize-1,distortionTextureSize,distortionTextureSize);
+		x = !eEye?0:640;
+		y = 0;
+		w = 640;
+		h = 480;
+	//m_pExtDisplay->GetEyeOutputViewport( SourceEyeToHmdEye( eEye ), &x, &y, &w, &h );
+
+//	pRenderContext->DrawScreenSpaceRectangle (	pDistortMaterial,
+//		x, y, w, h,
+//		0, 0, distortionTextureSize-1,distortionTextureSize-1,distortionTextureSize,distortionTextureSize);
+
+	static int id = -1;
+	//static CDynamicFunctionOpenGL< true, GLvoid ( APIENTRY *)(GLenum pname, GLint *params), GLvoid > glGetIntegerv("glGetIntegerv");
+//	pRenderContext->Bind(pDistortMaterial);
+//	pRenderContext->Flush( true );
+//	ShaderAPITextureHandle_t  hndl = materials->GetShaderAPITextureBindHandle(pDistortTexture,0,0);
+	//if(id < 0)
+		id = materials->GetShaderAPIGLTexture(m_pPredistortRT,0,0);
+
+	static int last_tex[2] = {-1, -1};
+//	glGetIntegerv(GL_TEXTURE_BINDING_2D, &id);
+	if(id > 0)
+		last_tex[eEye != VREye_Left] = id;
+//	Msg("tex %d\n", id);
+	const vr::VRTextureBounds_t bounds = { 0.0f, 1.0f, 1.0f, 0.0f };
+	vr::Texture_t eyeTexture = {(void*)(uintptr_t)last_tex[eEye != VREye_Left], vr::TextureType_OpenGL, vr::ColorSpace_Gamma };
+	if(last_tex[eEye != VREye_Left] <= 0)
+		return true;
+	materials->Flush();
+//	if(eEye != VREye_Left)
+//		return 0;
+	glFinish();
+	vr::VRCompositor()->Submit(SourceEyeToHmdEye( eEye ), &eyeTexture, &bounds );
 
 	return true;
 }
@@ -682,11 +731,20 @@ bool CSourceVirtualReality::CompositeHud ( VREye eEye, float ndcHudBounds[4], bo
 	CMatRenderContextPtr pRenderContext( materials );
 
 	uint32_t x, y, w, h;
-	m_pHmd->GetEyeOutputViewport( SourceEyeToHmdEye( eEye ), &x, &y, &w, &h );
-
-	pRenderContext->DrawScreenSpaceRectangle (	pDistortHUDMaterial,
-		x, y, w, h,
-		0, 0, distortionTextureSize-1,distortionTextureSize-1,distortionTextureSize,distortionTextureSize);
+	x = !eEye?0:640;
+	y = 0;
+	w = 640;
+	h = 480;
+	m_pExtDisplay->GetEyeOutputViewport( SourceEyeToHmdEye( eEye ), &x, &y, &w, &h );
+	int id = materials->GetShaderAPIGLTexture(g_StereoGuiTexture,0,0);
+	vr::Texture_t guiTexture = {(void*)(uintptr_t)id, vr::TextureType_OpenGL, vr::ColorSpace_Gamma };
+	const vr::VRTextureBounds_t bounds = { 0.0f, 1.0f, 1.0f, 0.0f };
+	vr::VROverlay()->SetOverlayTextureBounds(m_GuiOverlay, &bounds);
+	vr::VROverlay()->SetOverlayTexture(m_GuiOverlay, &guiTexture);
+
+//	pRenderContext->DrawScreenSpaceRectangle (	pDistortHUDMaterial,
+//		x, y, w, h,
+//		0, 0, distortionTextureSize-1,distortionTextureSize-1,distortionTextureSize,distortionTextureSize);
 
 	return true;
 }
@@ -706,14 +764,22 @@ bool CSourceVirtualReality::StartTracker()
 
 	// Initialize SteamVR
 	vr::HmdError err;
-	m_pHmd = vr::VR_Init(  &err );
-	if( err != HmdError_None )
+	m_pHmd = vr::VR_Init(  &err, vr::VRApplication_Scene );
+	m_pExtDisplay = vr::VRExtendedDisplay();
+	m_pChap = vr::VRChaperone();
+	if( err != vr::VRInitError_None )
 	{
 		Msg( "Unable to initialize HMD tracker. Error code %d\n", err );
 		return false;
 	}
 
-	m_pHmd->ResetSeatedZeroPose();
+	if( !vr::VRCompositor() )
+	{
+		Msg("Compositor initialization failed. See log file for details");
+	}
+	vr::VROverlay()->CreateOverlay("GuiOverlayKey", "GuiOverlay", &m_GuiOverlay);
+	vr::VROverlay()->ShowOverlay(m_GuiOverlay);
+	m_pChap->ResetZeroPose(TrackingUniverseSeated);
 
 	m_bHaveValidPose = false;
 	m_ZeroFromHeadPose.Identity();
diff --git a/sourcevr/sourcevirtualreality.h b/sourcevr/sourcevirtualreality.h
index 0e7875005..00250f60c 100644
--- a/sourcevr/sourcevirtualreality.h
+++ b/sourcevr/sourcevirtualreality.h
@@ -124,6 +124,8 @@ class CSourceVirtualReality: public CTier3AppSystem< ISourceVirtualReality >
 	CMaterialReference m_blackMaterial;
 
 	vr::IVRSystem				*m_pHmd;
+	vr::IVRExtendedDisplay *m_pExtDisplay;
+	vr::IVRChaperone *m_pChap;
 
 	bool	  m_bHaveValidPose;
 	VMatrix   m_ZeroFromHeadPose;
diff --git a/sourcevr/wscript b/sourcevr/wscript
new file mode 100755
index 000000000..e930c29b1
--- /dev/null
+++ b/sourcevr/wscript
@@ -0,0 +1,50 @@
+#! /usr/bin/env python
+# encoding: utf-8
+
+from waflib import Utils
+import os
+
+top = '.'
+PROJECT_NAME = 'sourcevr'
+
+def options(opt):
+	# stub
+	return
+
+def configure(conf):
+	conf.env.append_unique('DEFINES',['strncpy=use_Q_strncpy_instead',
+		'_snprintf=use_Q_snprintf_instead','SOURCEVR_DLL'])
+	conf.check_cfg(package='openvr', uselib_store='OPENVR', args=['--cflags', '--libs'])
+	conf.check(lib='GL', uselib_store='GL')
+
+def build(bld):
+	source = [
+		 "sourcevirtualreality.cpp"
+	]
+
+	includes = [
+		'.',
+		'../public',
+		'../public/tier0',
+		'../public/tier1'
+	] + bld.env.INCLUDES_SDL2
+
+	defines = []
+
+	libs = ['tier0','tier1','tier2', 'tier3','vstdlib','mathlib','OPENVR', 'GL']
+
+	install_path = bld.env.LIBDIR
+
+	bld.shlib(
+		source   = source,
+		target   = PROJECT_NAME,
+		name     = PROJECT_NAME,
+		features = 'c cxx',
+		includes = includes,
+		defines  = defines,
+		use      = libs,
+		install_path = install_path,
+		subsystem = bld.env.MSVC_SUBSYSTEM,
+		idx      = bld.get_taskgen_count()
+	)
+
diff --git a/wscript b/wscript
index d04bc6044..e34d2cdcc 100644
--- a/wscript
+++ b/wscript
@@ -79,6 +79,7 @@ projects={
 		'utils/vtex',
 		'unicode',
 		'video',
+		'sourcevr'
 	],
 	'tests': [
 		'appframework',
@@ -358,10 +359,10 @@ def check_deps(conf):
 			else:
 				conf.check_pkg('freetype2', 'FT2', FT2_CHECK)
 				conf.check_pkg('fontconfig', 'FC', FC_CHECK)
-				if conf.env.DEST_OS == "darwin":
-					conf.env.FRAMEWORK_OPENAL = "OpenAL"
-				else:
-					conf.check_cfg(package='openal', uselib_store='OPENAL', args=['--cflags', '--libs'])
+#				if conf.env.DEST_OS == "darwin":
+#					conf.env.FRAMEWORK_OPENAL = "OpenAL"
+#				else:
+#					conf.check_cfg(package='openal', uselib_store='OPENAL', args=['--cflags', '--libs'])
 				conf.check_cfg(package='libjpeg', uselib_store='JPEG', args=['--cflags', '--libs'])
 				conf.check_cfg(package='libpng', uselib_store='PNG', args=['--cflags', '--libs'])
 				conf.check_cfg(package='libcurl', uselib_store='CURL', args=['--cflags', '--libs'])
