diff options
Diffstat (limited to 'Samples/CommonSrc/Platform')
19 files changed, 28 insertions, 2654 deletions
diff --git a/Samples/CommonSrc/Platform/Gamepad.h b/Samples/CommonSrc/Platform/Gamepad.h index f32effc..95cff10 100644 --- a/Samples/CommonSrc/Platform/Gamepad.h +++ b/Samples/CommonSrc/Platform/Gamepad.h @@ -5,7 +5,7 @@ Content : Cross platform Gamepad interface. Created : May 6, 2013 Authors : Lee Cooper -Copyright : Copyright 2013 Oculus VR, Inc. All Rights reserved. +Copyright : Copyright 2012 Oculus VR, Inc. All Rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -75,7 +75,7 @@ struct GamepadState { return !(*this == b); } - void Debug() + void Debug() const { OVR_DEBUG_LOG(("Buttons:0x%4x LX:%.2f LY:%.2f RX:%.2f RY:%.2f LT:%.2f RT:%.2f", Buttons, LX, LY, RX, RY, LT, RT)); } diff --git a/Samples/CommonSrc/Platform/Linux_Gamepad.cpp b/Samples/CommonSrc/Platform/Linux_Gamepad.cpp deleted file mode 100644 index 7bca5c5..0000000 --- a/Samples/CommonSrc/Platform/Linux_Gamepad.cpp +++ /dev/null @@ -1,453 +0,0 @@ -/************************************************************************************ - -Filename : Linux_Gamepad.cpp -Content : Linux implementation of Platform app infrastructure -Created : May 6, 2013 -Authors : Lee Cooper, Simon Hallam - -Copyright : Copyright 2013 Oculus VR, Inc. All Rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -************************************************************************************/ - -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <unistd.h> -#include <glob.h> -#include <linux/joystick.h> -#include "Linux_Gamepad.h" - - -namespace OVR { namespace Platform { namespace Linux { - -const char* pNameXbox360Wireless = "Xbox 360"; -const char* pNameXbox360Wired = "Microsoft X-Box 360"; - - -GamepadManager::GamepadManager() : - pDevice(NULL) -{ -} - -GamepadManager::~GamepadManager() -{ - // if we have an open device, close it - if (pDevice) - { - pDevice->Close(); - pDevice = NULL; - } -} - -UInt32 GamepadManager::GetGamepadCount() -{ - return 1; -} - -bool GamepadManager::GetGamepadState(UInt32 index, GamepadState *pState) -{ - if (!pDevice) - { - // get a list of paths to all the connected joystick devices - glob_t joystickGlobBuffer; - glob("/dev/input/js*", 0, NULL, &joystickGlobBuffer); - - // open each joystick device, until we find one that will work for our needs - for (UInt32 i = 0; i < joystickGlobBuffer.gl_pathc; i++) - { - pDevice = new Gamepad(); - if (pDevice->Open(joystickGlobBuffer.gl_pathv[i])) - { - - if (pDevice->IsSupportedType()) - { - break; - } - } - - // we don't know why the device was not useable, make sure it gets closed cleanly - pDevice->Close(); - pDevice = NULL; - } - - } - - if (pDevice) - { - // we have a device, so update it - pDevice->UpdateState(); - - // copy the device state into the struct param - memcpy(pState, pDevice->GetState(), sizeof(GamepadState)); - - // TODO: is the device still active/connected? if not, we should close it - // and clear pDevice, so that another device can take over - - return true; - } - else - { - return false; - } -} - -Gamepad::Gamepad() : - IsInitialized(false), - Name(String("Undefined")), - Type(UNDEFINED) -{ -} - -Gamepad::~Gamepad() -{ - this->Close(); -} - -bool Gamepad::Open(const String& devicePathName) -{ - Name = "Undefined"; - Type = UNDEFINED; - - FileDescriptor = ::open(devicePathName.ToCStr(), O_RDONLY | O_NONBLOCK); - if (FileDescriptor == -1) - { - return false; - } - - // get the device name - char name[128]; - if (ioctl(FileDescriptor, JSIOCGNAME(sizeof(name)), name) < 0) - { - return false; - } - - Name = name; - - // see if device name matches one of our supported devices - static const UInt32 Wireless360Len = String(pNameXbox360Wireless).GetLength(); - static const UInt32 Wired360Len = String(pNameXbox360Wired).GetLength(); - if (Name.Substring(0, Wireless360Len) == pNameXbox360Wireless) - { - Type = XBOX360GAMEPADWIRELESS; - return true; - } - else if(Name.Substring(0, Wired360Len) == pNameXbox360Wired) - { - Type = XBOX360GAMEPADWIRED; - return true; - } - - return false; -} - -bool Gamepad::Close() -{ - IsInitialized = false; - Name = "Undefined"; - Type = UNDEFINED; - return !::close(FileDescriptor); -} - -void Gamepad::UpdateState() -{ - GamepadState *pState = &State; - js_event gamepadEvent; - - // read the latest batch of events - while (read(FileDescriptor, &gamepadEvent, sizeof(struct js_event)) != -1) - { - switch (gamepadEvent.type) - { - case JS_EVENT_BUTTON: - IsInitialized = true; - SetStateButton(pState, gamepadEvent.number, gamepadEvent.value); - break; - - case JS_EVENT_AXIS: - IsInitialized = true; - SetStateAxis(pState, gamepadEvent.number, gamepadEvent.value); - break; - - case JS_EVENT_BUTTON | JS_EVENT_INIT: - if (IsInitialized) // skip the fake values during device event initialization - { - SetStateButton(pState, gamepadEvent.number, gamepadEvent.value); - } - break; - - case JS_EVENT_AXIS | JS_EVENT_INIT: - if (IsInitialized) // skip the fake values during device event initialization - { - SetStateAxis(pState, gamepadEvent.number, gamepadEvent.value); - } - break; - - default: - LogText("OVR::Linux::UpdateState unknown event type\n"); - } - } -} - -const GamepadState* Gamepad::GetState() -{ - return &State; -} - - -bool Gamepad::IsSupportedType() -{ - return Type != UNDEFINED; -} - -const String& Gamepad::GetIdentifier() -{ - return Name; -} - -static inline float NormalizeGamepadStickXbox360(SInt32 in) -{ - float v; - if (abs(in) < 9000) return 0; - else if (in > 9000) v = (float)in - 9000; - else v = (float)in + 9000; - return v / (32767 - 9000); -} - -static inline float NormalizeGamepadTriggerXbox360(SInt32 in, - SInt32 offset, - SInt32 deadBand, - float divisor) -{ - in += offset; - - if (in < deadBand) - { - return 0; - } - else - { - return float(in - deadBand) / divisor; - } -} - -static inline void UpdateButtonMaskAndBitfield(GamepadState *pState, - SInt32 value, - UInt32 buttonBitfield) -{ - if (value) - { - pState->Buttons |= buttonBitfield; - } - else - { - pState->Buttons = pState->Buttons & (0xFFFFFFFF ^ buttonBitfield); - } -} - -void Gamepad::SetStateAxis(GamepadState *pState, UInt32 axis, SInt32 value) -{ - // some pads/sticks have lots in common with one another, - // handle those shared cases first - switch (Type) - { - case XBOX360GAMEPADWIRELESS: - case XBOX360GAMEPADWIRED: - switch (axis) - { - case 0: - pState->LX = NormalizeGamepadStickXbox360(value); - break; - - case 1: - pState->LY = -NormalizeGamepadStickXbox360(value); - break; - - case 3: - pState->RX = NormalizeGamepadStickXbox360(value); - break; - - case 4: - pState->RY = -NormalizeGamepadStickXbox360(value); - break; - } - break; - - case UNDEFINED: - default: - break; - } - - // handle the special cases, or pads/sticks which are unique - switch (Type) - { - case XBOX360GAMEPADWIRELESS: - switch (axis) - { - case 2: - pState->LT = NormalizeGamepadTriggerXbox360(value, 0, 500, 32267); - break; - - case 5: - pState->RT = NormalizeGamepadTriggerXbox360(value, 0, 500, 32267); - break; - } - break; - - case XBOX360GAMEPADWIRED: - switch (axis) - { - case 2: - pState->LT = NormalizeGamepadTriggerXbox360(value, 32767, 1000, 64535); - break; - - case 5: - pState->RT = NormalizeGamepadTriggerXbox360(value, 32767, 1000, 64535); - break; - - case 6: - if (value == 0) - { - UpdateButtonMaskAndBitfield(pState, 0, Gamepad_Left); - UpdateButtonMaskAndBitfield(pState, 0, Gamepad_Right); - } - else if (value < 0) - { - UpdateButtonMaskAndBitfield(pState, 1, Gamepad_Left); - } - else if (value > 0) - { - UpdateButtonMaskAndBitfield(pState, 1, Gamepad_Right); - } - break; - - case 7: - if (value == 0) - { - UpdateButtonMaskAndBitfield(pState, 0, Gamepad_Up); - UpdateButtonMaskAndBitfield(pState, 0, Gamepad_Down); - } - else if (value < 0) - { - UpdateButtonMaskAndBitfield(pState, 1, Gamepad_Up); - } - else if (value > 0) - { - UpdateButtonMaskAndBitfield(pState, 1, Gamepad_Down); - } - break; - } - break; - - case UNDEFINED: - default: - break; - } -} - -void Gamepad::SetStateButton(GamepadState *pState, UInt32 button, SInt32 value) -{ - // some pads/sticks have lots in common with one another, - // handle those shared cases first - switch (Type) - { - case XBOX360GAMEPADWIRELESS: - case XBOX360GAMEPADWIRED: - switch (button) - { - case 0: - UpdateButtonMaskAndBitfield(pState, value, Gamepad_A); - break; - - case 1: - UpdateButtonMaskAndBitfield(pState, value, Gamepad_B); - break; - - case 2: - UpdateButtonMaskAndBitfield(pState, value, Gamepad_X); - break; - - case 3: - UpdateButtonMaskAndBitfield(pState, value, Gamepad_Y); - break; - - case 4: - UpdateButtonMaskAndBitfield(pState, value, Gamepad_L1); - break; - - case 5: - UpdateButtonMaskAndBitfield(pState, value, Gamepad_R1); - break; - - case 6: - UpdateButtonMaskAndBitfield(pState, value, Gamepad_Back); - break; - - case 7: - UpdateButtonMaskAndBitfield(pState, value, Gamepad_Start); - break; - - case 8: - // we have no value defined for the Xbox/power button - break; - - case 9: - UpdateButtonMaskAndBitfield(pState, value, Gamepad_LStick); - break; - - case 10: - UpdateButtonMaskAndBitfield(pState, value, Gamepad_RStick); - break; - } - break; - - case UNDEFINED: - default: - break; - } - - // handle the special cases, or pads/sticks which are unique - switch (Type) - { - case XBOX360GAMEPADWIRELESS: - switch (button) - { - case 11: - UpdateButtonMaskAndBitfield(pState, value, Gamepad_Left); - break; - - case 12: - UpdateButtonMaskAndBitfield(pState, value, Gamepad_Right); - break; - - case 13: - UpdateButtonMaskAndBitfield(pState, value, Gamepad_Up); - break; - - case 14: - UpdateButtonMaskAndBitfield(pState, value, Gamepad_Down); - break; - } - - case XBOX360GAMEPADWIRED: - break; - - case UNDEFINED: - default: - break; - } -} - -}}} // OVR::Platform::Linux - diff --git a/Samples/CommonSrc/Platform/Linux_Gamepad.h b/Samples/CommonSrc/Platform/Linux_Gamepad.h deleted file mode 100644 index ba66e70..0000000 --- a/Samples/CommonSrc/Platform/Linux_Gamepad.h +++ /dev/null @@ -1,83 +0,0 @@ -/************************************************************************************ - -Filename : Linux_Gamepad.h -Content : Linux implementation of Gamepad functionality. -Created : May 6, 2013 -Authors : Lee Cooper, Simon Hallam - -Copyright : Copyright 2013 Oculus VR, Inc. All Rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -************************************************************************************/ - -#ifndef OVR_Linux_Gamepad_h -#define OVR_Linux_Gamepad_h - -#include "Gamepad.h" - -namespace OVR { namespace Platform { namespace Linux { - -class Gamepad; // forward declaration for readability - -class GamepadManager : public Platform::GamepadManager -{ -public: - - GamepadManager(); - ~GamepadManager(); - - virtual UInt32 GetGamepadCount(); - virtual bool GetGamepadState(UInt32 index, GamepadState *pState); - -private: - - Gamepad *pDevice; -}; - -class Gamepad -{ -public: - - Gamepad(); - virtual ~Gamepad(); - - bool Open(const String& devicePathName); - bool Close(); - bool IsSupportedType(); - const String& GetIdentifier(); - void UpdateState(); - const GamepadState* GetState(); - -private: - - void SetStateAxis(GamepadState *pState, UInt32 axis, SInt32 value); - void SetStateButton(GamepadState *pState, UInt32 button, SInt32 value); - - enum GamepadType - { - UNDEFINED, - XBOX360GAMEPADWIRELESS, - XBOX360GAMEPADWIRED - }; - - UInt32 FileDescriptor; - bool IsInitialized; - String Name; - GamepadType Type; - GamepadState State; -}; - -}}} - -#endif // OVR_Linux_Gamepad_h diff --git a/Samples/CommonSrc/Platform/Linux_Platform.cpp b/Samples/CommonSrc/Platform/Linux_Platform.cpp deleted file mode 100644 index c9d3e40..0000000 --- a/Samples/CommonSrc/Platform/Linux_Platform.cpp +++ /dev/null @@ -1,563 +0,0 @@ -/************************************************************************************ - -Filename : Platform_Linux.cpp -Content : Linux (X11) implementation of Platform app infrastructure -Created : September 6, 2012 -Authors : Andrew Reisse - -Copyright : Copyright 2012 Oculus VR, Inc. All Rights reserved. - -Use of this software is subject to the terms of the Oculus LLC license -agreement provided at the time of installation or download, or which -otherwise accompanies this software in either electronic or hard copy form. - -************************************************************************************/ - -#include "Kernel/OVR_System.h" -#include "Kernel/OVR_Array.h" -#include "Kernel/OVR_String.h" -#include "Kernel/OVR_Timer.h" - -#include "Linux_Platform.h" -#include "Linux_Gamepad.h" - -// Renderers -#include "../Render/Render_GL_Device.h" - -#include <X11/extensions/Xinerama.h> - - -namespace OVR { namespace Platform { namespace Linux { - -static const char *AtomNames[] = {"WM_PROTOCOLS", "WM_DELETE_WINDOW"}; - -PlatformCore::PlatformCore(Application* app) - : Platform::PlatformCore(app), Disp(NULL), Win(0), Vis(NULL), Quit(0), MMode(Mouse_Normal) -{ - pGamepadManager = *new Linux::GamepadManager(); -} -PlatformCore::~PlatformCore() -{ - XFreeCursor(Disp, InvisibleCursor); - - if (Disp) - XCloseDisplay(Disp); -} - -// Setup an X11 window in windowed mode. -bool PlatformCore::SetupWindow(int w, int h) -{ - - if (!Disp) - { - XInitThreads(); - - Disp = XOpenDisplay(NULL); - if (!Disp) - { - OVR_DEBUG_LOG(("XOpenDisplay failed.")); - return false; - } - - XInternAtoms(Disp, const_cast<char**>(AtomNames), NumAtoms, false, Atoms); - } - - XSetWindowAttributes winattr; - unsigned attrmask = CWEventMask | CWBorderPixel; - - winattr.event_mask = ButtonPressMask|ButtonReleaseMask|KeyPressMask|KeyReleaseMask|ButtonMotionMask|PointerMotionMask| - /*PointerMotionHintMask|*/StructureNotifyMask;//|ExposureMask; - winattr.border_pixel = 0; - - int screenNumber = DefaultScreen(Disp); - - if (!Vis) - { - int attr[16]; - int nattr = 2; - - attr[0] = GLX_RGBA; - attr[1] = GLX_DOUBLEBUFFER; - attr[nattr++] = GLX_DEPTH_SIZE; - attr[nattr++] = 24; - attr[nattr] = 0; - - Vis = glXChooseVisual(Disp, screenNumber, attr); - - if (!Vis) - { - OVR_DEBUG_LOG(("glXChooseVisual failed.")); - return false; - } - } - - Window rootWindow = XRootWindow(Disp, Vis->screen); - - winattr.colormap = XCreateColormap(Disp, rootWindow, Vis->visual, AllocNone); - attrmask |= CWColormap; - - - Win = XCreateWindow(Disp, rootWindow, 0, 0, w, h, 0, Vis->depth, - InputOutput, Vis->visual, attrmask, &winattr); - - if (!Win) - { - OVR_DEBUG_LOG(("XCreateWindow failed.")); - return false; - } - - - XStoreName(Disp, Win, "OVR App"); - XSetWMProtocols(Disp, Win, &Atoms[WM_DELETE_WINDOW], 1); - - // Intialize empty cursor for show/hide. - XColor black; - static char noData[] = { 0,0,0,0,0,0,0,0 }; - black.red = black.green = black.blue = 0; - - Pixmap bitmapNoData = XCreateBitmapFromData(Disp, Win, noData, 8, 8); - InvisibleCursor = XCreatePixmapCursor(Disp, bitmapNoData, bitmapNoData, - &black, &black, 0, 0); - XDefineCursor(Disp, Win, InvisibleCursor); - - Width = w; - Height = h; - - return true; -} - -void PlatformCore::SetMouseMode(MouseMode mm) -{ - if (mm == MMode) - return; - - if (Win) - { - if (mm == Mouse_Relative) - { - XWarpPointer(Disp, Win, Win, 0,0,Width,Height, Width/2, Height/2); - } - else - { - //if (MMode == Mouse_Relative) - // ShowCursor(TRUE); - } - } - MMode = mm; -} - -void PlatformCore::GetWindowSize(int* w, int* h) const -{ - *w = Width; - *h = Height; -} - -void PlatformCore::SetWindowTitle(const char* title) -{ - XStoreName(Disp, Win, title); -} - -void PlatformCore::ShowWindow(bool show) -{ - if (show) - XRaiseWindow(Disp, Win); - else - XIconifyWindow(Disp, Win, 0); -} - -void PlatformCore::DestroyWindow() -{ - if (Win) - XDestroyWindow(Disp, Win); - Win = 0; -} - - -static int KeyMap[][2] = -{ - { XK_BackSpace, Key_Backspace }, - { XK_Tab, Key_Tab }, - { XK_Clear, Key_Clear }, - { XK_Return, Key_Return }, - { XK_Shift_L, Key_Shift }, - { XK_Control_L, Key_Control }, - { XK_Alt_L, Key_Alt }, - { XK_Shift_R, Key_Shift }, - { XK_Control_R, Key_Control }, - { XK_Alt_R, Key_Alt }, - { XK_Pause, Key_Pause }, - { XK_Caps_Lock, Key_CapsLock }, - { XK_Escape, Key_Escape }, - { XK_space, Key_Space }, - { XK_Page_Up, Key_PageUp }, - { XK_Page_Down, Key_PageDown }, - { XK_Prior, Key_PageUp }, - { XK_Next, Key_PageDown }, - { XK_End, Key_End }, - { XK_Home, Key_Home }, - { XK_Left, Key_Left }, - { XK_Up, Key_Up }, - { XK_Right, Key_Right }, - { XK_Down, Key_Down }, - { XK_Insert, Key_Insert }, - { XK_Delete, Key_Delete }, - { XK_Help, Key_Help }, - { XK_Num_Lock, Key_NumLock }, - { XK_Scroll_Lock, Key_ScrollLock }, -}; - - -static KeyCode MapXKToKeyCode(unsigned vk) -{ - unsigned key = Key_None; - - if ((vk >= 'a') && (vk <= 'z')) - { - key = vk - 'a' + Key_A; - } - else if ((vk >= ' ') && (vk <= '~')) - { - key = vk; - } - else if ((vk >= XK_KP_0) && (vk <= XK_KP_9)) - { - key = vk - XK_KP_0 + Key_KP_0; - } - else if ((vk >= XK_F1) && (vk <= XK_F15)) - { - key = vk - XK_F1 + Key_F1; - } - else - { - for (unsigned i = 0; i< (sizeof(KeyMap) / sizeof(KeyMap[1])); i++) - { - if (vk == KeyMap[i][0]) - { - key = KeyMap[i][1]; - break; - } - } - } - - return (KeyCode)key; -} - -static int MapModifiers(int xmod) -{ - int mod = 0; - if (xmod & ShiftMask) - mod |= Mod_Shift; - if (xmod & ControlMask) - mod |= Mod_Control; - if (xmod & Mod1Mask) - mod |= Mod_Alt; - if (xmod & Mod4Mask) - mod |= Mod_Meta; - return mod; -} - -void PlatformCore::processEvent(XEvent& event) -{ - switch (event.xany.type) - { - case ConfigureNotify: - if (event.xconfigure.width != Width || event.xconfigure.height != Height) - { - Width = event.xconfigure.width; - Height = event.xconfigure.height; - pApp->OnResize(Width, Height); - - if (pRender) - pRender->SetWindowSize(Width, Height); - } - break; - - case KeyPress: - case KeyRelease: - { - char chars[8] = {0}; - KeySym xk; - XComposeStatus comp; - XLookupString(&event.xkey, chars, sizeof(chars), &xk, &comp); - if (xk != XK_VoidSymbol) - pApp->OnKey(MapXKToKeyCode((unsigned)xk), chars[0], event.xany.type == KeyPress, MapModifiers(event.xkey.state)); - if (xk == XK_Escape && MMode == Mouse_Relative) - { - //ungrab - MMode = Mouse_RelativeEscaped; - showCursor(true); - } - } - break; - - case MotionNotify: - if (MMode == Mouse_Relative) - { - int dx = event.xmotion.x - Width/2; - int dy = event.xmotion.y - Height/2; - - // do not remove this check, WarpPointer generates events too. - if (dx == 0 && dy == 0) - break; - - XWarpPointer(Disp, Win, Win, 0,0,Width,Height, Width/2, Height/2); - pApp->OnMouseMove(dx, dy, Mod_MouseRelative|MapModifiers(event.xmotion.state)); - } - else - { - pApp->OnMouseMove(event.xmotion.x, event.xmotion.y, MapModifiers(event.xmotion.state)); - } - break; - - case MapNotify: - if (MMode == Mouse_Relative) - { - XWarpPointer(Disp, Win, Win, 0,0,Width,Height, Width/2, Height/2); - showCursor(false); - } - break; - - case ButtonPress: - if (event.xbutton.button == 1) - { - //grab - - if (MMode == Mouse_RelativeEscaped) - { - XWarpPointer(Disp, Win, Win, 0,0,Width,Height, Width/2, Height/2); - showCursor(false); - MMode = Mouse_Relative; - } - } - break; - - case FocusOut: - if (MMode == Mouse_Relative) - { - MMode = Mouse_RelativeEscaped; - showCursor(true); - } - break; - - case ClientMessage: - if (event.xclient.message_type == Atoms[WM_PROTOCOLS] && - Atom(event.xclient.data.l[0]) == Atoms[WM_DELETE_WINDOW]) - pApp->OnQuitRequest(); - break; - } -} - -int PlatformCore::Run() -{ - while (!Quit) - { - if (XPending(Disp)) - { - XEvent event; - XNextEvent(Disp, &event); - - if (pApp && event.xany.window == Win) - processEvent(event); - } - else - { - pApp->OnIdle(); - } - } - - return ExitCode; -} - -bool PlatformCore::determineScreenOffset(int screenId, int* screenOffsetX, int* screenOffsetY) -{ - Display* display = XOpenDisplay(NULL); - - bool foundScreen = false; - - if (display) - { - int numberOfScreens; - XineramaScreenInfo* screens = XineramaQueryScreens(display, &numberOfScreens); - - if (screenId < numberOfScreens) - { - XineramaScreenInfo screenInfo = screens[screenId]; - *screenOffsetX = screenInfo.x_org; - *screenOffsetY = screenInfo.y_org; - - foundScreen = true; - } - - XFree(screens); - } - - return foundScreen; -} - -void PlatformCore::showWindowDecorations(bool show) -{ - // Declaration of 'MOTIF_WM_HINTS' struct and flags can be found at: - // https://people.gnome.org/~tthurman/docs/metacity/xprops_8h-source.html - typedef struct WMHints - { - unsigned long flags; - unsigned long functions; - unsigned long decorations; - long inputMode; - unsigned long status; - } Hints; - - #define MWM_DECOR_ALL (1L << 0) - #define MWM_DECOR_BORDER (1L << 1) - #define MWM_DECOR_RESIZEH (1L << 2) - #define MWM_DECOR_TITLE (1L << 3) - #define MWM_DECOR_MENU (1L << 4) - #define MWM_DECOR_MINIMIZE (1L << 5) - #define MWM_DECOR_MAXIMIZE (1L << 6) - - Atom property = XInternAtom(Disp, "_MOTIF_WM_HINTS", true); - - Hints hints; - hints.flags = 2; // We only want to specify decoration. - - if (show) - { - hints.decorations = MWM_DECOR_BORDER | MWM_DECOR_TITLE | MWM_DECOR_MENU | MWM_DECOR_MINIMIZE | MWM_DECOR_MAXIMIZE; - } - else - { - // Remove all window border items. - hints.decorations = 0; - } - - XChangeProperty(Disp,Win,property,property,32,PropModeReplace,(unsigned char *)&hints,5); -} - -bool PlatformCore::SetFullscreen(const Render::RendererParams& rp, int fullscreen) -{ - if (rp.Fullscreen == Render::Display_Window && fullscreen == Render::Display_FakeFullscreen) - { - // Transitioning from windowed to fake fullscreen. - int xOffset; - int yOffset; - - if (!determineScreenOffset(rp.Display.CgDisplayId, &xOffset, &yOffset)) - { - return false; - } - - showWindowDecorations(false); - - XMoveWindow(Disp, Win, xOffset, yOffset); - XMapRaised(Disp, Win); - - Platform::PlatformCore::SetFullscreen(rp, fullscreen); - return true; - } - else if (rp.Fullscreen == Render::Display_FakeFullscreen && fullscreen == Render::Display_Window) - { - // Transitioning from fake fullscreen to windowed. - showWindowDecorations(true); - - XMoveWindow(Disp, Win, 0, 0); - XMapRaised(Disp, Win); - - Platform::PlatformCore::SetFullscreen(rp, fullscreen); - return true; - } - else if (fullscreen == Render::Display_Fullscreen) - { - return false; - } -} - -RenderDevice* PlatformCore::SetupGraphics(const SetupGraphicsDeviceSet& setupGraphicsDesc, - const char* type, const Render::RendererParams& rp) -{ - const SetupGraphicsDeviceSet* setupDesc = setupGraphicsDesc.PickSetupDevice(type); - OVR_ASSERT(setupDesc); - - pRender = *setupDesc->pCreateDevice(rp, this); - if (pRender) - pRender->SetWindowSize(Width, Height); - - return pRender.GetPtr(); -} - -void PlatformCore::showCursor(bool show) -{ - if (show) - { - XUndefineCursor(Disp, Win); - } - else - { - XDefineCursor(Disp, Win, InvisibleCursor); - } -} - -}} - -// GL -namespace Render { namespace GL { namespace Linux { - -Render::RenderDevice* RenderDevice::CreateDevice(const RendererParams& rp, void* oswnd) -{ - Platform::Linux::PlatformCore* PC = (Platform::Linux::PlatformCore*)oswnd; - - GLXContext context = glXCreateContext(PC->Disp, PC->Vis, 0, GL_TRUE); - - if (!context) - return NULL; - - if (!glXMakeCurrent(PC->Disp, PC->Win, context)) - { - glXDestroyContext(PC->Disp, context); - return NULL; - } - - XMapRaised(PC->Disp, PC->Win); - - return new Render::GL::Linux::RenderDevice(rp, PC->Disp, PC->Win, context); -} - -void RenderDevice::Present() -{ - glXSwapBuffers(Disp, Win); -} - -void RenderDevice::Shutdown() -{ - if (Context) - { - glXMakeCurrent(Disp, 0, NULL); - glXDestroyContext(Disp, Context); - Context = NULL; - Win = 0; - } -} - -}}}} - - -int main(int argc, const char* argv[]) -{ - using namespace OVR; - using namespace OVR::Platform; - - // CreateApplication must be the first call since it does OVR::System::Initialize. - Application* app = Application::CreateApplication(); - Linux::PlatformCore* platform = new Linux::PlatformCore(app); - // The platform attached to an app will be deleted by DestroyApplication. - app->SetPlatformCore(platform); - - int exitCode = app->OnStartup(argc, argv); - if (!exitCode) - exitCode = platform->Run(); - - // No OVR functions involving memory are allowed after this. - Application::DestroyApplication(app); - app = 0; - - return exitCode; -} diff --git a/Samples/CommonSrc/Platform/Linux_Platform.h b/Samples/CommonSrc/Platform/Linux_Platform.h deleted file mode 100644 index 7fbb220..0000000 --- a/Samples/CommonSrc/Platform/Linux_Platform.h +++ /dev/null @@ -1,120 +0,0 @@ -/************************************************************************************ - -Filename : Platform_Linux.h -Content : Linux (X11) implementation of Platform app infrastructure -Created : September 6, 2012 -Authors : Andrew Reisse - -Copyright : Copyright 2012 Oculus VR, Inc. All Rights reserved. - -Use of this software is subject to the terms of the Oculus LLC license -agreement provided at the time of installation or download, or which -otherwise accompanies this software in either electronic or hard copy form. - -************************************************************************************/ - -#ifndef OVR_Platform_Linux_h -#define OVR_Platform_Linux_h - -#include <X11/Xlib.h> -#include <X11/Xutil.h> -#include <GL/glx.h> - -#include "Platform.h" -#include "../Render/Render_GL_Device.h" - -namespace OVR { namespace Render { - class RenderDevice; -}} - -namespace OVR { namespace Platform { namespace Linux { - -class PlatformCore : public Platform::PlatformCore -{ -public: - Display* Disp; - XVisualInfo* Vis; - Window Win; - - bool Quit; - int ExitCode; - int Width, Height; - - MouseMode MMode; - Cursor InvisibleCursor; - - enum - { - WM_PROTOCOLS, - WM_DELETE_WINDOW, - NumAtoms - }; - Atom Atoms[NumAtoms]; - - void processEvent(XEvent& event); - - Render::RenderDevice* SetupGraphics_GL(const Render::RendererParams& rp); - - void showCursor(bool show); - bool determineScreenOffset(int screenId, int* screenOffsetX, int* screenOffsetY); - void showWindowDecorations(bool show); - -public: - PlatformCore(Application* app); - ~PlatformCore(); - - bool SetupWindow(int w, int h); - void Exit(int exitcode) { Quit = 1; ExitCode = exitcode; } - - RenderDevice* SetupGraphics(const SetupGraphicsDeviceSet& setupGraphicsDesc, - const char* gtype, const Render::RendererParams& rp); - - void SetMouseMode(MouseMode mm); - void GetWindowSize(int* w, int* h) const; - - void SetWindowTitle(const char*title); - - void ShowWindow(bool show); - void DestroyWindow(); - bool SetFullscreen(const Render::RendererParams& rp, int fullscreen); - int Run(); -}; - -}} -namespace Render { namespace GL { namespace Linux { - -class RenderDevice : public Render::GL::RenderDevice -{ - Display* Disp; - Window Win; - GLXContext Context; - -public: - RenderDevice(const Render::RendererParams& p, Display* disp, Window w, GLXContext gl) - : GL::RenderDevice(p), Disp(disp), Win(w), Context(gl) {} - - virtual void Shutdown(); - virtual void Present(); - - // oswnd = Linux::PlatformCore* - static Render::RenderDevice* CreateDevice(const RendererParams& rp, void* oswnd); -}; - -}}}} - - -// OVR_PLATFORM_APP_ARGS specifies the Application class to use for startup, -// providing it with startup arguments. -#define OVR_PLATFORM_APP_ARGS(AppClass, args) \ - OVR::Platform::Application* OVR::Platform::Application::CreateApplication() \ - { OVR::System::Init(OVR::Log::ConfigureDefaultLog(OVR::LogMask_All)); \ - return new AppClass args; } \ - void OVR::Platform::Application::DestroyApplication(OVR::Platform::Application* app) \ - { OVR::Platform::PlatformCore* platform = app->pPlatform; \ - delete app; delete platform; OVR::System::Destroy(); }; - -// OVR_PLATFORM_APP_ARGS specifies the Application startup class with no args. -#define OVR_PLATFORM_APP(AppClass) OVR_PLATFORM_APP_ARGS(AppClass, ()) - - -#endif diff --git a/Samples/CommonSrc/Platform/OSX_Gamepad.cpp b/Samples/CommonSrc/Platform/OSX_Gamepad.cpp deleted file mode 100644 index 934319b..0000000 --- a/Samples/CommonSrc/Platform/OSX_Gamepad.cpp +++ /dev/null @@ -1,424 +0,0 @@ -/************************************************************************************ - -Filename : OSX_Gamepad.cpp -Content : OSX implementation of Gamepad functionality. -Created : May 6, 2013 -Authors : Lee Cooper - -Copyright : Copyright 2013 Oculus VR, Inc. All Rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -************************************************************************************/ - -#include "OSX_Gamepad.h" - - -static const UInt32 Logitech_F710_VendorID = 0x046D; -static const UInt32 Logitech_F710_ProductID = 0xC219; - -static const UInt32 Sony_DualShock3_VendorID = 0x054C; -static const UInt32 Sony_DualShock3_ProductID = 0x0268; - - -namespace OVR { namespace Platform { namespace OSX { - - -GamepadManager::GamepadManager() - : bStateChanged(false) -{ - - HidManager = IOHIDManagerCreate(kCFAllocatorDefault, kIOHIDOptionsTypeNone); - IOHIDManagerOpen(HidManager, kIOHIDOptionsTypeNone); - IOHIDManagerScheduleWithRunLoop(HidManager, - CFRunLoopGetCurrent(), - kCFRunLoopDefaultMode); - - - // Setup device matching. - CFStringRef keys[] = { CFSTR(kIOHIDDeviceUsagePageKey), - CFSTR(kIOHIDDeviceUsageKey)}; - - int value; - CFNumberRef values[2]; - CFDictionaryRef dictionaries[2]; - - // Match joysticks. - value = kHIDPage_GenericDesktop; - values[0] = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &value); - - value = kHIDUsage_GD_Joystick; - values[1] = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &value); - - dictionaries[0] = CFDictionaryCreate(kCFAllocatorDefault, - (const void **) keys, - (const void **) values, - 2, - &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); - CFRelease(values[0]); - CFRelease(values[1]); - - // Match gamepads. - value = kHIDPage_GenericDesktop; - values[0] = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &value); - - value = kHIDUsage_GD_GamePad; - values[1] = CFNumberCreate(kCFAllocatorDefault, kCFNumberSInt32Type, &value); - - dictionaries[1] = CFDictionaryCreate(kCFAllocatorDefault, - (const void **) keys, - (const void **) values, - 2, - &kCFTypeDictionaryKeyCallBacks, - &kCFTypeDictionaryValueCallBacks); - CFRelease(values[0]); - CFRelease(values[1]); - - CFArrayRef array = CFArrayCreate( kCFAllocatorDefault, - (const void **) dictionaries, - 2, - &kCFTypeArrayCallBacks); - CFRelease(dictionaries[0]); - CFRelease(dictionaries[1]); - - IOHIDManagerSetDeviceMatchingMultiple(HidManager, array); - - CFRelease(array); - - - IOHIDManagerRegisterDeviceMatchingCallback(HidManager, staticOnDeviceMatched, this); - IOHIDManagerRegisterDeviceRemovalCallback(HidManager, staticOnDeviceRemoved, this); - -} - -GamepadManager::~GamepadManager() -{ - CFRelease(HidManager); -} - -UInt32 GamepadManager::GetGamepadCount() -{ - return 1; -} - -bool GamepadManager::GetGamepadState(UInt32 index, GamepadState* pState) -{ - // For now we just support one gamepad. - OVR_UNUSED(index); - - if (!bStateChanged) - { - return false; - } - - bStateChanged = false; -// State.Debug(); - - *pState = State; - return true; -} - -int GamepadManager::getIntDeviceProperty(IOHIDDeviceRef device, CFStringRef key) -{ - CFTypeRef type = IOHIDDeviceGetProperty(device, key); - OVR_ASSERT(type != NULL && CFGetTypeID(type) == CFNumberGetTypeID()); - - int value; - CFNumberGetValue((CFNumberRef) type, kCFNumberSInt32Type, &value); - - return value; -} - -void GamepadManager::staticOnDeviceMatched(void* context, IOReturn result, void* sender, IOHIDDeviceRef device) -{ - GamepadManager* pManager = (GamepadManager*) context; - pManager->onDeviceMatched(device); -} - -void GamepadManager::onDeviceMatched(IOHIDDeviceRef device) -{ - IOHIDDeviceRegisterInputValueCallback(device, staticOnDeviceValueChanged, this); -} - -void GamepadManager::staticOnDeviceRemoved(void* context, IOReturn result, void* sender, IOHIDDeviceRef device) -{ - GamepadManager* pManager = (GamepadManager*) context; - pManager->onDeviceRemoved(device); -} - -void GamepadManager::onDeviceRemoved(IOHIDDeviceRef device) -{ - IOHIDDeviceRegisterInputValueCallback(device, NULL, NULL); -} - -void GamepadManager::staticOnDeviceValueChanged(void* context, IOReturn result, void* sender, IOHIDValueRef value) -{ - GamepadManager* pManager = (GamepadManager*) context; - pManager->onDeviceValueChanged(value); -} - -float GamepadManager::mapAnalogAxis(IOHIDValueRef value, IOHIDElementRef element) -{ - - CFIndex val = IOHIDValueGetIntegerValue(value); - CFIndex min = IOHIDElementGetLogicalMin(element); - CFIndex max = IOHIDElementGetLogicalMax(element); - - float v = (float) (val - min) / (float) (max - min); - v = v * 2.0f - 1.0f; - - // Dead zone. - if (v < 0.1f && v > -0.1f) - { - v = 0.0f; - } - - return v; -} - -bool GamepadManager::setStateIfDifferent(float& state, float newState) -{ - if (state == newState) - return false; - - state = newState; - - return true; -} - -void GamepadManager::onDeviceValueChanged(IOHIDValueRef value) -{ - - IOHIDElementRef element = IOHIDValueGetElement(value); - IOHIDDeviceRef device = IOHIDElementGetDevice(element); - - int vendorID = getIntDeviceProperty(device, CFSTR(kIOHIDVendorIDKey)); - int productID = getIntDeviceProperty(device, CFSTR(kIOHIDProductIDKey)); - OVR_UNUSED(productID); - - uint32_t usagePage = IOHIDElementGetUsagePage(element); - uint32_t usage = IOHIDElementGetUsage(element); - - // The following controller mapping is based on the Logitech F710, however we use it for - // all Logitech devices on the assumption that they're likely to share the same mapping. - if (vendorID == Logitech_F710_VendorID) - { - // Logitech F710 mapping. - if (usagePage == kHIDPage_Button) - { - bool buttonState = IOHIDValueGetIntegerValue(value); - - switch(usage) - { - case kHIDUsage_Button_1: - manipulateBitField(State.Buttons, Gamepad_X, buttonState); - break; - case kHIDUsage_Button_2: - manipulateBitField(State.Buttons, Gamepad_A, buttonState); - break; - case kHIDUsage_Button_3: - manipulateBitField(State.Buttons, Gamepad_B, buttonState); - break; - case kHIDUsage_Button_4: - manipulateBitField(State.Buttons, Gamepad_Y, buttonState); - break; - case 0x05: - manipulateBitField(State.Buttons, Gamepad_L1, buttonState); - break; - case 0x06: - manipulateBitField(State.Buttons, Gamepad_R1, buttonState); - break; - case 0x07: - State.LT = buttonState ? 1.0f:0.0f; - break; - case 0x08: - State.RT = buttonState ? 1.0f:0.0f; - break; - case 0x09: - manipulateBitField(State.Buttons, Gamepad_Back, buttonState); - break; - case 0x0A: - manipulateBitField(State.Buttons, Gamepad_Start, buttonState); - break; - case 0x0B: - manipulateBitField(State.Buttons, Gamepad_LStick, buttonState); - break; - case 0x0C: - manipulateBitField(State.Buttons, Gamepad_RStick, buttonState); - break; - default: - return; - } - } - else if (usagePage == kHIDPage_GenericDesktop) - { - float v; - switch(usage) - { - case kHIDUsage_GD_X: - v = mapAnalogAxis(value, element); - if (!setStateIfDifferent(State.LX, v)) - return; - break; - case kHIDUsage_GD_Y: - v = mapAnalogAxis(value, element); - if (!setStateIfDifferent(State.LY, -v)) - return; - break; - case kHIDUsage_GD_Z: - v = mapAnalogAxis(value, element); - if (!setStateIfDifferent(State.RX, v)) - return; - break; - case kHIDUsage_GD_Rz: - v = mapAnalogAxis(value, element); - if (!setStateIfDifferent(State.RY, -v)) - return; - break; - case kHIDUsage_GD_Hatswitch: - { - CFIndex integerValue = IOHIDValueGetIntegerValue(value); - - manipulateBitField(State.Buttons, - Gamepad_Up, - integerValue == 7 || integerValue == 0 || integerValue == 1); - manipulateBitField(State.Buttons, - Gamepad_Down, - integerValue == 3 || integerValue == 4 || integerValue == 5); - manipulateBitField(State.Buttons, - Gamepad_Left, - integerValue == 5 || integerValue == 6 || integerValue == 7); - manipulateBitField(State.Buttons, - Gamepad_Right, - integerValue == 1 || integerValue == 2 || integerValue == 3); - } - break; - default: - return; - } - } - } - // The following controller mapping is based on the Sony DualShock3, however we use it for - // all Sony devices on the assumption that they're likely to share the same mapping. - else if (vendorID == Sony_DualShock3_VendorID) - { - // PS3 Controller. - if (usagePage == kHIDPage_Button) - { - bool buttonState = IOHIDValueGetIntegerValue(value); - - switch(usage) - { - case kHIDUsage_Button_1: - manipulateBitField(State.Buttons, Gamepad_Back, buttonState); - break; - case kHIDUsage_Button_2: - manipulateBitField(State.Buttons, Gamepad_LStick, buttonState); - break; - case kHIDUsage_Button_3: - manipulateBitField(State.Buttons, Gamepad_RStick, buttonState); - break; - case kHIDUsage_Button_4: - manipulateBitField(State.Buttons, Gamepad_Start, buttonState); - break; - case 0x05: - manipulateBitField(State.Buttons, Gamepad_Up, buttonState); - break; - case 0x06: - manipulateBitField(State.Buttons, Gamepad_Right, buttonState); - break; - case 0x07: - manipulateBitField(State.Buttons, Gamepad_Down, buttonState); - break; - case 0x08: - manipulateBitField(State.Buttons, Gamepad_Left, buttonState); - break; - case 0x09: - State.LT = buttonState ? 1.0f:0.0f; - break; - case 0x0A: - State.RT = buttonState ? 1.0f:0.0f; - break; - case 0x0B: - manipulateBitField(State.Buttons, Gamepad_L1, buttonState); - break; - case 0x0C: - manipulateBitField(State.Buttons, Gamepad_R1, buttonState); - break; - case 0x0D: - // PS3 Triangle. - manipulateBitField(State.Buttons, Gamepad_TRIANGLE, buttonState); - break; - case 0x0E: - // PS3 Circle - manipulateBitField(State.Buttons, Gamepad_CIRCLE, buttonState); - break; - case 0x0F: - // PS3 Cross - manipulateBitField(State.Buttons, Gamepad_CROSS, buttonState); - break; - case 0x10: - // PS3 Square - manipulateBitField(State.Buttons, Gamepad_SQUARE, buttonState); - break; - default: - return; - } - } - else if (usagePage == kHIDPage_GenericDesktop) - { - float v; - switch(usage) - { - case kHIDUsage_GD_X: - v = mapAnalogAxis(value, element); - if (!setStateIfDifferent(State.LX, v)) - return; - break; - case kHIDUsage_GD_Y: - v = mapAnalogAxis(value, element); - if (!setStateIfDifferent(State.LY, -v)) - return; - break; - case kHIDUsage_GD_Z: - v = mapAnalogAxis(value, element); - if (!setStateIfDifferent(State.RX, v)) - return; - break; - case kHIDUsage_GD_Rz: - v = mapAnalogAxis(value, element); - if (!setStateIfDifferent(State.RY, -v)) - return; - break; - default: - return; - } - } - } - - bStateChanged = true; -} - -void GamepadManager::manipulateBitField(unsigned int& bitfield, unsigned int mask, bool val) -{ - if (val) - { - bitfield |= mask; - } - else - { - bitfield &= ~mask; - } -} - -}}} // OVR::Platform::OSX diff --git a/Samples/CommonSrc/Platform/OSX_Gamepad.h b/Samples/CommonSrc/Platform/OSX_Gamepad.h deleted file mode 100644 index 335a512..0000000 --- a/Samples/CommonSrc/Platform/OSX_Gamepad.h +++ /dev/null @@ -1,66 +0,0 @@ -/************************************************************************************ - -Filename : OSX_Gamepad.h -Content : OSX implementation of Gamepad functionality. -Created : May 6, 2013 -Authors : Lee Cooper - -Copyright : Copyright 2013 Oculus VR, Inc. All Rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. - -************************************************************************************/ - -#ifndef OVR_OSX_Gamepad_h -#define OVR_OSX_Gamepad_h - -#include <IOKit/IOKitLib.h> -#include <IOKit/hid/IOHIDManager.h> - -#include "Gamepad.h" - -namespace OVR { namespace Platform { namespace OSX { - - -class GamepadManager : public Platform::GamepadManager -{ -public: - GamepadManager(); - ~GamepadManager(); - - virtual UInt32 GetGamepadCount(); - virtual bool GetGamepadState(UInt32 index, GamepadState* pState); - -private: - static void staticOnDeviceMatched(void* context, IOReturn result, void* sender, IOHIDDeviceRef device); - void onDeviceMatched(IOHIDDeviceRef device); - - static void staticOnDeviceRemoved(void* context, IOReturn result, void* sender, IOHIDDeviceRef device); - void onDeviceRemoved(IOHIDDeviceRef device); - - static void staticOnDeviceValueChanged(void* context, IOReturn result, void* sender, IOHIDValueRef value); - void onDeviceValueChanged(IOHIDValueRef value); - - int getIntDeviceProperty(IOHIDDeviceRef device, CFStringRef key); - float mapAnalogAxis(IOHIDValueRef value, IOHIDElementRef element); - void manipulateBitField(unsigned int& bitfield, unsigned int mask, bool val); - bool setStateIfDifferent(float& state, float newState); - - IOHIDManagerRef HidManager; - GamepadState State; - bool bStateChanged; -}; - -}}} - -#endif // OVR_OSX_Gamepad_h diff --git a/Samples/CommonSrc/Platform/OSX_Platform.h b/Samples/CommonSrc/Platform/OSX_Platform.h deleted file mode 100644 index 11d4279..0000000 --- a/Samples/CommonSrc/Platform/OSX_Platform.h +++ /dev/null @@ -1,80 +0,0 @@ - -#include "../Platform/Platform.h" -#include "../Render/Render_GL_Device.h" - -namespace OVR { namespace Platform { namespace OSX { - -class PlatformCore : public Platform::PlatformCore -{ -public: - void* Win; - void* View; - void* NsApp; - bool Quit; - int ExitCode; - int Width, Height; - MouseMode MMode; - - void RunIdle(); - -public: - PlatformCore(Application* app, void* nsapp); - ~PlatformCore(); - - bool SetupWindow(int w, int h); - void Exit(int exitcode); - - RenderDevice* SetupGraphics(const SetupGraphicsDeviceSet& setupGraphicsDesc, - const char* gtype, const Render::RendererParams& rp); - - void SetMouseMode(MouseMode mm); - void GetWindowSize(int* w, int* h) const; - - void SetWindowTitle(const char*title); - - void ShowWindow(bool show); - void DestroyWindow(); - bool SetFullscreen(const Render::RendererParams& rp, int fullscreen); - int GetDisplayCount(); - Render::DisplayId GetDisplay(int screen); - - String GetContentDirectory() const; -}; - -}} -namespace Render { namespace GL { namespace OSX { - -class RenderDevice : public Render::GL::RenderDevice -{ -public: - void* Context; - - RenderDevice(const Render::RendererParams& p, void* context) - : GL::RenderDevice(p), Context(context) {} - - virtual void Shutdown(); - virtual void Present(); - - virtual bool SetFullscreen(DisplayMode fullscreen); - - // oswnd = X11::PlatformCore* - static Render::RenderDevice* CreateDevice(const RendererParams& rp, void* oswnd); -}; - -}}}} - - -// OVR_PLATFORM_APP_ARGS specifies the Application class to use for startup, -// providing it with startup arguments. -#define OVR_PLATFORM_APP_ARGS(AppClass, args) \ -OVR::Platform::Application* OVR::Platform::Application::CreateApplication() \ -{ OVR::System::Init(OVR::Log::ConfigureDefaultLog(OVR::LogMask_All)); \ -return new AppClass args; } \ -void OVR::Platform::Application::DestroyApplication(OVR::Platform::Application* app) \ -{ OVR::Platform::PlatformCore* platform = app->pPlatform; \ -delete app; delete platform; OVR::System::Destroy(); }; - -// OVR_PLATFORM_APP_ARGS specifies the Application startup class with no args. -#define OVR_PLATFORM_APP(AppClass) OVR_PLATFORM_APP_ARGS(AppClass, ()) - - diff --git a/Samples/CommonSrc/Platform/OSX_Platform.mm b/Samples/CommonSrc/Platform/OSX_Platform.mm deleted file mode 100644 index 491ff6c..0000000 --- a/Samples/CommonSrc/Platform/OSX_Platform.mm +++ /dev/null @@ -1,514 +0,0 @@ - -#import "../Platform/OSX_PlatformObjc.h" - -using namespace OVR; -using namespace OVR::Platform; - -@implementation OVRApp - -- (void)dealloc -{ - [super dealloc]; -} - -- (void)run -{ - NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; - _running = YES; - OVR::Platform::Application* app; - { - using namespace OVR; - using namespace OVR::Platform; - - // CreateApplication must be the first call since it does OVR::System::Initialize. - app = Application::CreateApplication(); - OSX::PlatformCore* platform = new OSX::PlatformCore(app, self); - // The platform attached to an app will be deleted by DestroyApplication. - app->SetPlatformCore(platform); - - [self setApp:app]; - [self setPlatform:platform]; - - const char* argv[] = {"OVRApp"}; - int exitCode = app->OnStartup(1, argv); - if (exitCode) - { - Application::DestroyApplication(app); - exit(exitCode); - } - } - [self finishLaunching]; - [pool drain]; - - while ([self isRunning]) - { - pool = [[NSAutoreleasePool alloc] init]; - NSEvent* event = [self nextEventMatchingMask:NSAnyEventMask untilDate:nil inMode:NSDefaultRunLoopMode dequeue:YES]; - if (event) - { - [self sendEvent:event]; - } - _App->OnIdle(); - [pool drain]; - } - OVR::Platform::Application::DestroyApplication(app); -} - -@end - -static int KeyMap[][2] = -{ - { NSDeleteFunctionKey, OVR::Key_Delete }, - { '\t', OVR::Key_Tab }, - { '\n', OVR::Key_Return }, - { NSPauseFunctionKey, OVR::Key_Pause }, - { 27, OVR::Key_Escape }, - { 127, OVR::Key_Backspace }, - { ' ', OVR::Key_Space }, - { NSPageUpFunctionKey, OVR::Key_PageUp }, - { NSPageDownFunctionKey, OVR::Key_PageDown }, - { NSNextFunctionKey, OVR::Key_PageDown }, - { NSEndFunctionKey, OVR::Key_End }, - { NSHomeFunctionKey, OVR::Key_Home }, - { NSLeftArrowFunctionKey, OVR::Key_Left }, - { NSUpArrowFunctionKey, OVR::Key_Up }, - { NSRightArrowFunctionKey, OVR::Key_Right }, - { NSDownArrowFunctionKey, OVR::Key_Down }, - { NSInsertFunctionKey, OVR::Key_Insert }, - { NSDeleteFunctionKey, OVR::Key_Delete }, - { NSHelpFunctionKey, OVR::Key_Insert }, -}; - - -static KeyCode MapToKeyCode(wchar_t vk) -{ - unsigned key = Key_None; - - if ((vk >= 'a') && (vk <= 'z')) - { - key = vk - 'a' + Key_A; - } - else if ((vk >= ' ') && (vk <= '~')) - { - key = vk; - } - else if ((vk >= '0') && (vk <= '9')) - { - key = vk - '0' + Key_Num0; - } - else if ((vk >= NSF1FunctionKey) && (vk <= NSF15FunctionKey)) - { - key = vk - NSF1FunctionKey + Key_F1; - } - else - { - for (unsigned i = 0; i< (sizeof(KeyMap) / sizeof(KeyMap[1])); i++) - { - if (vk == KeyMap[i][0]) - { - key = KeyMap[i][1]; - break; - } - } - } - - return (KeyCode)key; -} - -static int MapModifiers(unsigned long xmod) -{ - int mod = 0; - if (xmod & NSShiftKeyMask) - mod |= OVR::Platform::Mod_Shift; - if (xmod & NSCommandKeyMask) - mod |= OVR::Platform::Mod_Control; - if (xmod & NSAlternateKeyMask) - mod |= OVR::Platform::Mod_Alt; - if (xmod & NSControlKeyMask) - mod |= OVR::Platform::Mod_Meta; - return mod; -} - -@implementation OVRView - --(BOOL) acceptsFirstResponder -{ - return YES; -} --(BOOL) acceptsFirstMouse:(NSEvent *)ev -{ - return YES; -} - -+(CGDirectDisplayID) displayFromScreen:(NSScreen *)s -{ - NSNumber* didref = (NSNumber*)[[s deviceDescription] objectForKey:@"NSScreenNumber"]; - CGDirectDisplayID disp = (CGDirectDisplayID)[didref longValue]; - return disp; -} - --(void) warpMouseToCenter -{ - NSPoint w; - w.x = _Platform->Width/2.0f; - w.y = _Platform->Height/2.0f; - w = [[self window] convertBaseToScreen:w]; - CGDirectDisplayID disp = [OVRView displayFromScreen:[[self window] screen]]; - CGPoint p = {w.x, CGDisplayPixelsHigh(disp)-w.y}; - CGDisplayMoveCursorToPoint(disp, p); -} - -static bool LookupKey(NSEvent* ev, wchar_t& ch, OVR::KeyCode& key, unsigned& mods) -{ - NSString* chars = [ev charactersIgnoringModifiers]; - if ([chars length] == 0) - return false; - ch = [chars characterAtIndex:0]; - mods = MapModifiers([ev modifierFlags]); - - // check for Cmd+Latin Letter - NSString* modchars = [ev characters]; - if ([modchars length]) - { - wchar_t modch = [modchars characterAtIndex:0]; - if (modch >= 'a' && modch <= 'z') - ch = modch; - } - key = MapToKeyCode(ch); - return true; -} - --(void) keyDown:(NSEvent*)ev -{ - OVR::KeyCode key; - unsigned mods; - wchar_t ch; - if (!LookupKey(ev, ch, key, mods)) - return; - if (key == Key_Escape && _Platform->MMode == Mouse_Relative) - { - [self warpMouseToCenter]; - CGAssociateMouseAndMouseCursorPosition(true); - [NSCursor unhide]; - _Platform->MMode = Mouse_RelativeEscaped; - } - _App->OnKey(key, ch, true, mods); -} --(void) keyUp:(NSEvent*)ev -{ - OVR::KeyCode key; - unsigned mods; - wchar_t ch; - if (LookupKey(ev, ch, key, mods)) - _App->OnKey(key, ch, false, mods); -} - -static const OVR::KeyCode ModifierKeys[] = {OVR::Key_None, OVR::Key_Shift, OVR::Key_Control, OVR::Key_Alt, OVR::Key_Meta}; - --(void)flagsChanged:(NSEvent *)ev -{ - unsigned long cmods = [ev modifierFlags]; - if ((cmods & 0xffff0000) != _Modifiers) - { - uint32_t mods = MapModifiers(cmods); - for (int i = 1; i <= 4; i++) - { - unsigned long m = (1 << (16+i)); - if ((cmods & m) != (_Modifiers & m)) - { - if (cmods & m) - _App->OnKey(ModifierKeys[i], 0, true, mods); - else - _App->OnKey(ModifierKeys[i], 0, false, mods); - } - } - _Modifiers = cmods & 0xffff0000; - } -} - --(void)ProcessMouse:(NSEvent*)ev -{ - switch ([ev type]) - { - case NSLeftMouseDragged: - case NSRightMouseDragged: - case NSOtherMouseDragged: - case NSMouseMoved: - { - if (_Platform->MMode == OVR::Platform::Mouse_Relative) - { - int dx = [ev deltaX]; - int dy = [ev deltaY]; - - if (dx != 0 || dy != 0) - { - _App->OnMouseMove(dx, dy, Mod_MouseRelative|MapModifiers([ev modifierFlags])); - [self warpMouseToCenter]; - } - } - else - { - NSPoint p = [ev locationInWindow]; - _App->OnMouseMove(p.x, p.y, MapModifiers([ev modifierFlags])); - } - } - break; - case NSLeftMouseDown: - case NSRightMouseDown: - case NSOtherMouseDown: - break; - } -} - --(void) mouseMoved:(NSEvent*)ev -{ - [self ProcessMouse:ev]; -} --(void) mouseDragged:(NSEvent*)ev -{ - [self ProcessMouse:ev]; -} --(void) mouseDown:(NSEvent*)ev -{ - if (_Platform->MMode == Mouse_RelativeEscaped) - { - [self warpMouseToCenter]; - CGAssociateMouseAndMouseCursorPosition(false); - [NSCursor hide]; - _Platform->MMode = Mouse_Relative; - } -} - -//-(void) - --(id) initWithFrame:(NSRect)frameRect -{ - NSOpenGLPixelFormatAttribute attr[] = - {NSOpenGLPFAWindow, NSOpenGLPFADoubleBuffer, NSOpenGLPFADepthSize, 24, nil}; - - NSOpenGLPixelFormat *pf = [[[NSOpenGLPixelFormat alloc] initWithAttributes:attr] autorelease]; - - self = [super initWithFrame:frameRect pixelFormat:pf]; - GLint swap = 0; - [[self openGLContext] setValues:&swap forParameter:NSOpenGLCPSwapInterval]; - //[self setWantsBestResolutionOpenGLSurface:YES]; - return self; -} - --(void) reshape -{ - NSRect bounds = [self bounds]; - _App->OnResize(bounds.size.width, bounds.size.height); - - _Platform->Width = bounds.size.width; - _Platform->Height = bounds.size.height; - - if (_Platform->GetRenderer()) - _Platform->GetRenderer()->SetWindowSize(bounds.size.width, bounds.size.height); -} - --(BOOL)windowShouldClose:(id)sender -{ - if (_Platform) - _Platform->Exit(0); - else - exit(0); - return 1; -} - -@end - -namespace OVR { namespace Platform { namespace OSX { - -PlatformCore::PlatformCore(Application* app, void* nsapp) - : Platform::PlatformCore(app), NsApp(nsapp), Win(NULL), View(NULL), Quit(0), MMode(Mouse_Normal) -{ - pGamepadManager = *new OSX::GamepadManager(); -} -PlatformCore::~PlatformCore() -{ -} - -void PlatformCore::Exit(int exitcode) -{ - OVRApp* nsApp = (OVRApp*)NsApp; - [nsApp stop:nil]; -} - -String PlatformCore::GetContentDirectory() const -{ - NSBundle* bundle = [NSBundle mainBundle]; - if (bundle) - return String([[bundle bundlePath] UTF8String]) + "/Contents/Resources"; - else - return "."; -} - - -void PlatformCore::SetMouseMode(MouseMode mm) -{ - if (mm == MMode) - return; - - if (Win) - { - if (mm == Mouse_Relative) - { - [NSCursor hide]; - [(OVRView*)View warpMouseToCenter]; - CGAssociateMouseAndMouseCursorPosition(false); - } - else - { - if (MMode == Mouse_Relative) - { - CGAssociateMouseAndMouseCursorPosition(true); - [NSCursor unhide]; - [(OVRView*)View warpMouseToCenter]; - } - } - } - MMode = mm; -} - - -void PlatformCore::GetWindowSize(int* w, int* h) const -{ - *w = Width; - *h = Height; -} - -bool PlatformCore::SetupWindow(int w, int h) -{ - NSRect winrect; - winrect.origin.x = 0; - winrect.origin.y = 1000; - winrect.size.width = w; - winrect.size.height = h; - NSWindow* win = [[NSWindow alloc] initWithContentRect:winrect styleMask:NSTitledWindowMask|NSClosableWindowMask backing:NSBackingStoreBuffered defer:NO]; - - OVRView* view = [[OVRView alloc] initWithFrame:winrect]; - [view setPlatform:this]; - [win setContentView:view]; - [win setAcceptsMouseMovedEvents:YES]; - [win setDelegate:view]; - [view setApp:pApp]; - Win = win; - View = view; - return 1; -} - -void PlatformCore::SetWindowTitle(const char* title) -{ - [((NSWindow*)Win) setTitle:[[NSString alloc] initWithBytes:title length:strlen(title) encoding:NSUTF8StringEncoding]]; -} - -void PlatformCore::ShowWindow(bool show) -{ - if (show) - [((NSWindow*)Win) makeKeyAndOrderFront:nil]; - else - [((NSWindow*)Win) orderOut:nil]; -} - -void PlatformCore::DestroyWindow() -{ - [((NSWindow*)Win) close]; - Win = NULL; -} - -RenderDevice* PlatformCore::SetupGraphics(const SetupGraphicsDeviceSet& setupGraphicsDesc, - const char* type, const Render::RendererParams& rp) -{ - const SetupGraphicsDeviceSet* setupDesc = setupGraphicsDesc.PickSetupDevice(type); - OVR_ASSERT(setupDesc); - - pRender = *setupDesc->pCreateDevice(rp, this); - if (pRender) - pRender->SetWindowSize(Width, Height); - - return pRender.GetPtr(); -} - -int PlatformCore::GetDisplayCount() -{ - return (int)[[NSScreen screens] count]; -} - -Render::DisplayId PlatformCore::GetDisplay(int i) -{ - NSScreen* s = (NSScreen*)[[NSScreen screens] objectAtIndex:i]; - return Render::DisplayId([OVRView displayFromScreen:s]); -} - -bool PlatformCore::SetFullscreen(const Render::RendererParams& rp, int fullscreen) -{ - if (fullscreen == Render::Display_Window) - [(OVRView*)View exitFullScreenModeWithOptions:nil]; - else - { - NSScreen* usescreen = [NSScreen mainScreen]; - NSArray* screens = [NSScreen screens]; - for (int i = 0; i < [screens count]; i++) - { - NSScreen* s = (NSScreen*)[screens objectAtIndex:i]; - CGDirectDisplayID disp = [OVRView displayFromScreen:s]; - - if (disp == rp.Display.CgDisplayId) - usescreen = s; - } - - [(OVRView*)View enterFullScreenMode:usescreen withOptions:nil]; - } - - if (pRender) - pRender->SetFullscreen((Render::DisplayMode)fullscreen); - return 1; -} - -}} -// GL -namespace Render { namespace GL { namespace OSX { - -Render::RenderDevice* RenderDevice::CreateDevice(const RendererParams& rp, void* oswnd) -{ - Platform::OSX::PlatformCore* PC = (Platform::OSX::PlatformCore*)oswnd; - - OVRView* view = (OVRView*)PC->View; - NSOpenGLContext *context = [view openGLContext]; - if (!context) - return NULL; - - [context makeCurrentContext]; - [((NSWindow*)PC->Win) makeKeyAndOrderFront:nil]; - - return new Render::GL::OSX::RenderDevice(rp, context); -} - -void RenderDevice::Present() -{ - NSOpenGLContext *context = (NSOpenGLContext*)Context; - [context flushBuffer]; -} - -void RenderDevice::Shutdown() -{ - Context = NULL; -} - -bool RenderDevice::SetFullscreen(DisplayMode fullscreen) -{ - Params.Fullscreen = fullscreen; - return 1; -} - -}}}} - - -int main(int argc, char *argv[]) -{ - NSApplication* nsapp = [OVRApp sharedApplication]; - [nsapp run]; - return 0; -} - diff --git a/Samples/CommonSrc/Platform/OSX_PlatformObjc.h b/Samples/CommonSrc/Platform/OSX_PlatformObjc.h deleted file mode 100644 index 7d195eb..0000000 --- a/Samples/CommonSrc/Platform/OSX_PlatformObjc.h +++ /dev/null @@ -1,31 +0,0 @@ - -#import <Cocoa/Cocoa.h> -#import "OSX_Platform.h" -#import "OSX_Gamepad.h" - -#import <CoreGraphics/CoreGraphics.h> -#import <CoreGraphics/CGDirectDisplay.h> - -@interface OVRApp : NSApplication - -@property (assign) IBOutlet NSWindow* win; -@property (assign) OVR::Platform::OSX::PlatformCore* Platform; -@property (assign) OVR::Platform::Application* App; - --(void) run; - -@end - -@interface OVRView : NSOpenGLView <NSWindowDelegate> - -@property (assign) OVR::Platform::OSX::PlatformCore* Platform; -@property (assign) OVR::Platform::Application* App; -@property unsigned long Modifiers; - --(void)ProcessMouse:(NSEvent*)event; --(void)warpMouseToCenter; - -+(CGDirectDisplayID) displayFromScreen:(NSScreen*)s; - -@end - diff --git a/Samples/CommonSrc/Platform/OSX_WavPlayer.cpp b/Samples/CommonSrc/Platform/OSX_WavPlayer.cpp deleted file mode 100644 index a6cb937..0000000 --- a/Samples/CommonSrc/Platform/OSX_WavPlayer.cpp +++ /dev/null @@ -1,242 +0,0 @@ -/************************************************************************************ - -Filename : WavPlayer_OSX.cpp -Content : An Apple OSX audio handler. -Created : March 5, 2013 -Authors : Robotic Arm Software - Peter Hoff, Dan Goodman, Bryan Croteau - -Copyright : Copyright 2013 Oculus VR, Inc. All Rights reserved. - -Use of this software is subject to the terms of the Oculus LLC license -agreement provided at the time of installation or download, or which -otherwise accompanies this software in either electronic or hard copy form. - -************************************************************************************/ - -#include "OSX_WavPlayer.h" - -namespace OVR { namespace Platform { namespace OSX { - -WavPlayer::WavPlayer(const char* fileName) -{ - FileName = fileName; -} - -bool WavPlayer::isDataChunk(unsigned char* buffer, int index) -{ - unsigned char a = buffer[index]; - unsigned char b = buffer[index + 1]; - unsigned char c = buffer[index + 2]; - unsigned char d = buffer[index + 3]; - return (a == 'D' || a == 'd') && (b == 'A' || b == 'a') && - (c == 'T' || c == 't') && (d == 'A' || d == 'a'); -} - -int WavPlayer::getWord(unsigned char* buffer, int index) -{ - unsigned char a = buffer[index]; - unsigned char b = buffer[index + 1]; - unsigned char c = buffer[index + 2]; - unsigned char d = buffer[index + 3]; - int result = 0; - result |= a; - result |= b << 8; - result |= c << 16; - result |= d << 24; - return result; -} - -short WavPlayer::getHalf(unsigned char* buffer, int index) -{ - unsigned char a = buffer[index]; - unsigned char b = buffer[index + 1]; - short result = 0; - result |= a; - result |= b << 8; - return result; -} - -void *WavPlayer::LoadPCM(const char *filename, unsigned long *len) -{ - FILE *file; - struct stat s; - void *pcm; - - if(stat(filename, &s)) - { - return NULL; - } - *len = s.st_size; - pcm = (void *) malloc(s.st_size); - if(!pcm) - { - return NULL; - } - file = fopen(filename, "rb"); - if(!file) - { - free(pcm); - return NULL; - } - fread(pcm, s.st_size, 1, file); - fclose(file); - return pcm; -} - -int WavPlayer::PlayBuffer(void *pcmbuffer, unsigned long len) -{ - AQCallbackStruct aqc; - UInt32 err, bufferSize; - int i; - - aqc.DataFormat.mSampleRate = SampleRate; - aqc.DataFormat.mFormatID = kAudioFormatLinearPCM; - if(BitsPerSample == 16) - { - aqc.DataFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger - | kAudioFormatFlagIsPacked; - } - aqc.DataFormat.mBytesPerPacket = NumChannels * (BitsPerSample / 8); - aqc.DataFormat.mFramesPerPacket = 1; - aqc.DataFormat.mBytesPerFrame = NumChannels * (BitsPerSample / 8); - aqc.DataFormat.mChannelsPerFrame = NumChannels; - aqc.DataFormat.mBitsPerChannel = BitsPerSample; - aqc.FrameCount = SampleRate / 60; - aqc.SampleLen = (UInt32)(len); - aqc.PlayPtr = 0; - aqc.PCMBuffer = static_cast<unsigned char*>(pcmbuffer); - - err = AudioQueueNewOutput(&aqc.DataFormat, - aqBufferCallback, - &aqc, - NULL, - kCFRunLoopCommonModes, - 0, - &aqc.Queue); - if(err) - { - return err; - } - - aqc.FrameCount = SampleRate / 60; - bufferSize = aqc.FrameCount * aqc.DataFormat.mBytesPerPacket; - - for(i = 0; i < AUDIO_BUFFERS; i++) - { - err = AudioQueueAllocateBuffer(aqc.Queue, bufferSize, - &aqc.Buffers[i]); - if(err) - { - return err; - } - aqBufferCallback(&aqc, aqc.Queue, aqc.Buffers[i]); - } - - err = AudioQueueStart(aqc.Queue, NULL); - if(err) - { - return err; - } - - while(true) - { - } - sleep(1); - return 0; -} - -void WavPlayer::aqBufferCallback(void *in, AudioQueueRef inQ, AudioQueueBufferRef outQB) -{ - AQCallbackStruct *aqc; - unsigned char *coreAudioBuffer; - - aqc = (AQCallbackStruct *) in; - coreAudioBuffer = (unsigned char*) outQB->mAudioData; - - printf("Sync: %u / %u\n", aqc->PlayPtr, aqc->SampleLen); - - if(aqc->FrameCount > 0) - { - outQB->mAudioDataByteSize = aqc->DataFormat.mBytesPerFrame * aqc->FrameCount; - for(int i = 0; i < aqc->FrameCount * aqc->DataFormat.mBytesPerFrame; i++) - { - if(aqc->PlayPtr > aqc->SampleLen) - { - aqc->PlayPtr = 0; - i = 0; - } - coreAudioBuffer[i] = aqc->PCMBuffer[aqc->PlayPtr]; - aqc->PlayPtr++; - } - AudioQueueEnqueueBuffer(inQ, outQB, 0, NULL); - } -} - -int WavPlayer::PlayAudio() -{ - unsigned long len; - void *pcmbuffer; - int ret; - - pcmbuffer = LoadPCM(FileName, &len); - if(!pcmbuffer) - { - fprintf(stderr, "%s: %s\n", FileName, strerror(errno)); - exit(EXIT_FAILURE); - } - - unsigned char* bytes = (unsigned char*)pcmbuffer; - int index = 0; - - // 'RIFF' - getWord(bytes, index); - index += 4; - // int Length - getWord(bytes, index); - index += 4; - // 'WAVE' - getWord(bytes, index); - index += 4; - // 'fmt ' - getWord(bytes, index); - index += 4; - - // int Format Length - int fmtLen = getWord(bytes, index); - index += 4; - AudioFormat = getHalf(bytes, index); - index += 2; - NumChannels = getHalf(bytes, index); - index += 2; - SampleRate = getWord(bytes, index); - index += 4; - ByteRate = getWord(bytes, index); - index += 4; - BlockAlign = getHalf(bytes, index); - index += 2; - BitsPerSample = getHalf(bytes, index); - index += 2; - index += fmtLen - 16; - while(!isDataChunk(bytes, index)) - { - // Any Chunk - getWord(bytes, index); - index += 4; - // Any Chunk Length - int anyChunkLen = getWord(bytes, index); - index += 4 + anyChunkLen; - } - // 'data' - getWord(bytes, index); - index += 4; - // int Data Length - unsigned long dataLen = getWord(bytes, index); - index += 4; - unsigned char* target = &bytes[index]; - - ret = PlayBuffer((void *)target, dataLen); - free(pcmbuffer); - return ret; -} - -}}} diff --git a/Samples/CommonSrc/Platform/OSX_WavPlayer.h b/Samples/CommonSrc/Platform/OSX_WavPlayer.h deleted file mode 100644 index 4aaba10..0000000 --- a/Samples/CommonSrc/Platform/OSX_WavPlayer.h +++ /dev/null @@ -1,64 +0,0 @@ -/************************************************************************************ - -Filename : WavPlayer_OSX.h -Content : An Apple OSX audio handler. -Created : March 5, 2013 -Authors : Robotic Arm Software - Peter Hoff, Dan Goodman, Bryan Croteau - -Copyright : Copyright 2013 Oculus VR, Inc. All Rights reserved. - -Use of this software is subject to the terms of the Oculus LLC license -agreement provided at the time of installation or download, or which -otherwise accompanies this software in either electronic or hard copy form. - -************************************************************************************/ - -#ifndef OVR_WavPlayer_h -#define OVR_WavPlayer_h - -#include <stdio.h> -#include <stdlib.h> -#include <errno.h> -#include <sys/stat.h> -#include <AudioToolbox/AudioQueue.h> - -#define AUDIO_BUFFERS 4 - -namespace OVR { namespace Platform { namespace OSX { - -typedef struct AQCallbackStruct -{ - AudioQueueRef Queue; - UInt32 FrameCount; - AudioQueueBufferRef Buffers[AUDIO_BUFFERS]; - AudioStreamBasicDescription DataFormat; - UInt32 PlayPtr; - UInt32 SampleLen; - unsigned char* PCMBuffer; -} AQCallbackStruct; - -class WavPlayer -{ -public: - WavPlayer(const char* fileName); - int PlayAudio(); -private: - bool isDataChunk(unsigned char* buffer, int index); - int getWord(unsigned char* buffer, int index); - short getHalf(unsigned char* buffer, int index); - void *LoadPCM(const char *filename, unsigned long *len); - int PlayBuffer(void *pcm, unsigned long len); - static void aqBufferCallback(void *in, AudioQueueRef inQ, AudioQueueBufferRef outQB); - - short AudioFormat; - short NumChannels; - int SampleRate; - int ByteRate; - short BlockAlign; - short BitsPerSample; - const char* FileName; -}; - -}}} - -#endif diff --git a/Samples/CommonSrc/Platform/Platform.cpp b/Samples/CommonSrc/Platform/Platform.cpp index c0e4438..108c7f5 100644 --- a/Samples/CommonSrc/Platform/Platform.cpp +++ b/Samples/CommonSrc/Platform/Platform.cpp @@ -52,12 +52,12 @@ PlatformCore::PlatformCore(Application *app) { pApp = app; pApp->SetPlatformCore(this); - StartupTicks = OVR::Timer::GetTicks(); + StartupSeconds = OVR::Timer::GetSeconds(); } double PlatformCore::GetAppTime() const { - return (OVR::Timer::GetTicks() - StartupTicks) * (1.0 / (double)OVR::Timer::MksPerSecond); + return OVR::Timer::GetSeconds() - StartupSeconds; } bool PlatformCore::SetFullscreen(const Render::RendererParams&, int fullscreen) diff --git a/Samples/CommonSrc/Platform/Platform.h b/Samples/CommonSrc/Platform/Platform.h index 201aad6..47d8f67 100644 --- a/Samples/CommonSrc/Platform/Platform.h +++ b/Samples/CommonSrc/Platform/Platform.h @@ -111,7 +111,7 @@ protected: Application* pApp; Ptr<RenderDevice> pRender; Ptr<GamepadManager> pGamepadManager; - UInt64 StartupTicks; + double StartupSeconds; public: PlatformCore(Application *app); diff --git a/Samples/CommonSrc/Platform/Platform_Default.h b/Samples/CommonSrc/Platform/Platform_Default.h index e4fecf2..420b088 100644 --- a/Samples/CommonSrc/Platform/Platform_Default.h +++ b/Samples/CommonSrc/Platform/Platform_Default.h @@ -29,17 +29,18 @@ limitations under the License. #if defined(OVR_OS_WIN32) #include "Win32_Platform.h" - + #include "../Render/Render_D3D11_Device.h" #undef OVR_D3D_VERSION #include "../Render/Render_D3D10_Device.h" -// #include "../Render/Render_GL_Win32_Device.h" + #include "../Render/Render_GL_Win32_Device.h" // Modify this list or pass a smaller set to select a specific render device, // while avoiding linking extra classes. - #define OVR_DEFAULT_RENDER_DEVICE_SET \ - SetupGraphicsDeviceSet("D3D11", &OVR::Render::D3D11::RenderDevice::CreateDevice, \ - SetupGraphicsDeviceSet("D3D10", &OVR::Render::D3D10::RenderDevice::CreateDevice) ) + #define OVR_DEFAULT_RENDER_DEVICE_SET \ + SetupGraphicsDeviceSet("D3D11", &OVR::Render::D3D11::RenderDevice::CreateDevice, \ + SetupGraphicsDeviceSet("D3D10", &OVR::Render::D3D10::RenderDevice::CreateDevice, \ + SetupGraphicsDeviceSet("GL", &OVR::Render::GL::Win32::RenderDevice::CreateDevice))) #elif defined(OVR_OS_MAC) && !defined(OVR_MAC_X11) #include "OSX_Platform.h" diff --git a/Samples/CommonSrc/Platform/Win32_Gamepad.cpp b/Samples/CommonSrc/Platform/Win32_Gamepad.cpp index 9b8793f..ce7af63 100644 --- a/Samples/CommonSrc/Platform/Win32_Gamepad.cpp +++ b/Samples/CommonSrc/Platform/Win32_Gamepad.cpp @@ -5,7 +5,7 @@ Content : Win32 implementation of Platform app infrastructure Created : May 6, 2013 Authors : Lee Cooper -Copyright : Copyright 2013 Oculus VR, Inc. All Rights reserved. +Copyright : Copyright 2012 Oculus VR, Inc. All Rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/Samples/CommonSrc/Platform/Win32_Gamepad.h b/Samples/CommonSrc/Platform/Win32_Gamepad.h index 09815ae..e3f81af 100644 --- a/Samples/CommonSrc/Platform/Win32_Gamepad.h +++ b/Samples/CommonSrc/Platform/Win32_Gamepad.h @@ -5,7 +5,7 @@ Content : Win32 implementation of Gamepad functionality. Created : May 6, 2013 Authors : Lee Cooper -Copyright : Copyright 2013 Oculus VR, Inc. All Rights reserved. +Copyright : Copyright 2012 Oculus VR, Inc. All Rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/Samples/CommonSrc/Platform/Win32_Platform.cpp b/Samples/CommonSrc/Platform/Win32_Platform.cpp index eeab429..0614a3f 100644 --- a/Samples/CommonSrc/Platform/Win32_Platform.cpp +++ b/Samples/CommonSrc/Platform/Win32_Platform.cpp @@ -21,6 +21,8 @@ limitations under the License. ************************************************************************************/ +#include <Windows.h> + #include "Kernel/OVR_System.h" #include "Kernel/OVR_Array.h" #include "Kernel/OVR_String.h" @@ -177,7 +179,7 @@ static UByte KeyMap[][2] = { VK_OEM_MINUS, Key_Minus }, { VK_OEM_PERIOD,Key_Period }, { VK_OEM_2, Key_Slash }, - { VK_OEM_3, Key_Bar }, + { VK_OEM_3, Key_Backtick }, { VK_OEM_4, Key_BracketLeft }, { VK_OEM_5, Key_Backslash }, { VK_OEM_6, Key_BracketRight }, @@ -418,9 +420,9 @@ int PlatformCore::Run() if (IsIconic(hWnd)) { Sleep(10); + } } } - } return ExitCode; } @@ -545,6 +547,7 @@ Render::DisplayId PlatformCore::GetDisplay(int screen) OVR::Platform::Application* g_app; + int WINAPI WinMain(HINSTANCE hinst, HINSTANCE prevInst, LPSTR inArgs, int show) { using namespace OVR; diff --git a/Samples/CommonSrc/Platform/Win32_Platform.h b/Samples/CommonSrc/Platform/Win32_Platform.h index 6081968..23f0b70 100644 --- a/Samples/CommonSrc/Platform/Win32_Platform.h +++ b/Samples/CommonSrc/Platform/Win32_Platform.h @@ -98,4 +98,14 @@ KeyCode MapVKToKeyCode(unsigned vk); // OVR_PLATFORM_APP_ARGS specifies the Application startup class with no args. #define OVR_PLATFORM_APP(AppClass) OVR_PLATFORM_APP_ARGS(AppClass, ()) +#define OVR_PLATFORM_APP_ARGS_WITH_LOG(AppClass, LogClass, args) \ + OVR::Platform::Application* OVR::Platform::Application::CreateApplication() \ + { static LogClass log; OVR::System::Init(&log); \ + return new AppClass args; } \ + void OVR::Platform::Application::DestroyApplication(OVR::Platform::Application* app) \ + { OVR::Platform::PlatformCore* platform = app->pPlatform; \ + delete app; delete platform; OVR::System::Destroy(); }; + +#define OVR_PLATFORM_APP_WITH_LOG(AppClass,LogClass) OVR_PLATFORM_APP_ARGS_WITH_LOG(AppClass,LogClass, ()) + #endif // OVR_Win32_Platform_h |