diff options
author | Brad Davis <[email protected]> | 2013-10-13 20:28:58 -0700 |
---|---|---|
committer | Brad Davis <[email protected]> | 2013-10-13 20:28:58 -0700 |
commit | 672cdd0ef5455cd62a0d7f7eb6b9889f3ea35f21 (patch) | |
tree | f3454dc864242744aef1ea5474b5011556d0f388 /Samples/OculusRoomTiny | |
parent | 1408ed7b208c7a1cff1a2448fc890e9b8bd6dc4e (diff) |
Updating to cmake, glew, xrandr
Diffstat (limited to 'Samples/OculusRoomTiny')
15 files changed, 418 insertions, 3325 deletions
diff --git a/Samples/OculusRoomTiny/CMakeLists.txt b/Samples/OculusRoomTiny/CMakeLists.txt new file mode 100644 index 0000000..6db3e6e --- /dev/null +++ b/Samples/OculusRoomTiny/CMakeLists.txt @@ -0,0 +1,39 @@ +project(OculusRoomTiny) + +set(SOURCE_FILES + MessageBox.cpp + MessageBox.h + OculusRoomTiny.cpp + OculusRoomTiny.h + OculusRoomModel.cpp + RenderTiny_Device.cpp + RenderTiny_Device.h + RenderTiny_GL_Device.cpp + RenderTiny_GL_Device.h +) + +set(EXTRA_LIBS + OculusVR + glew + glfw + ${GLFW_LIBRARIES} +) + +if(WIN32) + + add_executable(${PROJECT_NAME} WIN32 ${SOURCE_FILES} ) + +elseif(APPLE) + + add_executable(${PROJECT_NAME} MACOSX_BUNDLE ${SOURCE_FILES} ) + +else() + + add_executable(${PROJECT_NAME} ${SOURCE_FILES} ) + +endif() + +target_link_libraries(${PROJECT_NAME} ${EXTRA_LIBS}) + + + diff --git a/Samples/OculusRoomTiny/MessageBox.cpp b/Samples/OculusRoomTiny/MessageBox.cpp new file mode 100644 index 0000000..be3d136 --- /dev/null +++ b/Samples/OculusRoomTiny/MessageBox.cpp @@ -0,0 +1,61 @@ +#include "MessageBox.h" +#ifdef WIN32 +#include <Windows.h> +#endif + +#ifdef __APPLE__ +#include <CoreFoundation/CoreFoundation.h> +#endif + + +MessageBoxResult MessageBox(const char * text) { +#ifdef WIN32 + int result = ::MessageBoxA(0, text, "Oculus Rift Detection", + MB_CANCELTRYCONTINUE|MB_ICONWARNING); + switch (result) { + case IDCANCEL: + return Cancel; + case IDCONTINUE: + return Continue; + case IDRETRY: + return Retry; + } +#endif + +#ifdef __APPLE__ + CFStringRef headerStrRef = CFStringCreateWithCString(NULL, "Oculus Rift Detection", kCFStringEncodingMacRoman); + CFStringRef messageStrRef = CFStringCreateWithCString(NULL, text, kCFStringEncodingMacRoman); + CFOptionFlags result; + +// kCFUserNotificationDefaultResponse = 0, +// kCFUserNotificationAlternateResponse = 1, +// kCFUserNotificationOtherResponse = 2, +// kCFUserNotificationCancelResponse = 3 + + //launch the message box + CFUserNotificationDisplayAlert(0, + kCFUserNotificationNoteAlertLevel, + NULL, NULL, NULL, + headerStrRef, // header text + messageStrRef, // message text + CFSTR("Try again"), + CFSTR("Continue"), + CFSTR("Cancel"), + &result); + + //Clean up the strings + CFRelease(headerStrRef); + CFRelease(messageStrRef); + + switch (result) { + case kCFUserNotificationCancelResponse: + case kCFUserNotificationOtherResponse: + return Cancel; + case kCFUserNotificationDefaultResponse: + return Retry; + case kCFUserNotificationAlternateResponse: + return Continue; + } +#endif + return Continue; +} diff --git a/Samples/OculusRoomTiny/MessageBox.h b/Samples/OculusRoomTiny/MessageBox.h new file mode 100644 index 0000000..e7bb7c4 --- /dev/null +++ b/Samples/OculusRoomTiny/MessageBox.h @@ -0,0 +1,8 @@ + +enum MessageBoxResult { + Continue, + Cancel, + Retry +}; + +MessageBoxResult MessageBox(const char * text); diff --git a/Samples/OculusRoomTiny/OSX_OculusRoomTiny.mm b/Samples/OculusRoomTiny/OSX_OculusRoomTiny.mm deleted file mode 100644 index 7c5d81f..0000000 --- a/Samples/OculusRoomTiny/OSX_OculusRoomTiny.mm +++ /dev/null @@ -1,861 +0,0 @@ -/************************************************************************************ - - Filename : OSX_OculusRoomTiny.mm - Content : Simplest possible first-person view test application for Oculus Rift - Created : May 7, 2013 - Authors : Michael Antonov, Andrew Reisse, Artem Bolgar - - Copyright : Copyright 2013 Oculus, 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. - - *************************************************************************************/ - -#import "OSX_OculusRoomTiny.h" -#include "RenderTiny_GL_Device.h" - -#include "Kernel/OVR_KeyCodes.h" - -using namespace OVR; - -//------------------------------------------------------------------------------------- -// ***** OculusRoomTiny Class - -// Static pApp simplifies routing the window function. -OculusRoomTinyApp* OculusRoomTinyApp::pApp = 0; - - -OculusRoomTinyApp::OculusRoomTinyApp(OVRApp* nsapp) - : pRender(0), - LastUpdate(0), - NsApp(nsapp), - Quit(0), - - // Initial location - EyePos(0.0f, 1.6f, -5.0f), - EyeYaw(YawInitial), EyePitch(0), EyeRoll(0), - LastSensorYaw(0), - SConfig(), - PostProcess(PostProcess_Distortion), - ShiftDown(false), - ControlDown(false) -{ - pApp = this; - - Width = 1280; - Height = 800; - - StartupTicks = OVR::Timer::GetTicks(); - - MoveForward = MoveBack = MoveLeft = MoveRight = 0; -} - -OculusRoomTinyApp::~OculusRoomTinyApp() -{ - RemoveHandlerFromDevices(); - pSensor.Clear(); - pHMD.Clear(); - destroyWindow(); - pApp = 0; -} - - -int OculusRoomTinyApp::OnStartup(const char* args) -{ - OVR_UNUSED(args); - - - // *** Oculus HMD & Sensor Initialization - - // Create DeviceManager and first available HMDDevice from it. - // Sensor object is created from the HMD, to ensure that it is on the - // correct device. - - pManager = *DeviceManager::Create(); - - // We'll handle it's messages in this case. - pManager->SetMessageHandler(this); - - CFOptionFlags detectionResult; - const char* detectionMessage; - - do - { - // Release Sensor/HMD in case this is a retry. - pSensor.Clear(); - pHMD.Clear(); - RenderParams.MonitorName.Clear(); - - pHMD = *pManager->EnumerateDevices<HMDDevice>().CreateDevice(); - if (pHMD) - { - pSensor = *pHMD->GetSensor(); - - // This will initialize HMDInfo with information about configured IPD, - // screen size and other variables needed for correct projection. - // We pass HMD DisplayDeviceName into the renderer to select the - // correct monitor in full-screen mode. - if (pHMD->GetDeviceInfo(&HMDInfo)) - { - RenderParams.MonitorName = HMDInfo.DisplayDeviceName; - RenderParams.DisplayId = HMDInfo.DisplayId; - SConfig.SetHMDInfo(HMDInfo); - } - } - else - { - // If we didn't detect an HMD, try to create the sensor directly. - // This is useful for debugging sensor interaction; it is not needed in - // a shipping app. - pSensor = *pManager->EnumerateDevices<SensorDevice>().CreateDevice(); - } - - - // If there was a problem detecting the Rift, display appropriate message. - detectionResult = kCFUserNotificationAlternateResponse; - - if (!pHMD && !pSensor) - detectionMessage = "Oculus Rift not detected."; - else if (!pHMD) - detectionMessage = "Oculus Sensor detected; HMD Display not detected."; - else if (!pSensor) - detectionMessage = "Oculus HMD Display detected; Sensor not detected."; - else if (HMDInfo.DisplayDeviceName[0] == '\0') - detectionMessage = "Oculus Sensor detected; HMD display EDID not detected."; - else - detectionMessage = 0; - - if (detectionMessage) - { - String messageText(detectionMessage); - messageText += "\n\n" - "Press 'Try Again' to run retry detection.\n" - "Press 'Continue' to run full-screen anyway."; - - CFStringRef headerStrRef = CFStringCreateWithCString(NULL, "Oculus Rift Detection", kCFStringEncodingMacRoman); - CFStringRef messageStrRef = CFStringCreateWithCString(NULL, messageText, kCFStringEncodingMacRoman); - - //launch the message box - CFUserNotificationDisplayAlert(0, - kCFUserNotificationNoteAlertLevel, - NULL, NULL, NULL, - headerStrRef, // header text - messageStrRef, // message text - CFSTR("Try again"), - CFSTR("Continue"), - CFSTR("Cancel"), - &detectionResult); - - //Clean up the strings - CFRelease(headerStrRef); - CFRelease(messageStrRef); - - if (detectionResult == kCFUserNotificationCancelResponse || - detectionResult == kCFUserNotificationOtherResponse) - return 1; - } - - } while (detectionResult != kCFUserNotificationAlternateResponse); - - - if (HMDInfo.HResolution > 0) - { - Width = HMDInfo.HResolution; - Height = HMDInfo.VResolution; - } - - - if (!setupWindow()) - return 1; - - if (pSensor) - { - // We need to attach sensor to SensorFusion object for it to receive - // body frame messages and update orientation. SFusion.GetOrientation() - // is used in OnIdle() to orient the view. - SFusion.AttachToSensor(pSensor); - SFusion.SetDelegateMessageHandler(this); - SFusion.SetPredictionEnabled(true); - } - - - // *** Initialize Rendering - - // Enable multi-sampling by default. - RenderParams.Multisample = 4; - RenderParams.Fullscreen = false;//true; //? - - // Setup Graphics. - pRender = *OSX::RenderDevice::CreateDevice(RenderParams, (void*)View); - if (!pRender) - return 1; - - - // *** Configure Stereo settings. - - SConfig.SetFullViewport(Viewport(0,0, Width, Height)); - SConfig.SetStereoMode(Stereo_LeftRight_Multipass); - - // Configure proper Distortion Fit. - // For 7" screen, fit to touch left side of the view, leaving a bit of invisible - // screen on the top (saves on rendering cost). - // For smaller screens (5.5"), fit to the top. - if (HMDInfo.HScreenSize > 0.0f) - { - if (HMDInfo.HScreenSize > 0.140f) // 7" - SConfig.SetDistortionFitPointVP(-1.0f, 0.0f); - else - SConfig.SetDistortionFitPointVP(0.0f, 1.0f); - } - - pRender->SetSceneRenderScale(SConfig.GetDistortionScale()); - - SConfig.Set2DAreaFov(DegreeToRad(85.0f)); - - - // *** Populate Room Scene - - // This creates lights and models. - PopulateRoomScene(&Scene, pRender); - - - LastUpdate = GetAppTime(); - return 0; -} - -void OculusRoomTinyApp::OnMessage(const Message& msg) -{ - if (msg.Type == Message_DeviceAdded && msg.pDevice == pManager) - { - LogText("DeviceManager reported device added.\n"); - } - else if (msg.Type == Message_DeviceRemoved && msg.pDevice == pManager) - { - LogText("DeviceManager reported device removed.\n"); - } - else if (msg.Type == Message_DeviceAdded && msg.pDevice == pSensor) - { - LogText("Sensor reported device added.\n"); - } - else if (msg.Type == Message_DeviceRemoved && msg.pDevice == pSensor) - { - LogText("Sensor reported device removed.\n"); - } -} - -bool OculusRoomTinyApp::setupWindow() -{ - NSRect winrect; - winrect.origin.x = 0; - winrect.origin.y = 1000; - winrect.size.width = Width; - winrect.size.height = Height; - NSWindow* win = [[NSWindow alloc] initWithContentRect:winrect styleMask:NSTitledWindowMask|NSClosableWindowMask backing:NSBackingStoreBuffered defer:NO]; - - OVRView* view = [[OVRView alloc] initWithFrame:winrect]; - [win setContentView:view]; - [win setAcceptsMouseMovedEvents:YES]; - [win setDelegate:view]; - [view setApp:pApp]; - Win = win; - View = view; - - const char* title = "OculusRoomTiny"; - [((NSWindow*)Win) setTitle:[[NSString alloc] initWithBytes:title length:strlen(title) encoding:NSUTF8StringEncoding]]; - - [NSCursor hide]; - [view warpMouseToCenter]; - CGAssociateMouseAndMouseCursorPosition(false); - - SetFullscreen(RenderParams, true); - return true; -} - -void OculusRoomTinyApp::destroyWindow() -{ - SetFullscreen(RenderParams, false); - [((NSWindow*)Win) close]; -} - -void OculusRoomTinyApp::OnMouseMove(int x, int y, int modifiers) -{ - OVR_UNUSED(modifiers); - - // Mouse motion here is always relative. - int dx = x, dy = y; - const float maxPitch = ((3.1415f/2)*0.98f); - - // Apply to rotation. Subtract for right body frame rotation, - // since yaw rotation is positive CCW when looking down on XZ plane. - EyeYaw -= (Sensitivity * dx)/ 360.0f; - - if (!pSensor) - { - EyePitch -= (Sensitivity * dy)/ 360.0f; - - if (EyePitch > maxPitch) - EyePitch = maxPitch; - if (EyePitch < -maxPitch) - EyePitch = -maxPitch; - } -} - - -void OculusRoomTinyApp::OnKey(unsigned vk, bool down) -{ - switch (vk) - { - case 'Q': - if (down && ControlDown) - Exit();; - break; - case Key_Escape: - if (!down) - Exit(); - break; - - // Handle player movement keys. - // We just update movement state here, while the actual translation is done in OnIdle() - // based on time. - case 'W': MoveForward = down ? (MoveForward | 1) : (MoveForward & ~1); break; - case 'S': MoveBack = down ? (MoveBack | 1) : (MoveBack & ~1); break; - case 'A': MoveLeft = down ? (MoveLeft | 1) : (MoveLeft & ~1); break; - case 'D': MoveRight = down ? (MoveRight | 1) : (MoveRight & ~1); break; - case Key_Up: MoveForward = down ? (MoveForward | 2) : (MoveForward & ~2); break; - case Key_Down: MoveBack = down ? (MoveBack | 2) : (MoveBack & ~2); break; - - case 'R': - SFusion.Reset(); - break; - - case 'P': - if (down) - { - // Toggle chromatic aberration correction on/off. - RenderDevice::PostProcessShader shader = pRender->GetPostProcessShader(); - - if (shader == RenderDevice::PostProcessShader_Distortion) - { - pRender->SetPostProcessShader(RenderDevice::PostProcessShader_DistortionAndChromAb); - } - else if (shader == RenderDevice::PostProcessShader_DistortionAndChromAb) - { - pRender->SetPostProcessShader(RenderDevice::PostProcessShader_Distortion); - } - else - OVR_ASSERT(false); - } - break; - - // Switch rendering modes/distortion. - case Key_F1: - SConfig.SetStereoMode(Stereo_None); - PostProcess = PostProcess_None; - break; - case Key_F2: - SConfig.SetStereoMode(Stereo_LeftRight_Multipass); - PostProcess = PostProcess_None; - break; - case Key_F3: - SConfig.SetStereoMode(Stereo_LeftRight_Multipass); - PostProcess = PostProcess_Distortion; - break; - - // Stereo IPD adjustments, in meter (default IPD is 64mm). - case '+': - case '=': - if (down) - SConfig.SetIPD(SConfig.GetIPD() + 0.0005f * (ShiftDown ? 5.0f : 1.0f)); - break; - case '-': - case '_': - if (down) - SConfig.SetIPD(SConfig.GetIPD() - 0.0005f * (ShiftDown ? 5.0f : 1.0f)); - break; - - // Holding down Shift key accelerates adjustment velocity. - case Key_Shift: - ShiftDown = down; - break; - case Key_Meta: - ControlDown = down; - break; - } -} - - -void OculusRoomTinyApp::OnIdle() -{ - double curtime = GetAppTime(); - float dt = float(curtime - LastUpdate); - LastUpdate = curtime; - - - // Handle Sensor motion. - // We extract Yaw, Pitch, Roll instead of directly using the orientation - // to allow "additional" yaw manipulation with mouse/controller. - if (pSensor) - { - Quatf hmdOrient = SFusion.GetOrientation(); - float yaw = 0.0f; - - hmdOrient.GetEulerAngles<Axis_Y, Axis_X, Axis_Z>(&yaw, &EyePitch, &EyeRoll); - - EyeYaw += (yaw - LastSensorYaw); - LastSensorYaw = yaw; - } - - - if (!pSensor) - { - const float maxPitch = ((3.1415f/2)*0.98f); - if (EyePitch > maxPitch) - EyePitch = maxPitch; - if (EyePitch < -maxPitch) - EyePitch = -maxPitch; - } - - // Handle keyboard movement. - // This translates EyePos based on Yaw vector direction and keys pressed. - // Note that Pitch and Roll do not affect movement (they only affect view). - if (MoveForward || MoveBack || MoveLeft || MoveRight) - { - Vector3f localMoveVector(0,0,0); - Matrix4f yawRotate = Matrix4f::RotationY(EyeYaw); - - if (MoveForward) - localMoveVector = ForwardVector; - else if (MoveBack) - localMoveVector = -ForwardVector; - - if (MoveRight) - localMoveVector += RightVector; - else if (MoveLeft) - localMoveVector -= RightVector; - - // Normalize vector so we don't move faster diagonally. - localMoveVector.Normalize(); - Vector3f orientationVector = yawRotate.Transform(localMoveVector); - orientationVector *= MoveSpeed * dt * (ShiftDown ? 3.0f : 1.0f); - - EyePos += orientationVector; - } - - // Rotate and position View Camera, using YawPitchRoll in BodyFrame coordinates. - // - Matrix4f rollPitchYaw = Matrix4f::RotationY(EyeYaw) * Matrix4f::RotationX(EyePitch) * - Matrix4f::RotationZ(EyeRoll); - Vector3f up = rollPitchYaw.Transform(UpVector); - Vector3f forward = rollPitchYaw.Transform(ForwardVector); - - - // Minimal head modelling. - float headBaseToEyeHeight = 0.15f; // Vertical height of eye from base of head - float headBaseToEyeProtrusion = 0.09f; // Distance forward of eye from base of head - - Vector3f eyeCenterInHeadFrame(0.0f, headBaseToEyeHeight, -headBaseToEyeProtrusion); - Vector3f shiftedEyePos = EyePos + rollPitchYaw.Transform(eyeCenterInHeadFrame); - shiftedEyePos.y -= eyeCenterInHeadFrame.y; // Bring the head back down to original height - - ViewMat = Matrix4f::LookAtRH(shiftedEyePos, shiftedEyePos + forward, up); - - // This is what transformation would be without head modeling. - // View = Matrix4f::LookAtRH(EyePos, EyePos + forward, up); - - switch(SConfig.GetStereoMode()) - { - case Stereo_None: - Render(SConfig.GetEyeRenderParams(StereoEye_Center)); - break; - - case Stereo_LeftRight_Multipass: - Render(SConfig.GetEyeRenderParams(StereoEye_Left)); - Render(SConfig.GetEyeRenderParams(StereoEye_Right)); - break; - } - - pRender->Present(); - // Force GPU to flush the scene, resulting in the lowest possible latency. - pRender->ForceFlushGPU(); -} - - -// Render the scene for one eye. -void OculusRoomTinyApp::Render(const StereoEyeParams& stereo) -{ - pRender->BeginScene(PostProcess); - - // Apply Viewport/Projection for the eye. - pRender->ApplyStereoParams(stereo); - pRender->Clear(); - pRender->SetDepthMode(true, true); - - Scene.Render(pRender, stereo.ViewAdjust * ViewMat); - - pRender->FinishScene(); -} - -void OculusRoomTinyApp::Exit() -{ - [NsApp stop:nil]; - Quit = true; -} - -bool OculusRoomTinyApp::SetFullscreen(const RenderTiny::RendererParams& rp, int fullscreen) -{ - if (fullscreen == RenderTiny::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.DisplayId) - usescreen = s; - } - - [(OVRView*)View enterFullScreenMode:usescreen withOptions:nil]; - } - - if (pRender) - pRender->SetFullscreen((RenderTiny::DisplayMode)fullscreen); - return 1; -} - -//------------------------------------------------------------------------------------- -// ***** OS X-Specific Logic - -@implementation OVRApp - -- (void)dealloc -{ - [super dealloc]; -} - -- (void)run -{ - NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; - _running = YES; - OculusRoomTinyApp* app; - - // Initializes LibOVR. This LogMask_All enables maximum logging. - // Custom allocator can also be specified here. - OVR::System::Init(OVR::Log::ConfigureDefaultLog(OVR::LogMask_All)); - - int exitCode = 0; - do - { - { - using namespace OVR; - - // CreateApplication must be the first call since it does OVR::System::Initialize. - app = new OculusRoomTinyApp(self); - // The platform attached to an app will be deleted by DestroyApplication. - - [self setApp:app]; - - const char* argv[] = {"OVRApp"}; - exitCode = app->OnStartup(argv[0]); - if (exitCode) - break; - } - [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]; - } - } while(0); - - delete app; - - // No OVR functions involving memory are allowed after this. - OVR::System::Destroy(); -} - -@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; -} - -@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 = _App->GetWidth()/2.0f; - w.y = _App->GetHeight()/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); -} - --(void) keyDown:(NSEvent*)ev -{ - NSString* chars = [ev charactersIgnoringModifiers]; - if ([chars length]) - { - wchar_t ch = [chars characterAtIndex:0]; - OVR::KeyCode key = MapToKeyCode(ch); - _App->OnKey(key, true); - } -} --(void) keyUp:(NSEvent*)ev -{ - NSString* chars = [ev charactersIgnoringModifiers]; - if ([chars length]) - { - wchar_t ch = [chars characterAtIndex:0]; - OVR::KeyCode key = MapToKeyCode(ch); - _App->OnKey(key, false); - - } -} - - --(void)flagsChanged:(NSEvent *)ev -{ - static const OVR::KeyCode ModifierKeys[] = {OVR::Key_None, OVR::Key_Shift, OVR::Key_Control, OVR::Key_Alt, OVR::Key_Meta}; - - unsigned long cmods = [ev modifierFlags]; - if ((cmods & 0xffff0000) != _Modifiers) - { - uint32_t mods = 0; - if (cmods & NSShiftKeyMask) - mods |= 0x01; - if (cmods & NSControlKeyMask) - mods |= 0x02; - if (cmods & NSAlternateKeyMask) - mods |= 0x04; - if (cmods & NSCommandKeyMask) - mods |= 0x08; - - 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], true); - else - _App->OnKey(ModifierKeys[i], false); - } - } - _Modifiers = cmods & 0xffff0000; - } -} - --(void)ProcessMouse:(NSEvent*)ev -{ - switch ([ev type]) - { - case NSLeftMouseDragged: - case NSRightMouseDragged: - case NSOtherMouseDragged: - case NSMouseMoved: - { - int dx = [ev deltaX]; - int dy = [ev deltaY]; - - if (dx != 0 || dy != 0) - { - _App->OnMouseMove(dx, dy, 0); - [self warpMouseToCenter]; - } - } - 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 -{ - [self warpMouseToCenter]; - CGAssociateMouseAndMouseCursorPosition(false); - [NSCursor hide]; -} - -//-(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; -} - --(BOOL)windowShouldClose:(id)sender -{ - _App->Exit(); - return 1; -} - -@end - -// GL OSX-specific logic -namespace OSX { - - RenderDevice::RenderDevice(const RendererParams& p, void* osview, void* context) - : GL::RenderDevice(p), Context(context) - { - OVRView* view = (OVRView*)osview; - NSRect bounds = [view bounds]; - WindowWidth = bounds.size.width; - WindowHeight= bounds.size.height; - - } - - RenderDevice* RenderDevice::CreateDevice(const RendererParams& rp, void* osview) - { - OVRView* view = (OVRView*)osview; - NSOpenGLContext *context = [view openGLContext]; - if (!context) - return NULL; - - [context makeCurrentContext]; - [[view window] makeKeyAndOrderFront:nil]; - - return new OSX::RenderDevice(rp, osview, 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/OculusRoomTiny/Win32_OculusRoomTiny.cpp b/Samples/OculusRoomTiny/OculusRoomTiny.cpp index c27723f..6b5ea2d 100644 --- a/Samples/OculusRoomTiny/Win32_OculusRoomTiny.cpp +++ b/Samples/OculusRoomTiny/OculusRoomTiny.cpp @@ -21,62 +21,69 @@ limitations under the License. *************************************************************************************/ -#include "Win32_OculusRoomTiny.h" -#include "RenderTiny_D3D1X_Device.h" +#include "OculusRoomTiny.h" +#include "RenderTiny_Device.h" +#include "MessageBox.h" + +void glfwKeyCallback(GLFWwindow* window, int key, int scancode, int action, int mods) { + OculusRoomTinyApp * instance = (OculusRoomTinyApp *)glfwGetWindowUserPointer(window); + instance->OnKey(key, action == GLFW_PRESS || action == GLFW_REPEAT); +} + +void glfwErrorCallback(int error, const char* description) { + LogText("Error code %d, message: %s", error, description); + exit(1); +} //------------------------------------------------------------------------------------- // ***** OculusRoomTiny Class -// Static pApp simplifies routing the window function. -OculusRoomTinyApp* OculusRoomTinyApp::pApp = 0; - - -OculusRoomTinyApp::OculusRoomTinyApp(HINSTANCE hinst) - : pRender(0), - LastUpdate(0), - - // Win32 - hWnd(NULL), - hInstance(hinst), Quit(0), MouseCaptured(true), - hXInputModule(0), pXInputGetState(0), - - // Initial location - EyePos(0.0f, 1.6f, -5.0f), - EyeYaw(YawInitial), EyePitch(0), EyeRoll(0), - LastSensorYaw(0), - SConfig(), - PostProcess(PostProcess_Distortion), - ShiftDown(false), - ControlDown(false) +OculusRoomTinyApp::OculusRoomTinyApp() : + window(0), Width(1280), Height(800), Quit(false), LastUpdate(0), StartupTicks(OVR::Timer::GetTicks()), EyePos(0.0f, 1.6f, -5.0f), EyeYaw(YawInitial), + EyePitch(0), EyeRoll(0), LastSensorYaw(0), MoveForward(0), MoveBack(0), MoveLeft(0), MoveRight(0), ShiftDown(0), ControlDown(0), PostProcess(PostProcess_Distortion) { - pApp = this; - - Width = 1280; - Height = 800; - - StartupTicks = OVR::Timer::GetTicks(); - LastPadPacketNo = 0; - - MoveForward = MoveBack = MoveLeft = MoveRight = 0; - GamepadMove = Vector3f(0); - GamepadRotate = Vector3f(0); } OculusRoomTinyApp::~OculusRoomTinyApp() { - RemoveHandlerFromDevices(); + RemoveHandlerFromDevices(); pSensor.Clear(); pHMD.Clear(); destroyWindow(); - pApp = 0; } +bool OculusRoomTinyApp::setupWindow() +{ + glfwInit(); + glfwWindowHint(GLFW_DEPTH_BITS, 16); + glfwWindowHint(GLFW_DECORATED, 0); + window = glfwCreateWindow(Width, Height, "OculusRoomTiny", NULL, NULL); + assert(window != 0); + glfwSetWindowPos(window, HMDInfo.DesktopX, HMDInfo.DesktopY); + glfwSetWindowUserPointer(window, this); + glfwSetKeyCallback(window, glfwKeyCallback); + glfwMakeContextCurrent(window); + glfwSwapInterval(1); + glewInit(); + return window != 0; +} -int OculusRoomTinyApp::OnStartup(const char* args) +void OculusRoomTinyApp::destroyWindow() { - OVR_UNUSED(args); + pRender.Clear(); + if (window) + { + // Release window resources. + glfwDestroyWindow(window); + window = 0; + Width = Height = 0; + } +} +int OculusRoomTinyApp::OnStartup(const char* args) +{ + OVR_UNUSED(args); // *** Oculus HMD & Sensor Initialization // Create DeviceManager and first available HMDDevice from it. @@ -85,15 +92,11 @@ int OculusRoomTinyApp::OnStartup(const char* args) pManager = *DeviceManager::Create(); - // We'll handle it's messages in this case. - pManager->SetMessageHandler(this); - - - int detectionResult = IDCONTINUE; - const char* detectionMessage; + // We'll handle it's messages in this case. + pManager->SetMessageHandler(this); - do - { + bool initDone = false; + while (!initDone) { // Release Sensor/HMD in case this is a retry. pSensor.Clear(); pHMD.Clear(); @@ -109,14 +112,14 @@ int OculusRoomTinyApp::OnStartup(const char* args) // We pass HMD DisplayDeviceName into the renderer to select the // correct monitor in full-screen mode. if (pHMD->GetDeviceInfo(&HMDInfo)) - { + { RenderParams.MonitorName = HMDInfo.DisplayDeviceName; RenderParams.DisplayId = HMDInfo.DisplayId; SConfig.SetHMDInfo(HMDInfo); } } else - { + { // If we didn't detect an HMD, try to create the sensor directly. // This is useful for debugging sensor interaction; it is not needed in // a shipping app. @@ -124,8 +127,7 @@ int OculusRoomTinyApp::OnStartup(const char* args) } - // If there was a problem detecting the Rift, display appropriate message. - detectionResult = IDCONTINUE; + const char* detectionMessage; if (!pHMD && !pSensor) detectionMessage = "Oculus Rift not detected."; @@ -138,56 +140,57 @@ int OculusRoomTinyApp::OnStartup(const char* args) else detectionMessage = 0; - if (detectionMessage) - { + if (detectionMessage) { String messageText(detectionMessage); messageText += "\n\n" "Press 'Try Again' to run retry detection.\n" "Press 'Continue' to run full-screen anyway."; - - detectionResult = ::MessageBoxA(0, messageText.ToCStr(), "Oculus Rift Detection", - MB_CANCELTRYCONTINUE|MB_ICONWARNING); - - if (detectionResult == IDCANCEL) + MessageBoxResult result = MessageBox(messageText); + // Yeah, this is confusing, but it's correct. + switch (result) { + // semantic Retry means 'continue the loop' + case Retry: + continue; + + case Cancel: return 1; - } - } while (detectionResult != IDCONTINUE); + // semantic Continue means exit the loop + case Continue: + initDone = true; + break; + } + } else { + initDone = true; + } + } - if (HMDInfo.HResolution > 0) { Width = HMDInfo.HResolution; Height = HMDInfo.VResolution; } - if (!setupWindow()) return 1; - + if (pSensor) { - // We need to attach sensor to SensorFusion object for it to receive - // body frame messages and update orientation. SFusion.GetOrientation() + // We need to attach sensor to SensorFusion object for it to receive + // body frame messages and update orientation. SFusion.GetOrientation() // is used in OnIdle() to orient the view. SFusion.AttachToSensor(pSensor); SFusion.SetDelegateMessageHandler(this); SFusion.SetPredictionEnabled(true); } - + // *** Initialize Rendering - + // Enable multi-sampling by default. RenderParams.Multisample = 4; RenderParams.Fullscreen = true; - // Setup Graphics. - pRender = *RenderTiny::D3D10::RenderDevice::CreateDevice(RenderParams, (void*)hWnd); - if (!pRender) - return 1; - - // *** Configure Stereo settings. SConfig.SetFullViewport(Viewport(0,0, Width, Height)); @@ -205,39 +208,42 @@ int OculusRoomTinyApp::OnStartup(const char* args) SConfig.SetDistortionFitPointVP(0.0f, 1.0f); } - pRender->SetSceneRenderScale(SConfig.GetDistortionScale()); - SConfig.Set2DAreaFov(DegreeToRad(85.0f)); + // Setup Graphics. + pRender = *RenderTiny::RenderDevice::CreateDevice(RenderParams, window); + if (!pRender) + return 1; + pRender->SetSceneRenderScale(SConfig.GetDistortionScale()); + pRender->SetWindowSize(0, 0); // *** Populate Room Scene // This creates lights and models. PopulateRoomScene(&Scene, pRender); - LastUpdate = GetAppTime(); return 0; } void OculusRoomTinyApp::OnMessage(const Message& msg) { - if (msg.Type == Message_DeviceAdded && msg.pDevice == pManager) - { - LogText("DeviceManager reported device added.\n"); - } - else if (msg.Type == Message_DeviceRemoved && msg.pDevice == pManager) - { - LogText("DeviceManager reported device removed.\n"); - } - else if (msg.Type == Message_DeviceAdded && msg.pDevice == pSensor) - { - LogText("Sensor reported device added.\n"); - } - else if (msg.Type == Message_DeviceRemoved && msg.pDevice == pSensor) - { - LogText("Sensor reported device removed.\n"); - } + if (msg.Type == Message_DeviceAdded && msg.pDevice == pManager) + { + LogText("DeviceManager reported device added.\n"); + } + else if (msg.Type == Message_DeviceRemoved && msg.pDevice == pManager) + { + LogText("DeviceManager reported device removed.\n"); + } + else if (msg.Type == Message_DeviceAdded && msg.pDevice == pSensor) + { + LogText("Sensor reported device added.\n"); + } + else if (msg.Type == Message_DeviceRemoved && msg.pDevice == pSensor) + { + LogText("Sensor reported device removed.\n"); + } } @@ -254,7 +260,7 @@ void OculusRoomTinyApp::OnMouseMove(int x, int y, int modifiers) OVR_UNUSED(modifiers); // Mouse motion here is always relative. - int dx = x, dy = y; + int dx = x, dy = y; const float maxPitch = ((3.1415f/2)*0.98f); // Apply to rotation. Subtract for right body frame rotation, @@ -264,23 +270,23 @@ void OculusRoomTinyApp::OnMouseMove(int x, int y, int modifiers) if (!pSensor) { EyePitch -= (Sensitivity * dy)/ 360.0f; - + if (EyePitch > maxPitch) EyePitch = maxPitch; if (EyePitch < -maxPitch) EyePitch = -maxPitch; - } + } } void OculusRoomTinyApp::OnKey(unsigned vk, bool down) { switch (vk) { - case 'Q': + case GLFW_KEY_Q: if (down && ControlDown) Quit = true; break; - case VK_ESCAPE: + case GLFW_KEY_ESCAPE: if (!down) Quit = true; break; @@ -288,18 +294,18 @@ void OculusRoomTinyApp::OnKey(unsigned vk, bool down) // Handle player movement keys. // We just update movement state here, while the actual translation is done in OnIdle() // based on time. - case 'W': MoveForward = down ? (MoveForward | 1) : (MoveForward & ~1); break; - case 'S': MoveBack = down ? (MoveBack | 1) : (MoveBack & ~1); break; - case 'A': MoveLeft = down ? (MoveLeft | 1) : (MoveLeft & ~1); break; - case 'D': MoveRight = down ? (MoveRight | 1) : (MoveRight & ~1); break; - case VK_UP: MoveForward = down ? (MoveForward | 2) : (MoveForward & ~2); break; - case VK_DOWN: MoveBack = down ? (MoveBack | 2) : (MoveBack & ~2); break; - - case 'R': + case GLFW_KEY_W: MoveForward = down ? (MoveForward | 1) : (MoveForward & ~1); break; + case GLFW_KEY_S: MoveBack = down ? (MoveBack | 1) : (MoveBack & ~1); break; + case GLFW_KEY_A: MoveLeft = down ? (MoveLeft | 1) : (MoveLeft & ~1); break; + case GLFW_KEY_D: MoveRight = down ? (MoveRight | 1) : (MoveRight & ~1); break; + case GLFW_KEY_UP: MoveForward = down ? (MoveForward | 2) : (MoveForward & ~2); break; + case GLFW_KEY_DOWN: MoveBack = down ? (MoveBack | 2) : (MoveBack & ~2); break; + + case GLFW_KEY_R: SFusion.Reset(); break; - - case 'P': + + case GLFW_KEY_P: if (down) { // Toggle chromatic aberration correction on/off. @@ -307,11 +313,11 @@ void OculusRoomTinyApp::OnKey(unsigned vk, bool down) if (shader == RenderDevice::PostProcessShader_Distortion) { - pRender->SetPostProcessShader(RenderDevice::PostProcessShader_DistortionAndChromAb); + pRender->SetPostProcessShader(RenderDevice::PostProcessShader_DistortionAndChromAb); } else if (shader == RenderDevice::PostProcessShader_DistortionAndChromAb) { - pRender->SetPostProcessShader(RenderDevice::PostProcessShader_Distortion); + pRender->SetPostProcessShader(RenderDevice::PostProcessShader_Distortion); } else OVR_ASSERT(false); @@ -319,36 +325,44 @@ void OculusRoomTinyApp::OnKey(unsigned vk, bool down) break; // Switch rendering modes/distortion. - case VK_F1: + case GLFW_KEY_F1: SConfig.SetStereoMode(Stereo_None); PostProcess = PostProcess_None; break; - case VK_F2: + case GLFW_KEY_F2: SConfig.SetStereoMode(Stereo_LeftRight_Multipass); PostProcess = PostProcess_None; break; - case VK_F3: + case GLFW_KEY_F3: SConfig.SetStereoMode(Stereo_LeftRight_Multipass); PostProcess = PostProcess_Distortion; break; - // Stereo IPD adjustments, in meter (default IPD is 64mm). - case VK_OEM_PLUS: - case VK_INSERT: + // Stereo IPD adjustments, in meter (default IPD is 64mm). + case GLFW_KEY_KP_ADD: + case GLFW_KEY_INSERT: if (down) SConfig.SetIPD(SConfig.GetIPD() + 0.0005f * (ShiftDown ? 5.0f : 1.0f)); break; - case VK_OEM_MINUS: - case VK_DELETE: + case GLFW_KEY_KP_SUBTRACT: + case GLFW_KEY_DELETE: if (down) SConfig.SetIPD(SConfig.GetIPD() - 0.0005f * (ShiftDown ? 5.0f : 1.0f)); break; + case GLFW_KEY_BACKSLASH: + if (down) + // Swap eye positions. + SConfig.SetIPD(SConfig.GetIPD() * -1); + break; + // Holding down Shift key accelerates adjustment velocity. - case VK_SHIFT: + case GLFW_KEY_LEFT_SHIFT: + case GLFW_KEY_RIGHT_SHIFT: ShiftDown = down; break; - case VK_CONTROL: + case GLFW_KEY_LEFT_CONTROL: + case GLFW_KEY_RIGHT_CONTROL: ControlDown = down; break; } @@ -361,21 +375,19 @@ void OculusRoomTinyApp::OnIdle() float dt = float(curtime - LastUpdate); LastUpdate = curtime; - // Handle Sensor motion. // We extract Yaw, Pitch, Roll instead of directly using the orientation // to allow "additional" yaw manipulation with mouse/controller. if (pSensor) - { + { Quatf hmdOrient = SFusion.GetOrientation(); float yaw = 0.0f; hmdOrient.GetEulerAngles<Axis_Y, Axis_X, Axis_Z>(&yaw, &EyePitch, &EyeRoll); EyeYaw += (yaw - LastSensorYaw); - LastSensorYaw = yaw; - } - + LastSensorYaw = yaw; + } // Gamepad rotation. EyeYaw -= GamepadRotate.x * dt; @@ -391,7 +403,7 @@ void OculusRoomTinyApp::OnIdle() if (EyePitch < -maxPitch) EyePitch = -maxPitch; } - + // Handle keyboard movement. // This translates EyePos based on Yaw vector direction and keys pressed. // Note that Pitch and Roll do not affect movement (they only affect view). @@ -428,13 +440,13 @@ void OculusRoomTinyApp::OnIdle() // Rotate and position View Camera, using YawPitchRoll in BodyFrame coordinates. - // + // Matrix4f rollPitchYaw = Matrix4f::RotationY(EyeYaw) * Matrix4f::RotationX(EyePitch) * Matrix4f::RotationZ(EyeRoll); Vector3f up = rollPitchYaw.Transform(UpVector); Vector3f forward = rollPitchYaw.Transform(ForwardVector); - + // Minimal head modelling. float headBaseToEyeHeight = 0.15f; // Vertical height of eye from base of head float headBaseToEyeProtrusion = 0.09f; // Distance forward of eye from base of head @@ -443,10 +455,10 @@ void OculusRoomTinyApp::OnIdle() Vector3f shiftedEyePos = EyePos + rollPitchYaw.Transform(eyeCenterInHeadFrame); shiftedEyePos.y -= eyeCenterInHeadFrame.y; // Bring the head back down to original height - View = Matrix4f::LookAtRH(shiftedEyePos, shiftedEyePos + forward, up); + View = Matrix4f::LookAtRH(shiftedEyePos, shiftedEyePos + forward, up); - // This is what transformation would be without head modeling. - // View = Matrix4f::LookAtRH(EyePos, EyePos + forward, up); + // This is what transformation would be without head modeling. + // View = Matrix4f::LookAtRH(EyePos, EyePos + forward, up); switch(SConfig.GetStereoMode()) { @@ -459,231 +471,49 @@ void OculusRoomTinyApp::OnIdle() Render(SConfig.GetEyeRenderParams(StereoEye_Right)); break; } - + pRender->Present(); // Force GPU to flush the scene, resulting in the lowest possible latency. pRender->ForceFlushGPU(); } - // Render the scene for one eye. void OculusRoomTinyApp::Render(const StereoEyeParams& stereo) { pRender->BeginScene(PostProcess); // Apply Viewport/Projection for the eye. - pRender->ApplyStereoParams(stereo); + pRender->ApplyStereoParams(stereo); pRender->Clear(); pRender->SetDepthMode(true, true); - + Scene.Render(pRender, stereo.ViewAdjust * View); pRender->FinishScene(); } -//------------------------------------------------------------------------------------- -// ***** Win32-Specific Logic - -bool OculusRoomTinyApp::setupWindow() -{ - - WNDCLASS wc; - memset(&wc, 0, sizeof(wc)); - wc.lpszClassName = L"OVRAppWindow"; - wc.style = CS_OWNDC; - wc.lpfnWndProc = systemWindowProc; - wc.cbWndExtra = sizeof(OculusRoomTinyApp*); - RegisterClass(&wc); - - - RECT winSize = { 0, 0, Width, Height }; - AdjustWindowRect(&winSize, WS_POPUP, false); - hWnd = CreateWindowA("OVRAppWindow", "OculusRoomTiny", WS_POPUP|WS_VISIBLE, - HMDInfo.DesktopX, HMDInfo.DesktopY, - winSize.right-winSize.left, winSize.bottom-winSize.top, - NULL, NULL, hInstance, (LPVOID)this); - - - // Initialize Window center in screen coordinates - POINT center = { Width / 2, Height / 2 }; - ::ClientToScreen(hWnd, ¢er); - WindowCenter = center; - - - return (hWnd != NULL); -} - -void OculusRoomTinyApp::destroyWindow() -{ - pRender.Clear(); - - if (hWnd) - { - // Release window resources. - ::DestroyWindow(hWnd); - UnregisterClass(L"OVRAppWindow", hInstance); - hWnd = 0; - Width = Height = 0; - } -} - - -LRESULT CALLBACK OculusRoomTinyApp::systemWindowProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp) -{ - if (msg == WM_NCCREATE) - pApp->hWnd = hwnd; - return pApp->windowProc(msg, wp, lp); -} - -void OculusRoomTinyApp::giveUsFocus(bool setFocus) -{ - if (setFocus) - { - ::SetCursorPos(WindowCenter.x, WindowCenter.y); - - MouseCaptured = true; - ::SetCapture(hWnd); - ::ShowCursor(FALSE); - - } - else - { - MouseCaptured = false; - ::ReleaseCapture(); - ::ShowCursor(TRUE); - } -} - -LRESULT OculusRoomTinyApp::windowProc(UINT msg, WPARAM wp, LPARAM lp) -{ - switch (msg) - { - case WM_MOUSEMOVE: - { - if (MouseCaptured) - { - // Convert mouse motion to be relative (report the offset and re-center). - POINT newPos = { LOWORD(lp), HIWORD(lp) }; - ::ClientToScreen(hWnd, &newPos); - if ((newPos.x == WindowCenter.x) && (newPos.y == WindowCenter.y)) - break; - ::SetCursorPos(WindowCenter.x, WindowCenter.y); - - LONG dx = newPos.x - WindowCenter.x; - LONG dy = newPos.y - WindowCenter.y; - pApp->OnMouseMove(dx, dy, 0); - } - } - break; - - case WM_MOVE: - { - RECT r; - GetClientRect(hWnd, &r); - WindowCenter.x = r.right/2; - WindowCenter.y = r.bottom/2; - ::ClientToScreen(hWnd, &WindowCenter); - } - break; - - case WM_KEYDOWN: - OnKey((unsigned)wp, true); - break; - case WM_KEYUP: - OnKey((unsigned)wp, false); - break; - - case WM_SETFOCUS: - giveUsFocus(true); - break; - - case WM_KILLFOCUS: - giveUsFocus(false); - break; - - case WM_CREATE: - // Hack to position mouse in fullscreen window shortly after startup. - SetTimer(hWnd, 0, 100, NULL); - break; - - case WM_TIMER: - KillTimer(hWnd, 0); - giveUsFocus(true); - break; - - case WM_QUIT: - case WM_CLOSE: - Quit = true; - return 0; - } - - return DefWindowProc(hWnd, msg, wp, lp); -} - -static inline float GamepadStick(short 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 GamepadTrigger(BYTE in) -{ - return (in < 30) ? 0.0f : (float(in-30) / 225); -} int OculusRoomTinyApp::Run() { - // Loop processing messages until Quit flag is set, - // rendering game scene inside of OnIdle(). - - while (!Quit) - { - MSG msg; - if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) - { - TranslateMessage(&msg); - DispatchMessage(&msg); - } - else - { - // Read game-pad. - XINPUT_STATE xis; - - if (pXInputGetState && !pXInputGetState(0, &xis) && - (xis.dwPacketNumber != LastPadPacketNo)) - { - OnGamepad(GamepadStick(xis.Gamepad.sThumbLX), - GamepadStick(xis.Gamepad.sThumbLY), - GamepadStick(xis.Gamepad.sThumbRX), - GamepadStick(xis.Gamepad.sThumbRY)); - //pad.LT = GamepadTrigger(xis.Gamepad.bLeftTrigger); - LastPadPacketNo = xis.dwPacketNumber; - } - - pApp->OnIdle(); - - // Keep sleeping when we're minimized. - if (IsIconic(hWnd)) - Sleep(10); - } + pRender->SetWindowSize(Width, Height); + pRender->SetViewport(0, 0, Width, Height); + while (!Quit) { + glfwPollEvents(); + OnIdle(); } - return 0; } - //------------------------------------------------------------------------------------- // ***** Program Startup +#ifdef WIN32 +int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) +#else +int main(int argc, char ** argv) +#endif -int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, LPSTR inArgs, int) { int exitCode = 0; @@ -693,10 +523,8 @@ int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, LPSTR inArgs, int) // Scope to force application destructor before System::Destroy. { - OculusRoomTinyApp app(hinst); - //app.hInstance = hinst; - - exitCode = app.OnStartup(inArgs); + OculusRoomTinyApp app; + exitCode = app.OnStartup(0); if (!exitCode) { // Processes messages and calls OnIdle() to do rendering. @@ -706,7 +534,5 @@ int WINAPI WinMain(HINSTANCE hinst, HINSTANCE, LPSTR inArgs, int) // No OVR functions involving memory are allowed after this. OVR::System::Destroy(); - - OVR_DEBUG_STATEMENT(_CrtDumpMemoryLeaks()); return exitCode; } diff --git a/Samples/OculusRoomTiny/OSX_OculusRoomTiny.h b/Samples/OculusRoomTiny/OculusRoomTiny.h index 280fda5..f9d5481 100644 --- a/Samples/OculusRoomTiny/OSX_OculusRoomTiny.h +++ b/Samples/OculusRoomTiny/OculusRoomTiny.h @@ -1,65 +1,40 @@ /************************************************************************************ - + Filename : OSX_OculusRoomTiny.h Content : Simplest possible first-person view test application for Oculus Rift Created : May 7, 2013 Authors : Michael Antonov, Andrew Reisse, Artem Bolgar - + Copyright : Copyright 2013 Oculus, 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 INC_OSX_OculusRoomTiny_h -#define INC_OSX_OculusRoomTiny_h +#pragma once -#import <Cocoa/Cocoa.h> +#include "OVR.h" +#include "GL/glew.h" +#include "GLFW/glfw3.h" -#import <CoreGraphics/CoreGraphics.h> -#import <CoreGraphics/CGDirectDisplay.h> - -#include "OVR.h" -#include "Util/Util_Render_Stereo.h" -#include "../../LibOVR/Src/Kernel/OVR_Timer.h" -#include "RenderTiny_GL_Device.h" +//#include "Util/Util_Render_Stereo.h" +#include <Kernel/OVR_Timer.h> +#include "RenderTiny_Device.h" using namespace OVR; +using namespace OVR::Util::Render; using namespace OVR::RenderTiny; -class OculusRoomTinyApp; - -@interface OVRApp : NSApplication - -@property (assign) IBOutlet NSWindow* win; -@property (assign) OculusRoomTinyApp* App; - --(void) run; - -@end - -@interface OVRView : NSOpenGLView <NSWindowDelegate> - -//@property (assign) OVR::Platform::OSX::PlatformCore* Platform; -@property (assign) OculusRoomTinyApp* App; -@property unsigned long Modifiers; - --(void)ProcessMouse:(NSEvent*)event; --(void)warpMouseToCenter; - -+(CGDirectDisplayID) displayFromScreen:(NSScreen*)s; - -@end //------------------------------------------------------------------------------------- // ***** OculusRoomTiny Description @@ -75,11 +50,12 @@ class OculusRoomTinyApp; // F2 - Stereo, no distortion. // F3 - Stereo and distortion. // - +// // The world RHS coordinate system is defines as follows (as seen in perspective view): // Y - Up // Z - Back // X - Right + const Vector3f UpVector(0.0f, 1.0f, 0.0f); const Vector3f ForwardVector(0.0f, 0.0f, -1.0f); const Vector3f RightVector(1.0f, 0.0f, 0.0f); @@ -89,26 +65,6 @@ const float YawInitial = 3.141592f; const float Sensitivity = 1.0f; const float MoveSpeed = 3.0f; // m/s -namespace OSX -{ - class RenderDevice : public GL::RenderDevice - { - public: - void* Context; // NSOpenGLContext - - // osview = NSView* - RenderDevice(const RendererParams& p, void* osview, void* context); - - virtual void Shutdown(); - virtual void Present(); - - virtual bool SetFullscreen(DisplayMode fullscreen); - - // osview = NSView* - static RenderDevice* CreateDevice(const RendererParams& rp, void* osview); - }; -} - //------------------------------------------------------------------------------------- // ***** OculusRoomTiny Application class @@ -126,91 +82,87 @@ namespace OSX class OculusRoomTinyApp : public MessageHandler { - friend class OSX::RenderDevice; public: - OculusRoomTinyApp(OVRApp* nsapp); + OculusRoomTinyApp(); ~OculusRoomTinyApp(); - + // Initializes graphics, Rift input and creates world model. virtual int OnStartup(const char* args); // Called per frame to sample SensorFucion and render the world. virtual void OnIdle(); - + // Installed for Oculus device messages. Optional. virtual void OnMessage(const Message& msg); - + // Handle input events for movement. + virtual void OnGamepad(float padLx, float padLY, float padRx, float padRy); virtual void OnMouseMove(int x, int y, int modifiers); virtual void OnKey(unsigned vk, bool down); - + // Render the view for one eye. void Render(const StereoEyeParams& stereo); - + // Main application loop. int Run(); void Exit(); - + // Return amount of time passed since application started in seconds. double GetAppTime() const { return (OVR::Timer::GetTicks() - StartupTicks) * (1.0 / (double)OVR::Timer::MksPerSecond); } - bool IsQuiting() const { return Quit; } - + + bool IsQuiting() const { return Quit; } int GetWidth() const { return Width; } int GetHeight() const { return Height; } - bool SetFullscreen(const RendererParams& rp, int fullscreen); - + protected: bool setupWindow(); void destroyWindow(); - NSView* View; - NSWindow* Win; - OVRApp* NsApp; - - static OculusRoomTinyApp* pApp; - - // *** Rendering Variables - Ptr<OSX::RenderDevice> pRender; + GLFWwindow * window; + Ptr<RenderTiny::RenderDevice> pRender; RendererParams RenderParams; int Width, Height; - bool Quit; // *** Oculus HMD Variables - Ptr<DeviceManager> pManager; Ptr<SensorDevice> pSensor; Ptr<HMDDevice> pHMD; SensorFusion SFusion; OVR::HMDInfo HMDInfo; - + // Last update seconds, used for move speed timing. double LastUpdate; OVR::UInt64 StartupTicks; - + // Position and look. The following apply: Vector3f EyePos; - float EyeYaw; // Rotation around Y, CCW positive when looking at RHS (X,Z) plane. - float EyePitch; // Pitch. If sensor is plugged in, only read from sensor. - float EyeRoll; // Roll, only accessible from Sensor. - float LastSensorYaw; // Stores previous Yaw value from to support computing delta. - + // Rotation around Y, CCW positive when looking at RHS (X,Z) plane. + float EyeYaw; + // Pitch. If sensor is plugged in, only read from sensor. + float EyePitch; + // Roll, only accessible from Sensor. + float EyeRoll; + // Stores previous Yaw value from to support computing delta. + float LastSensorYaw; + // Movement state; different bits may be set based on the state of keys. UByte MoveForward; UByte MoveBack; UByte MoveLeft; UByte MoveRight; - - Matrix4f ViewMat; + Vector3f GamepadMove, GamepadRotate; + + Matrix4f View; RenderTiny::Scene Scene; - + // Stereo view parameters. StereoConfig SConfig; PostProcessType PostProcess; - + // Shift accelerates movement/adjustment velocity. bool ShiftDown; bool ControlDown; @@ -219,5 +171,3 @@ protected: // Adds sample models and lights to the argument scene. void PopulateRoomScene(Scene* scene, RenderDevice* render); - -#endif diff --git a/Samples/OculusRoomTiny/OculusRoomTiny.rc b/Samples/OculusRoomTiny/OculusRoomTiny.rc Binary files differdeleted file mode 100644 index 49a6a5a..0000000 --- a/Samples/OculusRoomTiny/OculusRoomTiny.rc +++ /dev/null diff --git a/Samples/OculusRoomTiny/OculusRoomTiny_Msvc2010.vcxproj b/Samples/OculusRoomTiny/OculusRoomTiny_Msvc2010.vcxproj deleted file mode 100644 index 4bc37a8..0000000 --- a/Samples/OculusRoomTiny/OculusRoomTiny_Msvc2010.vcxproj +++ /dev/null @@ -1,187 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup Label="ProjectConfigurations"> - <ProjectConfiguration Include="Debug|Win32"> - <Configuration>Debug</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Debug|x64"> - <Configuration>Debug</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|Win32"> - <Configuration>Release</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|x64"> - <Configuration>Release</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - </ItemGroup> - <PropertyGroup Label="Globals"> - <ProjectGuid>{80523489-2881-4F64-8C3B-FAF88B60ABCD}</ProjectGuid> - <Keyword>Win32Proj</Keyword> - <RootNamespace>OculusRoomTiny</RootNamespace> - <ProjectName>OculusRoomTiny</ProjectName> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> - <ConfigurationType>Application</ConfigurationType> - <UseDebugLibraries>true</UseDebugLibraries> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> - <ConfigurationType>Application</ConfigurationType> - <UseDebugLibraries>true</UseDebugLibraries> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> - <ConfigurationType>Application</ConfigurationType> - <UseDebugLibraries>false</UseDebugLibraries> - <WholeProgramOptimization>true</WholeProgramOptimization> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> - <ConfigurationType>Application</ConfigurationType> - <UseDebugLibraries>false</UseDebugLibraries> - <WholeProgramOptimization>true</WholeProgramOptimization> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> - <ImportGroup Label="ExtensionSettings"> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <PropertyGroup Label="UserMacros" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>true</LinkIncremental> - <IntDir>$(Configuration)\Obj\</IntDir> - <OutDir>$(ProjectDir)$(Configuration)\</OutDir> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <LinkIncremental>true</LinkIncremental> - <IntDir>$(Configuration)\Obj\</IntDir> - <OutDir>$(ProjectDir)$(Configuration)\</OutDir> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <LinkIncremental>false</LinkIncremental> - <IntDir>$(Configuration)\Obj\</IntDir> - <OutDir>$(ProjectDir)$(Configuration)\</OutDir> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <LinkIncremental>false</LinkIncremental> - <IntDir>$(Configuration)\Obj\</IntDir> - <OutDir>$(ProjectDir)$(Configuration)\</OutDir> - </PropertyGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <ClCompile> - <PrecompiledHeader> - </PrecompiledHeader> - <WarningLevel>Level4</WarningLevel> - <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>OVR_BUILD_DEBUG;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>../../LibOVR/Include;../../LibOVR/Src;../../3rdParty/glext;$(DXSDK_DIR)/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <DebugInformationFormat>OldStyle</DebugInformationFormat> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <MinimalRebuild>false</MinimalRebuild> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - <AdditionalDependencies>libovrd.lib;dxgi.lib;d3d10.lib;d3d11.lib;d3dcompiler.lib;opengl32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> - <AdditionalLibraryDirectories>../../LibOVR/Lib/Win32;$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <ClCompile> - <PrecompiledHeader> - </PrecompiledHeader> - <WarningLevel>Level4</WarningLevel> - <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>OVR_BUILD_DEBUG;WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>../../LibOVR/Include;../../LibOVR/Src;../../3rdParty/glext;$(DXSDK_DIR)/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <DebugInformationFormat>OldStyle</DebugInformationFormat> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <MinimalRebuild>false</MinimalRebuild> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - <AdditionalDependencies>libovr64d.lib;dxgi.lib;d3d10.lib;d3d11.lib;d3dcompiler.lib;opengl32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> - <AdditionalLibraryDirectories>../../LibOVR/Lib/x64;$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <ClCompile> - <WarningLevel>Level4</WarningLevel> - <PrecompiledHeader> - </PrecompiledHeader> - <Optimization>MaxSpeed</Optimization> - <FunctionLevelLinking>true</FunctionLevelLinking> - <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>../../LibOVR/Include;../../LibOVR/Src;../../3rdParty/glext;$(DXSDK_DIR)/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <RuntimeLibrary>MultiThreaded</RuntimeLibrary> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <DebugInformationFormat>OldStyle</DebugInformationFormat> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>false</GenerateDebugInformation> - <EnableCOMDATFolding>true</EnableCOMDATFolding> - <OptimizeReferences>true</OptimizeReferences> - <AdditionalLibraryDirectories>../../LibOVR/Lib/Win32;$(DXSDK_DIR)/Lib/x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> - <AdditionalDependencies>libovr.lib;dxgi.lib;d3d10.lib;d3d11.lib;d3dcompiler.lib;opengl32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <ClCompile> - <WarningLevel>Level4</WarningLevel> - <PrecompiledHeader> - </PrecompiledHeader> - <Optimization>MaxSpeed</Optimization> - <FunctionLevelLinking>true</FunctionLevelLinking> - <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>../../LibOVR/Include;../../LibOVR/Src;../../3rdParty/glext;$(DXSDK_DIR)/Include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> - <RuntimeLibrary>MultiThreaded</RuntimeLibrary> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <DebugInformationFormat>OldStyle</DebugInformationFormat> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - <EnableCOMDATFolding>true</EnableCOMDATFolding> - <OptimizeReferences>true</OptimizeReferences> - <AdditionalLibraryDirectories>../../LibOVR/Lib/x64;$(DXSDK_DIR)/Lib/x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> - <AdditionalDependencies>libovr64.lib;dxgi.lib;d3d10.lib;d3d11.lib;d3dcompiler.lib;opengl32.lib;winmm.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)</AdditionalDependencies> - </Link> - </ItemDefinitionGroup> - <ItemGroup> - <ClCompile Include="OculusRoomModel.cpp" /> - <ClCompile Include="RenderTiny_D3D1X_Device.cpp" /> - <ClCompile Include="RenderTiny_Device.cpp" /> - <ClCompile Include="Win32_OculusRoomTiny.cpp" /> - </ItemGroup> - <ItemGroup> - <ClInclude Include="RenderTiny_D3D1X_Device.h" /> - <ClInclude Include="RenderTiny_Device.h" /> - <ClInclude Include="Win32_OculusRoomTiny.h" /> - </ItemGroup> - <ItemGroup> - <ResourceCompile Include="OculusRoomTiny.rc" /> - </ItemGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> - <ImportGroup Label="ExtensionTargets"> - </ImportGroup> -</Project>
\ No newline at end of file diff --git a/Samples/OculusRoomTiny/OculusRoomTiny_Msvc2010.vcxproj.filters b/Samples/OculusRoomTiny/OculusRoomTiny_Msvc2010.vcxproj.filters deleted file mode 100644 index 3c09bd5..0000000 --- a/Samples/OculusRoomTiny/OculusRoomTiny_Msvc2010.vcxproj.filters +++ /dev/null @@ -1,17 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup> - <ClCompile Include="OculusRoomModel.cpp" /> - <ClCompile Include="RenderTiny_D3D1X_Device.cpp" /> - <ClCompile Include="RenderTiny_Device.cpp" /> - <ClCompile Include="Win32_OculusRoomTiny.cpp" /> - </ItemGroup> - <ItemGroup> - <ClInclude Include="RenderTiny_Device.h" /> - <ClInclude Include="RenderTiny_D3D1X_Device.h" /> - <ClInclude Include="Win32_OculusRoomTiny.h" /> - </ItemGroup> - <ItemGroup> - <ResourceCompile Include="OculusRoomTiny.rc" /> - </ItemGroup> -</Project>
\ No newline at end of file diff --git a/Samples/OculusRoomTiny/RenderTiny_D3D1X_Device.cpp b/Samples/OculusRoomTiny/RenderTiny_D3D1X_Device.cpp deleted file mode 100644 index a1a567a..0000000 --- a/Samples/OculusRoomTiny/RenderTiny_D3D1X_Device.cpp +++ /dev/null @@ -1,1311 +0,0 @@ -/************************************************************************************ - -Filename : RenderTiny_D3D1x.cpp -Content : RenderDevice implementation for D3DX10/11. -Created : September 10, 2012 -Authors : Andrew Reisse - -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. -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 "Kernel/OVR_Log.h" -#include "Kernel/OVR_Std.h" - -#include "RenderTiny_D3D1X_Device.h" - -#include <d3dcompiler.h> - -namespace OVR { namespace RenderTiny { namespace D3D10 { - - -//------------------------------------------------------------------------------------- -// Vertex format -static D3D1x_(INPUT_ELEMENT_DESC) ModelVertexDesc[] = -{ - {"Position", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, offsetof(Vertex, Pos), D3D1x_(INPUT_PER_VERTEX_DATA), 0}, - {"Color", 0, DXGI_FORMAT_R8G8B8A8_UNORM, 0, offsetof(Vertex, C), D3D1x_(INPUT_PER_VERTEX_DATA), 0}, - {"TexCoord", 0, DXGI_FORMAT_R32G32_FLOAT, 0, offsetof(Vertex, U), D3D1x_(INPUT_PER_VERTEX_DATA), 0}, - {"Normal", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, offsetof(Vertex, Norm), D3D1x_(INPUT_PER_VERTEX_DATA), 0}, -}; - -// These shaders are used to render the world, including lit vertex-colored and textured geometry. - -// Used for world geometry; has projection matrix. -static const char* StdVertexShaderSrc = - "float4x4 Proj;\n" - "float4x4 View;\n" - "struct Varyings\n" - "{\n" - " float4 Position : SV_Position;\n" - " float4 Color : COLOR0;\n" - " float2 TexCoord : TEXCOORD0;\n" - " float3 Normal : NORMAL;\n" - " float3 VPos : TEXCOORD4;\n" - "};\n" - "void main(in float4 Position : POSITION, in float4 Color : COLOR0, in float2 TexCoord : TEXCOORD0," - " in float3 Normal : NORMAL,\n" - " out Varyings ov)\n" - "{\n" - " ov.Position = mul(Proj, mul(View, Position));\n" - " ov.Normal = mul(View, Normal);\n" - " ov.VPos = mul(View, Position);\n" - " ov.TexCoord = TexCoord;\n" - " ov.Color = Color;\n" - "}\n"; - -// Used for text/clearing; no projection. -static const char* DirectVertexShaderSrc = - "float4x4 View : register(c4);\n" - "void main(in float4 Position : POSITION, in float4 Color : COLOR0,\n" - " in float2 TexCoord : TEXCOORD0, in float3 Normal : NORMAL,\n" - " out float4 oPosition : SV_Position, out float4 oColor : COLOR,\n" - " out float2 oTexCoord : TEXCOORD0," - " out float3 oNormal : NORMAL)\n" - "{\n" - " oPosition = mul(View, Position);\n" - " oTexCoord = TexCoord;\n" - " oColor = Color;\n" - " oNormal = mul(View, Normal);\n" - "}\n"; - -static const char* SolidPixelShaderSrc = - "float4 Color;\n" - "struct Varyings\n" - "{\n" - " float4 Position : SV_Position;\n" - " float4 Color : COLOR0;\n" - " float2 TexCoord : TEXCOORD0;\n" - "};\n" - "float4 main(in Varyings ov) : SV_Target\n" - "{\n" - " return Color;\n" - "}\n"; - -static const char* GouraudPixelShaderSrc = - "struct Varyings\n" - "{\n" - " float4 Position : SV_Position;\n" - " float4 Color : COLOR0;\n" - " float2 TexCoord : TEXCOORD0;\n" - "};\n" - "float4 main(in Varyings ov) : SV_Target\n" - "{\n" - " return ov.Color;\n" - "}\n"; - -static const char* TexturePixelShaderSrc = - "Texture2D Texture : register(t0);\n" - "SamplerState Linear : register(s0);\n" - "struct Varyings\n" - "{\n" - " float4 Position : SV_Position;\n" - " float4 Color : COLOR0;\n" - " float2 TexCoord : TEXCOORD0;\n" - "};\n" - "float4 main(in Varyings ov) : SV_Target\n" - "{\n" - " float4 color2 = ov.Color * Texture.Sample(Linear, ov.TexCoord);\n" - " if (color2.a <= 0.4)\n" - " discard;\n" - " return color2;\n" - "}\n"; - - -#define LIGHTING_COMMON \ - "cbuffer Lighting : register(b1)\n" \ - "{\n" \ - " float3 Ambient;\n" \ - " float3 LightPos[8];\n" \ - " float4 LightColor[8];\n" \ - " float LightCount;\n" \ - "};\n" \ - "struct Varyings\n" \ - "{\n" \ - " float4 Position : SV_Position;\n" \ - " float4 Color : COLOR0;\n" \ - " float2 TexCoord : TEXCOORD0;\n" \ - " float3 Normal : NORMAL;\n" \ - " float3 VPos : TEXCOORD4;\n" \ - "};\n" \ - "float4 DoLight(Varyings v)\n" \ - "{\n" \ - " float3 norm = normalize(v.Normal);\n" \ - " float3 light = Ambient;\n" \ - " for (uint i = 0; i < LightCount; i++)\n"\ - " {\n" \ - " float3 ltp = (LightPos[i] - v.VPos);\n" \ - " float ldist = dot(ltp,ltp);\n" \ - " ltp = normalize(ltp);\n" \ - " light += saturate(LightColor[i] * v.Color.rgb * dot(norm, ltp) / sqrt(ldist));\n"\ - " }\n" \ - " return float4(light, v.Color.a);\n" \ - "}\n" - -static const char* LitSolidPixelShaderSrc = - LIGHTING_COMMON - "float4 main(in Varyings ov) : SV_Target\n" - "{\n" - " return DoLight(ov) * ov.Color;\n" - "}\n"; - -static const char* LitTexturePixelShaderSrc = - "Texture2D Texture : register(t0);\n" - "SamplerState Linear : register(s0);\n" - LIGHTING_COMMON - "float4 main(in Varyings ov) : SV_Target\n" - "{\n" - " return DoLight(ov) * Texture.Sample(Linear, ov.TexCoord);\n" - "}\n"; - - -//------------------------------------------------------------------------------------- -// ***** Distortion Post-process Shaders - -static const char* PostProcessVertexShaderSrc = - "float4x4 View : register(c4);\n" - "float4x4 Texm : register(c8);\n" - "void main(in float4 Position : POSITION, in float4 Color : COLOR0, in float2 TexCoord : TEXCOORD0,\n" - " out float4 oPosition : SV_Position, out float4 oColor : COLOR, out float2 oTexCoord : TEXCOORD0)\n" - "{\n" - " oPosition = mul(View, Position);\n" - " oTexCoord = mul(Texm, float4(TexCoord,0,1));\n" - " oColor = Color;\n" - "}\n"; - -// Shader with just lens distortion correction. -static const char* PostProcessPixelShaderSrc = - "Texture2D Texture : register(t0);\n" - "SamplerState Linear : register(s0);\n" - "float2 LensCenter;\n" - "float2 ScreenCenter;\n" - "float2 Scale;\n" - "float2 ScaleIn;\n" - "float4 HmdWarpParam;\n" - "\n" - - // Scales input texture coordinates for distortion. - // ScaleIn maps texture coordinates to Scales to ([-1, 1]), although top/bottom will be - // larger due to aspect ratio. - "float2 HmdWarp(float2 in01)\n" - "{\n" - " float2 theta = (in01 - LensCenter) * ScaleIn;\n" // Scales to [-1, 1] - " float rSq = theta.x * theta.x + theta.y * theta.y;\n" - " float2 theta1 = theta * (HmdWarpParam.x + HmdWarpParam.y * rSq + " - " HmdWarpParam.z * rSq * rSq + HmdWarpParam.w * rSq * rSq * rSq);\n" - " return LensCenter + Scale * theta1;\n" - "}\n" - - "float4 main(in float4 oPosition : SV_Position, in float4 oColor : COLOR,\n" - " in float2 oTexCoord : TEXCOORD0) : SV_Target\n" - "{\n" - " float2 tc = HmdWarp(oTexCoord);\n" - " if (any(clamp(tc, ScreenCenter-float2(0.25,0.5), ScreenCenter+float2(0.25, 0.5)) - tc))\n" - " return 0;\n" - " return Texture.Sample(Linear, tc);\n" - "}\n"; - -// Shader with lens distortion and chromatic aberration correction. -static const char* PostProcessPixelShaderWithChromAbSrc = - "Texture2D Texture : register(t0);\n" - "SamplerState Linear : register(s0);\n" - "float2 LensCenter;\n" - "float2 ScreenCenter;\n" - "float2 Scale;\n" - "float2 ScaleIn;\n" - "float4 HmdWarpParam;\n" - "float4 ChromAbParam;\n" - "\n" - - // Scales input texture coordinates for distortion. - // ScaleIn maps texture coordinates to Scales to ([-1, 1]), although top/bottom will be - // larger due to aspect ratio. - "float4 main(in float4 oPosition : SV_Position, in float4 oColor : COLOR,\n" - " in float2 oTexCoord : TEXCOORD0) : SV_Target\n" - "{\n" - " float2 theta = (oTexCoord - LensCenter) * ScaleIn;\n" // Scales to [-1, 1] - " float rSq= theta.x * theta.x + theta.y * theta.y;\n" - " float2 theta1 = theta * (HmdWarpParam.x + HmdWarpParam.y * rSq + " - " HmdWarpParam.z * rSq * rSq + HmdWarpParam.w * rSq * rSq * rSq);\n" - " \n" - " // Detect whether blue texture coordinates are out of range since these will scaled out the furthest.\n" - " float2 thetaBlue = theta1 * (ChromAbParam.z + ChromAbParam.w * rSq);\n" - " float2 tcBlue = LensCenter + Scale * thetaBlue;\n" - " if (any(clamp(tcBlue, ScreenCenter-float2(0.25,0.5), ScreenCenter+float2(0.25, 0.5)) - tcBlue))\n" - " return 0;\n" - " \n" - " // Now do blue texture lookup.\n" - " float blue = Texture.Sample(Linear, tcBlue).b;\n" - " \n" - " // Do green lookup (no scaling).\n" - " float2 tcGreen = LensCenter + Scale * theta1;\n" - " float green = Texture.Sample(Linear, tcGreen).g;\n" - " \n" - " // Do red scale and lookup.\n" - " float2 thetaRed = theta1 * (ChromAbParam.x + ChromAbParam.y * rSq);\n" - " float2 tcRed = LensCenter + Scale * thetaRed;\n" - " float red = Texture.Sample(Linear, tcRed).r;\n" - " \n" - " return float4(red, green, blue, 1);\n" - "}\n"; - - -static const char* VShaderSrcs[VShader_Count] = -{ - DirectVertexShaderSrc, - StdVertexShaderSrc, - PostProcessVertexShaderSrc -}; -static const char* FShaderSrcs[FShader_Count] = -{ - SolidPixelShaderSrc, - GouraudPixelShaderSrc, - TexturePixelShaderSrc, - PostProcessPixelShaderSrc, - PostProcessPixelShaderWithChromAbSrc, - LitSolidPixelShaderSrc, - LitTexturePixelShaderSrc -}; - - -//------------------------------------------------------------------------------------- -// ***** Buffer - -Buffer::~Buffer() -{ -} - -bool Buffer::Data(int use, const void *buffer, size_t size) -{ - if (D3DBuffer && Size >= size) - { - if (Dynamic) - { - if (!buffer) - return true; - - void* v = Map(0, size, Map_Discard); - if (v) - { - memcpy(v, buffer, size); - Unmap(v); - return true; - } - } - else - { - Ren->Context->UpdateSubresource(D3DBuffer, 0, NULL, buffer, 0, 0); - return true; - } - } - if (D3DBuffer) - { - D3DBuffer = NULL; - Size = 0; - Use = 0; - Dynamic = 0; - } - - D3D1x_(BUFFER_DESC) desc; - memset(&desc, 0, sizeof(desc)); - if (use & Buffer_ReadOnly) - { - desc.Usage = D3D1x_(USAGE_IMMUTABLE); - desc.CPUAccessFlags = 0; - } - else - { - desc.Usage = D3D1x_(USAGE_DYNAMIC); - desc.CPUAccessFlags = D3D1x_(CPU_ACCESS_WRITE); - Dynamic = 1; - } - - switch(use & Buffer_TypeMask) - { - case Buffer_Vertex: desc.BindFlags = D3D1x_(BIND_VERTEX_BUFFER); break; - case Buffer_Index: desc.BindFlags = D3D1x_(BIND_INDEX_BUFFER); break; - case Buffer_Uniform: - desc.BindFlags = D3D1x_(BIND_CONSTANT_BUFFER); - size += ((size + 15) & ~15) - size; - break; - } - - desc.ByteWidth = (unsigned)size; - - D3D1x_(SUBRESOURCE_DATA) sr; - sr.pSysMem = buffer; - sr.SysMemPitch = 0; - sr.SysMemSlicePitch = 0; - - HRESULT hr = Ren->Device->CreateBuffer(&desc, buffer ? &sr : NULL, &D3DBuffer.GetRawRef()); - if (SUCCEEDED(hr)) - { - Use = use; - Size = desc.ByteWidth; - return 1; - } - return 0; -} - -void* Buffer::Map(size_t start, size_t size, int flags) -{ - OVR_UNUSED(size); - - D3D1x_(MAP) mapFlags = D3D1x_(MAP_WRITE); - if (flags & Map_Discard) - mapFlags = D3D1x_(MAP_WRITE_DISCARD); - if (flags & Map_Unsynchronized) - mapFlags = D3D1x_(MAP_WRITE_NO_OVERWRITE); - - void* map = 0; - if (SUCCEEDED(D3DBuffer->Map(mapFlags, 0, &map))) - return ((char*)map) + start; - return NULL; -} - -bool Buffer::Unmap(void *m) -{ - OVR_UNUSED(m); - - D3DBuffer->Unmap(); - return true; -} - - -//------------------------------------------------------------------------------------- -// Shaders - -template<> bool Shader<RenderTiny::Shader_Vertex, ID3D10VertexShader>::Load(void* shader, size_t size) -{ - return SUCCEEDED(Ren->Device->CreateVertexShader(shader, size, &D3DShader)); -} -template<> bool Shader<RenderTiny::Shader_Pixel, ID3D10PixelShader>::Load(void* shader, size_t size) -{ - return SUCCEEDED(Ren->Device->CreatePixelShader(shader, size, &D3DShader)); -} - -template<> void Shader<RenderTiny::Shader_Vertex, ID3D10VertexShader>::Set(PrimitiveType) const -{ - Ren->Context->VSSetShader(D3DShader); -} -template<> void Shader<RenderTiny::Shader_Pixel, ID3D10PixelShader>::Set(PrimitiveType) const -{ - Ren->Context->PSSetShader(D3DShader); -} - -template<> void Shader<RenderTiny::Shader_Vertex, ID3D1xVertexShader>::SetUniformBuffer(RenderTiny::Buffer* buffer, int i) -{ - Ren->Context->VSSetConstantBuffers(i, 1, &((Buffer*)buffer)->D3DBuffer.GetRawRef()); -} -template<> void Shader<RenderTiny::Shader_Pixel, ID3D1xPixelShader>::SetUniformBuffer(RenderTiny::Buffer* buffer, int i) -{ - Ren->Context->PSSetConstantBuffers(i, 1, &((Buffer*)buffer)->D3DBuffer.GetRawRef()); -} - - -//------------------------------------------------------------------------------------- -// ***** Shader Base - -ShaderBase::ShaderBase(RenderDevice* r, ShaderStage stage) - : RenderTiny::Shader(stage), Ren(r), UniformData(0) -{ -} -ShaderBase::~ShaderBase() -{ - if (UniformData) - OVR_FREE(UniformData); -} - -bool ShaderBase::SetUniform(const char* name, int n, const float* v) -{ - for(unsigned i = 0; i < UniformInfo.GetSize(); i++) - { - if (!strcmp(UniformInfo[i].Name.ToCStr(), name)) - { - memcpy(UniformData + UniformInfo[i].Offset, v, n * sizeof(float)); - return 1; - } - } - return 0; -} - -void ShaderBase::InitUniforms(ID3D10Blob* s) -{ - ID3D10ShaderReflection* ref = NULL; - D3D10ReflectShader(s->GetBufferPointer(), s->GetBufferSize(), &ref); - ID3D10ShaderReflectionConstantBuffer* buf = ref->GetConstantBufferByIndex(0); - D3D10_SHADER_BUFFER_DESC bufd; - if (FAILED(buf->GetDesc(&bufd))) - { - UniformsSize = 0; - if (UniformData) - { - OVR_FREE(UniformData); - UniformData = 0; - } - return; - } - - for(unsigned i = 0; i < bufd.Variables; i++) - { - ID3D10ShaderReflectionVariable* var = buf->GetVariableByIndex(i); - if (var) - { - D3D10_SHADER_VARIABLE_DESC vd; - if (SUCCEEDED(var->GetDesc(&vd))) - { - Uniform u; - u.Name = vd.Name; - u.Offset = vd.StartOffset; - u.Size = vd.Size; - UniformInfo.PushBack(u); - } - } - } - - UniformsSize = bufd.Size; - UniformData = (unsigned char*)OVR_ALLOC(bufd.Size); -} - -void ShaderBase::UpdateBuffer(Buffer* buf) -{ - if (UniformsSize) - { - buf->Data(Buffer_Uniform, UniformData, UniformsSize); - } -} - - -//------------------------------------------------------------------------------------- -// ***** Texture -// -Texture::Texture(RenderDevice* ren, int fmt, int w, int h) - : Ren(ren), Tex(NULL), TexSv(NULL), TexRtv(NULL), TexDsv(NULL), Width(w), Height(h) -{ - OVR_UNUSED(fmt); - Sampler = Ren->GetSamplerState(0); -} - -Texture::~Texture() -{ -} - -void Texture::Set(int slot, RenderTiny::ShaderStage stage) const -{ - Ren->SetTexture(stage, slot, this); -} - -void Texture::SetSampleMode(int sm) -{ - Sampler = Ren->GetSamplerState(sm); -} - - - -//------------------------------------------------------------------------------------- -// ***** Render Device - -RenderDevice::RenderDevice(const RendererParams& p, HWND window) -{ - RECT rc; - GetClientRect(window, &rc); - UINT width = rc.right - rc.left; - UINT height = rc.bottom - rc.top; - WindowWidth = width; - WindowHeight = height; - Window = window; - Params = p; - - HRESULT hr = CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)(&DXGIFactory.GetRawRef())); - if (FAILED(hr)) - return; - - // Find the adapter & output (monitor) to use for fullscreen, based on the reported name of the HMD's monitor. - if (Params.MonitorName.GetLength() > 0) - { - for(UINT AdapterIndex = 0; ; AdapterIndex++) - { - HRESULT hr = DXGIFactory->EnumAdapters(AdapterIndex, &Adapter.GetRawRef()); - if (hr == DXGI_ERROR_NOT_FOUND) - break; - - DXGI_ADAPTER_DESC Desc; - Adapter->GetDesc(&Desc); - - UpdateMonitorOutputs(); - - if (FullscreenOutput) - break; - } - - if (!FullscreenOutput) - Adapter = NULL; - } - - if (!Adapter) - { - DXGIFactory->EnumAdapters(0, &Adapter.GetRawRef()); - } - - int flags = 0; - - hr = D3D10CreateDevice(Adapter, D3D10_DRIVER_TYPE_HARDWARE, NULL, flags, D3D1x_(SDK_VERSION), - &Device.GetRawRef()); - Context = Device; - Context->AddRef(); - - if (FAILED(hr)) - return; - - if (!RecreateSwapChain()) - return; - - if (Params.Fullscreen) - SwapChain->SetFullscreenState(1, FullscreenOutput); - - CurRenderTarget = NULL; - for(int i = 0; i < Shader_Count; i++) - { - UniformBuffers[i] = *CreateBuffer(); - MaxTextureSet[i] = 0; - } - - ID3D10Blob* vsData = CompileShader("vs_4_0", DirectVertexShaderSrc); - VertexShaders[VShader_MV] = *new VertexShader(this, vsData); - for(int i = 1; i < VShader_Count; i++) - { - VertexShaders[i] = *new VertexShader(this, CompileShader("vs_4_0", VShaderSrcs[i])); - } - - for(int i = 0; i < FShader_Count; i++) - { - PixelShaders[i] = *new PixelShader(this, CompileShader("ps_4_0", FShaderSrcs[i])); - } - - SPInt bufferSize = vsData->GetBufferSize(); - const void* buffer = vsData->GetBufferPointer(); - ID3D1xInputLayout** objRef = &ModelVertexIL.GetRawRef(); - - HRESULT validate = Device->CreateInputLayout(ModelVertexDesc, sizeof(ModelVertexDesc)/sizeof(D3D1x_(INPUT_ELEMENT_DESC)), - buffer, bufferSize, objRef); - OVR_UNUSED(validate); - - Ptr<ShaderSet> gouraudShaders = *new ShaderSet(); - gouraudShaders->SetShader(VertexShaders[VShader_MVP]); - gouraudShaders->SetShader(PixelShaders[FShader_Gouraud]); - DefaultFill = *new ShaderFill(gouraudShaders); - - D3D1x_(BLEND_DESC) bm; - memset(&bm, 0, sizeof(bm)); - bm.BlendEnable[0] = true; - bm.BlendOp = bm.BlendOpAlpha = D3D1x_(BLEND_OP_ADD); - bm.SrcBlend = bm.SrcBlendAlpha = D3D1x_(BLEND_SRC_ALPHA); - bm.DestBlend = bm.DestBlendAlpha = D3D1x_(BLEND_INV_SRC_ALPHA); - bm.RenderTargetWriteMask[0] = D3D1x_(COLOR_WRITE_ENABLE_ALL); - Device->CreateBlendState(&bm, &BlendState.GetRawRef()); - - D3D1x_(RASTERIZER_DESC) rs; - memset(&rs, 0, sizeof(rs)); - rs.AntialiasedLineEnable = true; - rs.CullMode = D3D1x_(CULL_BACK); - rs.DepthClipEnable = true; - rs.FillMode = D3D1x_(FILL_SOLID); - Device->CreateRasterizerState(&rs, &Rasterizer.GetRawRef()); - - QuadVertexBuffer = *CreateBuffer(); - const RenderTiny::Vertex QuadVertices[] = - { Vertex(Vector3f(0, 1, 0)), Vertex(Vector3f(1, 1, 0)), - Vertex(Vector3f(0, 0, 0)), Vertex(Vector3f(1, 0, 0)) }; - QuadVertexBuffer->Data(Buffer_Vertex, QuadVertices, sizeof(QuadVertices)); - - SetDepthMode(0, 0); -} - -RenderDevice::~RenderDevice() -{ - if (SwapChain && Params.Fullscreen) - { - SwapChain->SetFullscreenState(false, NULL); - } -} - - -// Implement static initializer function to create this class. -RenderTiny::RenderDevice* RenderDevice::CreateDevice(const RendererParams& rp, void* oswnd) -{ - return new RenderDevice(rp, (HWND)oswnd); -} - - -// Fallback monitor enumeration in case newly plugged in monitor wasn't detected. -// Added originally for the FactoryTest app. -// New Outputs don't seem to be detected unless adapter is re-created, but that would also -// require us to re-initialize D3D10 (recreating objects, etc). This bypasses that for "fake" -// fullscreen modes. -BOOL CALLBACK MonitorEnumFunc(HMONITOR hMonitor, HDC, LPRECT, LPARAM dwData) -{ - RenderDevice* renderer = (RenderDevice*)dwData; - - MONITORINFOEX monitor; - monitor.cbSize = sizeof(monitor); - - if (::GetMonitorInfo(hMonitor, &monitor) && monitor.szDevice[0]) - { - DISPLAY_DEVICE dispDev; - memset(&dispDev, 0, sizeof(dispDev)); - dispDev.cb = sizeof(dispDev); - - if (::EnumDisplayDevices(monitor.szDevice, 0, &dispDev, 0)) - { - if (strstr(String(dispDev.DeviceName).ToCStr(), renderer->GetParams().MonitorName.ToCStr())) - { - renderer->FSDesktopX = monitor.rcMonitor.left; - renderer->FSDesktopY = monitor.rcMonitor.top; - return FALSE; - } - } - } - - return TRUE; -} - - -void RenderDevice::UpdateMonitorOutputs() -{ - HRESULT hr; - - bool deviceNameFound = false; - - for(UINT OutputIndex = 0; ; OutputIndex++) - { - Ptr<IDXGIOutput> Output; - hr = Adapter->EnumOutputs(OutputIndex, &Output.GetRawRef()); - if (hr == DXGI_ERROR_NOT_FOUND) - { - break; - } - - DXGI_OUTPUT_DESC OutDesc; - Output->GetDesc(&OutDesc); - - MONITORINFOEX monitor; - monitor.cbSize = sizeof(monitor); - if (::GetMonitorInfo(OutDesc.Monitor, &monitor) && monitor.szDevice[0]) - { - DISPLAY_DEVICE dispDev; - memset(&dispDev, 0, sizeof(dispDev)); - dispDev.cb = sizeof(dispDev); - - if (::EnumDisplayDevices(monitor.szDevice, 0, &dispDev, 0)) - { - if (strstr(String(dispDev.DeviceName).ToCStr(), Params.MonitorName.ToCStr())) - { - deviceNameFound = true; - FullscreenOutput = Output; - FSDesktopX = monitor.rcMonitor.left; - FSDesktopY = monitor.rcMonitor.top; - break; - } - } - } - } - - if (!deviceNameFound && !Params.MonitorName.IsEmpty()) - { - EnumDisplayMonitors(0, 0, MonitorEnumFunc, (LPARAM)this); - } -} - -bool RenderDevice::RecreateSwapChain() -{ - DXGI_SWAP_CHAIN_DESC scDesc; - memset(&scDesc, 0, sizeof(scDesc)); - scDesc.BufferCount = 1; - scDesc.BufferDesc.Width = WindowWidth; - scDesc.BufferDesc.Height = WindowHeight; - scDesc.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - scDesc.BufferDesc.RefreshRate.Numerator = 60; - scDesc.BufferDesc.RefreshRate.Denominator = 1; - scDesc.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; - scDesc.OutputWindow = Window; - scDesc.SampleDesc.Count = Params.Multisample; - scDesc.SampleDesc.Quality = 0; - scDesc.Windowed = (Params.Fullscreen != Display_Fullscreen); - scDesc.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH; - - if (SwapChain) - { - SwapChain->SetFullscreenState(FALSE, NULL); - SwapChain->Release(); - SwapChain = NULL; - } - - Ptr<IDXGISwapChain> newSC; - if (FAILED(DXGIFactory->CreateSwapChain(Device, &scDesc, &newSC.GetRawRef()))) - return false; - SwapChain = newSC; - - BackBuffer = NULL; - BackBufferRT = NULL; - HRESULT hr = SwapChain->GetBuffer(0, __uuidof(ID3D1xTexture2D), (void**)&BackBuffer.GetRawRef()); - if (FAILED(hr)) - return false; - - hr = Device->CreateRenderTargetView(BackBuffer, NULL, &BackBufferRT.GetRawRef()); - if (FAILED(hr)) - return false; - - Texture* depthBuffer = GetDepthBuffer(WindowWidth, WindowHeight, Params.Multisample); - CurDepthBuffer = depthBuffer; - if (CurRenderTarget == NULL) - { - Context->OMSetRenderTargets(1, &BackBufferRT.GetRawRef(), depthBuffer->TexDsv); - } - return true; -} - -bool RenderDevice::SetParams(const RendererParams& newParams) -{ - String oldMonitor = Params.MonitorName; - - Params = newParams; - if (newParams.MonitorName != oldMonitor) - { - UpdateMonitorOutputs(); - } - - // Cause this to be recreated with the new multisample mode. - pSceneColorTex = NULL; - return RecreateSwapChain(); -} - - -bool RenderDevice::SetFullscreen(DisplayMode fullscreen) -{ - if (fullscreen == Params.Fullscreen) - return true; - - HRESULT hr = SwapChain->SetFullscreenState(fullscreen, fullscreen ? FullscreenOutput : NULL); - if (FAILED(hr)) - { - return false; - } - - Params.Fullscreen = fullscreen; - return true; -} - -void RenderDevice::SetRealViewport(const Viewport& vp) -{ - D3DViewport.Width = vp.w; - D3DViewport.Height = vp.h; - D3DViewport.MinDepth = 0; - D3DViewport.MaxDepth = 1; - D3DViewport.TopLeftX = vp.x; - D3DViewport.TopLeftY = vp.y; - Context->RSSetViewports(1, &D3DViewport); -} - -static int GetDepthStateIndex(bool enable, bool write, RenderDevice::CompareFunc func) -{ - if (!enable) - return 0; - return 1 + int(func) * 2 + write; -} - -void RenderDevice::SetDepthMode(bool enable, bool write, CompareFunc func) -{ - int index = GetDepthStateIndex(enable, write, func); - if (DepthStates[index]) - { - CurDepthState = DepthStates[index]; - Context->OMSetDepthStencilState(DepthStates[index], 0); - return; - } - - D3D1x_(DEPTH_STENCIL_DESC) dss; - memset(&dss, 0, sizeof(dss)); - dss.DepthEnable = enable; - switch(func) - { - case Compare_Always: dss.DepthFunc = D3D1x_(COMPARISON_ALWAYS); break; - case Compare_Less: dss.DepthFunc = D3D1x_(COMPARISON_LESS); break; - case Compare_Greater: dss.DepthFunc = D3D1x_(COMPARISON_GREATER); break; - default: - assert(0); - } - dss.DepthWriteMask = write ? D3D1x_(DEPTH_WRITE_MASK_ALL) : D3D1x_(DEPTH_WRITE_MASK_ZERO); - Device->CreateDepthStencilState(&dss, &DepthStates[index].GetRawRef()); - Context->OMSetDepthStencilState(DepthStates[index], 0); - CurDepthState = DepthStates[index]; -} - -Texture* RenderDevice::GetDepthBuffer(int w, int h, int ms) -{ - for(unsigned i = 0; i < DepthBuffers.GetSize(); i++) - { - if (w == DepthBuffers[i]->Width && h == DepthBuffers[i]->Height && - ms == DepthBuffers[i]->Samples) - return DepthBuffers[i]; - } - - Ptr<Texture> newDepth = *CreateTexture(Texture_Depth | Texture_RenderTarget | ms, w, h, NULL); - if (newDepth == NULL) - { - OVR_DEBUG_LOG(("Failed to get depth buffer.")); - return NULL; - } - - DepthBuffers.PushBack(newDepth); - return newDepth.GetPtr(); -} - -void RenderDevice::Clear(float r, float g, float b, float a, float depth) -{ - const float color[] = {r, g, b, a}; - - // Needed for each eye to do its own clear, since ClearRenderTargetView doesn't honor viewport. - - // Save state that is affected by clearing this way - ID3D1xDepthStencilState* oldDepthState = CurDepthState; - StandardUniformData clearUniforms; - - SetDepthMode(true, true, Compare_Always); - - Context->IASetInputLayout(ModelVertexIL); - Context->GSSetShader(NULL); - - ID3D1xShaderResourceView* sv[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - if (MaxTextureSet[Shader_Fragment]) - { - Context->PSSetShaderResources(0, MaxTextureSet[Shader_Fragment], sv); - } - - ID3D1xBuffer* vertexBuffer = QuadVertexBuffer->GetBuffer(); - UINT vertexStride = sizeof(Vertex); - UINT vertexOffset = 0; - Context->IASetVertexBuffers(0, 1, &vertexBuffer, &vertexStride, &vertexOffset); - - clearUniforms.View = Matrix4f(2, 0, 0, 0, - 0, 2, 0, 0, - 0, 0, 0, 0, - -1, -1, depth, 1); - UniformBuffers[Shader_Vertex]->Data(Buffer_Uniform, &clearUniforms, sizeof(clearUniforms)); - - ID3D1xBuffer* vertexConstants = UniformBuffers[Shader_Vertex]->GetBuffer(); - Context->VSSetConstantBuffers(0, 1, &vertexConstants); - Context->IASetPrimitiveTopology(D3D1x_(PRIMITIVE_TOPOLOGY_TRIANGLESTRIP)); - VertexShaders[VShader_MV]->Set(Prim_TriangleStrip); - PixelShaders[FShader_Solid]->Set(Prim_TriangleStrip); - - UniformBuffers[Shader_Pixel]->Data(Buffer_Uniform, color, sizeof(color)); - PixelShaders[FShader_Solid]->SetUniformBuffer(UniformBuffers[Shader_Pixel]); - - // Clear Viewport - Context->OMSetBlendState(NULL, NULL, 0xffffffff); - Context->Draw(4, 0); - - // reset - CurDepthState = oldDepthState; - Context->OMSetDepthStencilState(CurDepthState, 0); -} - -// Buffers - -Buffer* RenderDevice::CreateBuffer() -{ - return new Buffer(this); -} - - -ID3D10Blob* RenderDevice::CompileShader(const char* profile, const char* src, const char* mainName) -{ - ID3D10Blob* shader; - ID3D10Blob* errors; - HRESULT hr = D3DCompile(src, strlen(src), NULL, NULL, NULL, mainName, profile, - 0, 0, &shader, &errors); - if (FAILED(hr)) - { - OVR_DEBUG_LOG(("Compiling D3D shader for %s failed\n%s\n\n%s", - profile, src, errors->GetBufferPointer())); - OutputDebugStringA((char*)errors->GetBufferPointer()); - return NULL; - } - if (errors) - { - errors->Release(); - } - return shader; -} - -void RenderDevice::SetCommonUniformBuffer(int i, RenderTiny::Buffer* buffer) -{ - CommonUniforms[i] = (Buffer*)buffer; - - Context->PSSetConstantBuffers(1, 1, &CommonUniforms[1]->D3DBuffer.GetRawRef()); - Context->VSSetConstantBuffers(1, 1, &CommonUniforms[1]->D3DBuffer.GetRawRef()); -} - -RenderTiny::Shader *RenderDevice::LoadBuiltinShader(ShaderStage stage, int shader) -{ - switch(stage) - { - case Shader_Vertex: - return VertexShaders[shader]; - case Shader_Pixel: - return PixelShaders[shader]; - default: - return NULL; - } -} - - -ID3D1xSamplerState* RenderDevice::GetSamplerState(int sm) -{ - if (SamplerStates[sm]) - return SamplerStates[sm]; - - D3D1x_(SAMPLER_DESC) ss; - memset(&ss, 0, sizeof(ss)); - if (sm & Sample_Clamp) - ss.AddressU = ss.AddressV = ss.AddressW = D3D1x_(TEXTURE_ADDRESS_CLAMP); - else if (sm & Sample_ClampBorder) - ss.AddressU = ss.AddressV = ss.AddressW = D3D1x_(TEXTURE_ADDRESS_BORDER); - else - ss.AddressU = ss.AddressV = ss.AddressW = D3D1x_(TEXTURE_ADDRESS_WRAP); - - if (sm & Sample_Nearest) - { - ss.Filter = D3D1x_(FILTER_MIN_MAG_MIP_POINT); - } - else if (sm & Sample_Anisotropic) - { - ss.Filter = D3D1x_(FILTER_ANISOTROPIC); - ss.MaxAnisotropy = 8; - } - else - { - ss.Filter = D3D1x_(FILTER_MIN_MAG_MIP_LINEAR); - } - ss.MaxLOD = 15; - Device->CreateSamplerState(&ss, &SamplerStates[sm].GetRawRef()); - return SamplerStates[sm]; -} - - -void RenderDevice::SetTexture(RenderTiny::ShaderStage stage, int slot, const Texture* t) -{ - if (MaxTextureSet[stage] <= slot) - MaxTextureSet[stage] = slot + 1; - - ID3D1xShaderResourceView* sv = t ? t->TexSv : NULL; - switch(stage) - { - case Shader_Fragment: - Context->PSSetShaderResources(slot, 1, &sv); - if (t) - { - Context->PSSetSamplers(slot, 1, &t->Sampler.GetRawRef()); - } - break; - - case Shader_Vertex: - Context->VSSetShaderResources(slot, 1, &sv); - break; - } -} - -Texture* RenderDevice::CreateTexture(int format, int width, int height, const void* data, int mipcount) -{ - OVR_UNUSED(mipcount); - - DXGI_FORMAT d3dformat; - int bpp; - switch(format & Texture_TypeMask) - { - case Texture_RGBA: - bpp = 4; - d3dformat = DXGI_FORMAT_R8G8B8A8_UNORM; - break; - case Texture_Depth: - bpp = 0; - d3dformat = DXGI_FORMAT_D32_FLOAT; - break; - default: - return NULL; - } - - int samples = (format & Texture_SamplesMask); - if (samples < 1) - { - samples = 1; - } - - Texture* NewTex = new Texture(this, format, width, height); - NewTex->Samples = samples; - - D3D1x_(TEXTURE2D_DESC) dsDesc; - dsDesc.Width = width; - dsDesc.Height = height; - dsDesc.MipLevels = (format == (Texture_RGBA | Texture_GenMipmaps) && data) ? GetNumMipLevels(width, height) : 1; - dsDesc.ArraySize = 1; - dsDesc.Format = d3dformat; - dsDesc.SampleDesc.Count = samples; - dsDesc.SampleDesc.Quality = 0; - dsDesc.Usage = D3D1x_(USAGE_DEFAULT); - dsDesc.BindFlags = D3D1x_(BIND_SHADER_RESOURCE); - dsDesc.CPUAccessFlags = 0; - dsDesc.MiscFlags = 0; - - if (format & Texture_RenderTarget) - { - if ((format & Texture_TypeMask) == Texture_Depth) - { // We don't use depth textures, and creating them in d3d10 requires different options. - dsDesc.BindFlags = D3D1x_(BIND_DEPTH_STENCIL); - } - else - { - dsDesc.BindFlags |= D3D1x_(BIND_RENDER_TARGET); - } - } - - HRESULT hr = Device->CreateTexture2D(&dsDesc, NULL, &NewTex->Tex.GetRawRef()); - if (FAILED(hr)) - { - OVR_DEBUG_LOG_TEXT(("Failed to create 2D D3D texture.")); - NewTex->Release(); - return NULL; - } - if (dsDesc.BindFlags & D3D1x_(BIND_SHADER_RESOURCE)) - { - Device->CreateShaderResourceView(NewTex->Tex, NULL, &NewTex->TexSv.GetRawRef()); - } - - if (data) - { - Context->UpdateSubresource(NewTex->Tex, 0, NULL, data, width * bpp, width * height * bpp); - if (format == (Texture_RGBA | Texture_GenMipmaps)) - { - int srcw = width, srch = height; - int level = 0; - UByte* mipmaps = NULL; - do - { - level++; - int mipw = srcw >> 1; - if (mipw < 1) - { - mipw = 1; - } - int miph = srch >> 1; - if (miph < 1) - { - miph = 1; - } - if (mipmaps == NULL) - { - mipmaps = (UByte*)OVR_ALLOC(mipw * miph * 4); - } - FilterRgba2x2(level == 1 ? (const UByte*)data : mipmaps, srcw, srch, mipmaps); - Context->UpdateSubresource(NewTex->Tex, level, NULL, mipmaps, mipw * bpp, miph * bpp); - srcw = mipw; - srch = miph; - } - while(srcw > 1 || srch > 1); - - if (mipmaps != NULL) - { - OVR_FREE(mipmaps); - } - } - } - - if (format & Texture_RenderTarget) - { - if ((format & Texture_TypeMask) == Texture_Depth) - { - Device->CreateDepthStencilView(NewTex->Tex, NULL, &NewTex->TexDsv.GetRawRef()); - } - else - { - Device->CreateRenderTargetView(NewTex->Tex, NULL, &NewTex->TexRtv.GetRawRef()); - } - } - - return NewTex; -} - - -// Rendering - -void RenderDevice::BeginRendering() -{ - Context->RSSetState(Rasterizer); -} - -void RenderDevice::SetRenderTarget(RenderTiny::Texture* colorTex, - RenderTiny::Texture* depth, RenderTiny::Texture* stencil) -{ - OVR_UNUSED(stencil); - - CurRenderTarget = (Texture*)colorTex; - if (colorTex == NULL) - { - Texture* newDepthBuffer = GetDepthBuffer(WindowWidth, WindowHeight, Params.Multisample); - if (newDepthBuffer == NULL) - { - OVR_DEBUG_LOG(("New depth buffer creation failed.")); - } - if (newDepthBuffer != NULL) - { - CurDepthBuffer = GetDepthBuffer(WindowWidth, WindowHeight, Params.Multisample); - Context->OMSetRenderTargets(1, &BackBufferRT.GetRawRef(), CurDepthBuffer->TexDsv); - } - return; - } - if (depth == NULL) - { - depth = GetDepthBuffer(colorTex->GetWidth(), colorTex->GetHeight(), CurRenderTarget->Samples); - } - - ID3D1xShaderResourceView* sv[8] = {0, 0, 0, 0, 0, 0, 0, 0}; - if (MaxTextureSet[Shader_Fragment]) - { - Context->PSSetShaderResources(0, MaxTextureSet[Shader_Fragment], sv); - } - memset(MaxTextureSet, 0, sizeof(MaxTextureSet)); - - CurDepthBuffer = (Texture*)depth; - Context->OMSetRenderTargets(1, &((Texture*)colorTex)->TexRtv.GetRawRef(), ((Texture*)depth)->TexDsv); -} - - -void RenderDevice::SetWorldUniforms(const Matrix4f& proj) -{ - StdUniforms.Proj = proj.Transposed(); - // Shader constant buffers cannot be partially updated. -} - - -void RenderDevice::Render(const Matrix4f& matrix, Model* model) -{ - // Store data in buffers if not already - if (!model->VertexBuffer) - { - Ptr<Buffer> vb = *CreateBuffer(); - vb->Data(Buffer_Vertex, &model->Vertices[0], model->Vertices.GetSize() * sizeof(Vertex)); - model->VertexBuffer = vb; - } - if (!model->IndexBuffer) - { - Ptr<Buffer> ib = *CreateBuffer(); - ib->Data(Buffer_Index, &model->Indices[0], model->Indices.GetSize() * 2); - model->IndexBuffer = ib; - } - - Render(model->Fill ? model->Fill : DefaultFill, - model->VertexBuffer, model->IndexBuffer, - matrix, 0, (unsigned)model->Indices.GetSize(), model->GetPrimType()); -} - -void RenderDevice::Render(const ShaderFill* fill, RenderTiny::Buffer* vertices, RenderTiny::Buffer* indices, - const Matrix4f& matrix, int offset, int count, PrimitiveType rprim) -{ - Context->IASetInputLayout(ModelVertexIL); - if (indices) - { - Context->IASetIndexBuffer(((Buffer*)indices)->GetBuffer(), DXGI_FORMAT_R16_UINT, 0); - } - - ID3D1xBuffer* vertexBuffer = ((Buffer*)vertices)->GetBuffer(); - UINT vertexStride = sizeof(Vertex); - UINT vertexOffset = offset; - Context->IASetVertexBuffers(0, 1, &vertexBuffer, &vertexStride, &vertexOffset); - - ShaderSet* shaders = ((ShaderFill*)fill)->GetShaders(); - - ShaderBase* vshader = ((ShaderBase*)shaders->GetShader(Shader_Vertex)); - unsigned char* vertexData = vshader->UniformData; - if (vertexData) - { - StandardUniformData* stdUniforms = (StandardUniformData*) vertexData; - stdUniforms->View = matrix.Transposed(); - stdUniforms->Proj = StdUniforms.Proj; - UniformBuffers[Shader_Vertex]->Data(Buffer_Uniform, vertexData, vshader->UniformsSize); - vshader->SetUniformBuffer(UniformBuffers[Shader_Vertex]); - } - - for(int i = Shader_Vertex + 1; i < Shader_Count; i++) - if (shaders->GetShader(i)) - { - ((ShaderBase*)shaders->GetShader(i))->UpdateBuffer(UniformBuffers[i]); - ((ShaderBase*)shaders->GetShader(i))->SetUniformBuffer(UniformBuffers[i]); - } - - D3D1x_(PRIMITIVE_TOPOLOGY) prim; - switch(rprim) - { - case Prim_Triangles: - prim = D3D1x_(PRIMITIVE_TOPOLOGY_TRIANGLELIST); - break; - case Prim_Lines: - prim = D3D1x_(PRIMITIVE_TOPOLOGY_LINELIST); - break; - case Prim_TriangleStrip: - prim = D3D1x_(PRIMITIVE_TOPOLOGY_TRIANGLESTRIP); - break; - default: - assert(0); - return; - } - Context->IASetPrimitiveTopology(prim); - - fill->Set(rprim); - - if (indices) - { - Context->DrawIndexed(count, 0, 0); - } - else - { - Context->Draw(count, 0); - } -} - - -void RenderDevice::Present() -{ - SwapChain->Present(0, 0); -} - -void RenderDevice::ForceFlushGPU() -{ - D3D1x_QUERY_DESC queryDesc = { D3D1x_(QUERY_EVENT), 0 }; - Ptr<ID3D1xQuery> query; - BOOL done = FALSE; - - if (Device->CreateQuery(&queryDesc, &query.GetRawRef()) == S_OK) - { - // Begin() not used for EVENT query. - query->End(); - // GetData will returns S_OK for both done == TRUE or FALSE. - // Exit on failure to avoid infinite loop. - do { } - while(!done && !FAILED(query->GetData(&done, sizeof(BOOL), 0))); - } -} - -}}} - diff --git a/Samples/OculusRoomTiny/RenderTiny_D3D1X_Device.h b/Samples/OculusRoomTiny/RenderTiny_D3D1X_Device.h deleted file mode 100644 index 1438611..0000000 --- a/Samples/OculusRoomTiny/RenderTiny_D3D1X_Device.h +++ /dev/null @@ -1,273 +0,0 @@ -/************************************************************************************ - -Filename : RenderTiny_D3D1X_Device.h -Content : RenderDevice implementation header for D3DX10. -Created : September 10, 2012 -Authors : Andrew Reisse - -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. -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 INC_RenderTiny_D3D1X_Device_h -#define INC_RenderTiny_D3D1X_Device_h - -#include "Kernel/OVR_String.h" -#include "Kernel/OVR_Array.h" - -#include "RenderTiny_Device.h" -#include <Windows.h> - -#define _OVR_RENDERER_D3D10 -#include <d3d10.h> - -namespace OVR { namespace RenderTiny { namespace D3D10 { - -class RenderDevice; -class Buffer; - -typedef ID3D10Device ID3D1xDevice; -typedef ID3D10Device ID3D1xDeviceContext; -typedef ID3D10RenderTargetView ID3D1xRenderTargetView; -typedef ID3D10Texture2D ID3D1xTexture2D; -typedef ID3D10ShaderResourceView ID3D1xShaderResourceView; -typedef ID3D10DepthStencilView ID3D1xDepthStencilView; -typedef ID3D10DepthStencilState ID3D1xDepthStencilState; -typedef ID3D10InputLayout ID3D1xInputLayout; -typedef ID3D10Buffer ID3D1xBuffer; -typedef ID3D10VertexShader ID3D1xVertexShader; -typedef ID3D10PixelShader ID3D1xPixelShader; -typedef ID3D10GeometryShader ID3D1xGeometryShader; -typedef ID3D10BlendState ID3D1xBlendState; -typedef ID3D10RasterizerState ID3D1xRasterizerState; -typedef ID3D10SamplerState ID3D1xSamplerState; -typedef ID3D10Query ID3D1xQuery; -typedef ID3D10Blob ID3D1xBlob; -typedef D3D10_VIEWPORT D3D1x_VIEWPORT; -typedef D3D10_QUERY_DESC D3D1x_QUERY_DESC; -#define D3D1x_(x) D3D10_##x -#define ID3D1x(x) ID3D10##x - - - -class ShaderBase : public RenderTiny::Shader -{ -public: - RenderDevice* Ren; - unsigned char* UniformData; - int UniformsSize; - - struct Uniform - { - String Name; - int Offset, Size; - }; - Array<Uniform> UniformInfo; - - ShaderBase(RenderDevice* r, ShaderStage stage); - ~ShaderBase(); - - void InitUniforms(ID3D10Blob* s); - bool SetUniform(const char* name, int n, const float* v); - - void UpdateBuffer(Buffer* b); -}; - -template<RenderTiny::ShaderStage SStage, class D3DShaderType> -class Shader : public ShaderBase -{ -public: - D3DShaderType* D3DShader; - - Shader(RenderDevice* r, D3DShaderType* s) : ShaderBase(r, SStage), D3DShader(s) {} - Shader(RenderDevice* r, ID3D1xBlob* s) : ShaderBase(r, SStage) - { - Load(s); - InitUniforms(s); - } - ~Shader() - { - if (D3DShader) - D3DShader->Release(); - } - bool Load(ID3D1xBlob* shader) - { - return Load(shader->GetBufferPointer(), shader->GetBufferSize()); - } - - // These functions have specializations. - bool Load(void* shader, size_t size); - void Set(PrimitiveType prim) const; - void SetUniformBuffer(RenderTiny::Buffer* buffers, int i = 0); -}; - -typedef Shader<RenderTiny::Shader_Vertex, ID3D1xVertexShader> VertexShader; -typedef Shader<RenderTiny::Shader_Fragment, ID3D1xPixelShader> PixelShader; - - -class Buffer : public RenderTiny::Buffer -{ -public: - RenderDevice* Ren; - Ptr<ID3D1xBuffer> D3DBuffer; - size_t Size; - int Use; - bool Dynamic; - -public: - Buffer(RenderDevice* r) : Ren(r), Size(0), Use(0) {} - ~Buffer(); - - ID3D1xBuffer* GetBuffer() - { - return D3DBuffer; - } - - virtual size_t GetSize() - { - return Size; - } - virtual void* Map(size_t start, size_t size, int flags = 0); - virtual bool Unmap(void *m); - virtual bool Data(int use, const void* buffer, size_t size); -}; - -class Texture : public RenderTiny::Texture -{ -public: - RenderDevice* Ren; - Ptr<ID3D1xTexture2D> Tex; - Ptr<ID3D1xShaderResourceView> TexSv; - Ptr<ID3D1xRenderTargetView> TexRtv; - Ptr<ID3D1xDepthStencilView> TexDsv; - mutable Ptr<ID3D1xSamplerState> Sampler; - int Width, Height; - int Samples; - - Texture(RenderDevice* r, int fmt, int w, int h); - ~Texture(); - - virtual int GetWidth() const - { - return Width; - } - virtual int GetHeight() const - { - return Height; - } - virtual int GetSamples() const - { - return Samples; - } - - virtual void SetSampleMode(int sm); - - virtual void Set(int slot, RenderTiny::ShaderStage stage = RenderTiny::Shader_Fragment) const; -}; - -class RenderDevice : public RenderTiny::RenderDevice -{ -public: - Ptr<IDXGIFactory> DXGIFactory; - HWND Window; - - Ptr<ID3D1xDevice> Device; - Ptr<ID3D1xDeviceContext> Context; - Ptr<IDXGISwapChain> SwapChain; - Ptr<IDXGIAdapter> Adapter; - Ptr<IDXGIOutput> FullscreenOutput; - int FSDesktopX, FSDesktopY; - - Ptr<ID3D1xTexture2D> BackBuffer; - Ptr<ID3D1xRenderTargetView> BackBufferRT; - Ptr<Texture> CurRenderTarget; - Ptr<Texture> CurDepthBuffer; - Ptr<ID3D1xRasterizerState> Rasterizer; - Ptr<ID3D1xBlendState> BlendState; - D3D1x_VIEWPORT D3DViewport; - - Ptr<ID3D1xDepthStencilState> DepthStates[1 + 2 * Compare_Count]; - Ptr<ID3D1xDepthStencilState> CurDepthState; - Ptr<ID3D1xInputLayout> ModelVertexIL; - - Ptr<ID3D1xSamplerState> SamplerStates[Sample_Count]; - - struct StandardUniformData - { - Matrix4f Proj; - Matrix4f View; - } StdUniforms; - Ptr<Buffer> UniformBuffers[Shader_Count]; - int MaxTextureSet[Shader_Count]; - - Ptr<VertexShader> VertexShaders[VShader_Count]; - Ptr<PixelShader> PixelShaders[FShader_Count]; - Ptr<Buffer> CommonUniforms[8]; - Ptr<ShaderFill> DefaultFill; - - Ptr<Buffer> QuadVertexBuffer; - - Array<Ptr<Texture> > DepthBuffers; - -public: - RenderDevice(const RendererParams& p, HWND window); - ~RenderDevice(); - - // Implement static initializer function to create this class. - static RenderTiny::RenderDevice* CreateDevice(const RendererParams& rp, void* oswnd); - - void UpdateMonitorOutputs(); - - virtual void SetRealViewport(const Viewport& vp); - virtual bool SetParams(const RendererParams& newParams); - - virtual void Present(); - virtual void ForceFlushGPU(); - - virtual bool SetFullscreen(DisplayMode fullscreen); - - virtual void Clear(float r = 0, float g = 0, float b = 0, float a = 1, float depth = 1); - - virtual Buffer* CreateBuffer(); - virtual Texture* CreateTexture(int format, int width, int height, const void* data, int mipcount=1); - - Texture* GetDepthBuffer(int w, int h, int ms); - - virtual void BeginRendering(); - virtual void SetRenderTarget(RenderTiny::Texture* color, - RenderTiny::Texture* depth = NULL, RenderTiny::Texture* stencil = NULL); - virtual void SetDepthMode(bool enable, bool write, CompareFunc func = Compare_Less); - virtual void SetWorldUniforms(const Matrix4f& proj); - virtual void SetCommonUniformBuffer(int i, RenderTiny::Buffer* buffer); - - virtual void Render(const Matrix4f& matrix, Model* model); - virtual void Render(const ShaderFill* fill, RenderTiny::Buffer* vertices, RenderTiny::Buffer* indices, - const Matrix4f& matrix, int offset, int count, PrimitiveType prim = Prim_Triangles); - - virtual ShaderFill *CreateSimpleFill() { return DefaultFill; } - - virtual RenderTiny::Shader *LoadBuiltinShader(ShaderStage stage, int shader); - - bool RecreateSwapChain(); - virtual ID3D10Blob* CompileShader(const char* profile, const char* src, const char* mainName = "main"); - - ID3D1xSamplerState* GetSamplerState(int sm); - - void SetTexture(RenderTiny::ShaderStage stage, int slot, const Texture* t); -}; - -}}} // Render::D3D10 - -#endif diff --git a/Samples/OculusRoomTiny/RenderTiny_Device.h b/Samples/OculusRoomTiny/RenderTiny_Device.h index 878450d..9b8af03 100644 --- a/Samples/OculusRoomTiny/RenderTiny_Device.h +++ b/Samples/OculusRoomTiny/RenderTiny_Device.h @@ -39,7 +39,6 @@ using namespace OVR::Util::Render; class RenderDevice; - //----------------------------------------------------------------------------------- // Rendering primitive type used to render Model. @@ -71,7 +70,7 @@ enum BuiltinShaders FShader_Solid = 0, FShader_Gouraud = 1, - FShader_Texture = 2, + FShader_Texture = 2, FShader_PostProcess = 3, FShader_PostProcessWithChromAb = 4, FShader_LitGouraud = 5, @@ -152,7 +151,7 @@ public: virtual void Set(PrimitiveType) const { } virtual void SetUniformBuffer(class Buffer* buffers, int i = 0) { OVR_UNUSED2(buffers, i); } - + protected: virtual bool SetUniform(const char* name, int n, const float* v) { OVR_UNUSED3(name, n, v); return false; } }; @@ -188,7 +187,7 @@ public: // Set a uniform (other than the standard matrices). It is undefined whether the // uniforms from one shader occupy the same space as those in other shaders - // (unless a buffer is used, then each buffer is independent). + // (unless a buffer is used, then each buffer is independent). virtual bool SetUniform(const char* name, int n, const float* v) { bool result = 0; @@ -239,11 +238,11 @@ class ShaderFill : public RefCountBase<ShaderFill> public: ShaderFill(ShaderSet* sh) : Shaders(sh) { } - ShaderFill(ShaderSet& sh) : Shaders(sh) { } + ShaderFill(ShaderSet& sh) : Shaders(sh) { } ShaderSet* GetShaders() { return Shaders; } - virtual void Set(PrimitiveType prim = Prim_Unknown) const; + virtual void Set(PrimitiveType prim = Prim_Unknown) const; virtual void SetTexture(int i, class Texture* tex) { if (i < 8) Textures[i] = tex; } }; @@ -252,7 +251,7 @@ public: // is recommended. Some renderers cannot have high-performance buffers which are readable, // so reading in Map should not be relied on. // -// Constraints on buffers, such as ReadOnly, are not enforced by the API but may result in +// Constraints on buffers, such as ReadOnly, are not enforced by the API but may result in // rendering-system dependent undesirable behavior, such as terrible performance or unreported failure. // // Use of a buffer inconsistent with usage is also not checked by the API, but it may result in bad @@ -293,7 +292,7 @@ public: // Node is a base class for geometry in a Scene, it contains base position // and orientation data. // Model and Container both derive from it. -// +// class Node : public RefCountBase<Node> { Vector3f Pos; @@ -327,10 +326,10 @@ public: void SetMatrix(const Matrix4f& m) { MatCurrent = true; - Mat = m; + Mat = m; } - const Matrix4f& GetMatrix() const + const Matrix4f& GetMatrix() const { if (!MatCurrent) { @@ -351,17 +350,17 @@ struct Vertex { Vector3f Pos; Color C; - float U, V; + float U, V; Vector3f Norm; - Vertex (const Vector3f& p, const Color& c = Color(64,0,0,255), + Vertex (const Vector3f& p, const Color& c = Color(64,0,0,255), float u = 0, float v = 0, Vector3f n = Vector3f(1,0,0)) : Pos(p), C(c), U(u), V(v), Norm(n) {} Vertex(float x, float y, float z, const Color& c = Color(64,0,0,255), float u = 0, float v = 0) : Pos(x,y,z), C(c), U(u), V(v) { } - + bool operator==(const Vertex& b) const { return Pos == b.Pos && C == b.C && U == b.U && V == b.V; @@ -375,14 +374,14 @@ struct LightingParams Vector4f Ambient; Vector4f LightPos[8]; Vector4f LightColor[8]; - float LightCount; + float LightCount; int Version; LightingParams() : LightCount(0), Version(0) {} void Update(const Matrix4f& view, const Vector4f* SceneLightPos) - { + { Version++; for (int i = 0; i < LightCount; i++) { @@ -403,7 +402,7 @@ struct LightingParams //----------------------------------------------------------------------------------- // Model is a triangular mesh with a fill that can be added to scene. -// +// class Model : public Node { public: @@ -411,7 +410,7 @@ public: Array<UInt16> Indices; PrimitiveType Type; Ptr<ShaderFill> Fill; - bool Visible; + bool Visible; // Some renderers will create these if they didn't exist before rendering. // Currently they are not updated, so vertex data should not be changed after rendering. @@ -430,7 +429,7 @@ public: // Node implementation. virtual NodeType GetType() const { return Node_Model; } virtual void Render(const Matrix4f& ltw, RenderDevice* ren); - + // Returns the index next added vertex will have. UInt16 GetNextVertexIndex() const @@ -468,17 +467,17 @@ public: Container() { } ~Container() { } - + virtual NodeType GetType() const { return Node_Container; } virtual void Render(const Matrix4f& ltw, RenderDevice* ren); - void Add(Node *n) { Nodes.PushBack(n); } - void Clear() { Nodes.Clear(); } + void Add(Node *n) { Nodes.PushBack(n); } + void Clear() { Nodes.Clear(); } }; -// Scene combines a collection of model +// Scene combines a collection of model class Scene { public: @@ -493,7 +492,7 @@ public: { Lighting.Ambient = color; } - + void AddLight(Vector3f pos, Vector4f color) { int n = (int)Lighting.LightCount; @@ -527,7 +526,7 @@ enum DisplayMode Display_Window = 0, Display_Fullscreen = 1 }; - + // Rendering parameters used by RenderDevice::CreateDevice. struct RendererParams @@ -541,7 +540,7 @@ struct RendererParams long DisplayId; RendererParams(int ms = 1) : Multisample(ms), Fullscreen(0) {} - + bool IsDisplaySet() const { return MonitorName.GetLength() || DisplayId; @@ -556,9 +555,9 @@ struct RendererParams // Rendering device abstraction. // Provides platform-independent part of implementation, with platform-specific // part being in a separate derived class/file, such as D3D10::RenderDevice. -// +// class RenderDevice : public RefCountBase<RenderDevice> -{ +{ protected: int WindowWidth, WindowHeight; RendererParams Params; @@ -575,7 +574,7 @@ protected: Ptr<ShaderSet> pPostProcessShader; Ptr<Buffer> pFullScreenVertexBuffer; float SceneRenderScale; - DistortionConfig Distortion; + DistortionConfig Distortion; // For lighting on platforms with uniform buffers Ptr<Buffer> LightingBuffer; @@ -595,16 +594,17 @@ public: // This static function is implemented in each derived class // to support a specific renderer type. - //static RenderDevice* CreateDevice(const RendererParams& rp, void* oswnd); + static RenderDevice* CreateDevice(const RendererParams& rp, void * oswnd); virtual void Init() {} virtual void Shutdown() {} virtual bool SetParams(const RendererParams&) { return 0; } + virtual void SetWindowSize(int w, int h) { WindowWidth = w; WindowHeight = h; } const RendererParams& GetParams() const { return Params; } - + // StereoParams apply Viewport, Projection and Distortion simultaneously, // doing full configuration for one eye. void ApplyStereoParams(const StereoEyeParams& params) @@ -627,12 +627,12 @@ public: if (eye == StereoEye_Right) Distortion.XCenterOffset = -Distortion.XCenterOffset; } - + // Set viewport ignoring any adjustments used for the stereo mode. - virtual void SetRealViewport(const Viewport& vp) = 0; + virtual void SetRealViewport(const Viewport& vp) = 0; + + virtual void Clear(float r = 0, float g = 0, float b = 0, float a = 1, float depth = 1) = 0; - virtual void Clear(float r = 0, float g = 0, float b = 0, float a = 1, float depth = 1) = 0; - virtual bool IsFullscreen() const { return Params.Fullscreen != Display_Window; } virtual void Present() = 0; // Waits for rendering to complete; important for reducing latency. @@ -642,7 +642,7 @@ public: virtual Buffer* CreateBuffer() { return NULL; } virtual Texture* CreateTexture(int format, int width, int height, const void* data, int mipcount=1) { OVR_UNUSED5(format,width,height,data, mipcount); return NULL; } - + virtual ShaderSet* CreateShaderSet() { return new ShaderSet; } virtual Shader* LoadBuiltinShader(ShaderStage stage, int shader) = 0; @@ -670,7 +670,7 @@ public: // The index 0 is reserved for non-buffer uniforms, and so cannot be used with this function. virtual void SetCommonUniformBuffer(int i, Buffer* buffer) { OVR_UNUSED2(i, buffer); } - + virtual Matrix4f GetProjection() const { return Proj; } // This is a View matrix only, it will be combined with the projection matrix from SetProjection @@ -682,10 +682,10 @@ public: virtual ShaderFill *CreateSimpleFill() = 0; ShaderFill * CreateTextureFill(Texture* tex); - + // Don't call these directly, use App/Platform instead - virtual bool SetFullscreen(DisplayMode fullscreen) { OVR_UNUSED(fullscreen); return false; } - + virtual bool SetFullscreen(DisplayMode fullscreen) { OVR_UNUSED(fullscreen); return false; } + enum PostProcessShader { @@ -707,7 +707,7 @@ public: protected: // Stereo & post-processing virtual bool initPostProcessSupport(PostProcessType pptype); - + private: PostProcessShader PostProcessShaderRequested; PostProcessShader PostProcessShaderActive; diff --git a/Samples/OculusRoomTiny/RenderTiny_GL_Device.cpp b/Samples/OculusRoomTiny/RenderTiny_GL_Device.cpp index 07460c3..a6a8902 100644 --- a/Samples/OculusRoomTiny/RenderTiny_GL_Device.cpp +++ b/Samples/OculusRoomTiny/RenderTiny_GL_Device.cpp @@ -229,10 +229,9 @@ static const char* FShaderSrcs[FShader_Count] = LitTextureFragShaderSrc }; - - -RenderDevice::RenderDevice(const RendererParams& p) +RenderDevice::RenderDevice(const RendererParams& p, GLFWwindow* oswnd) : window(oswnd) { + for (int i = 0; i < VShader_Count; i++) VertexShaders[i] = *new Shader(this, Shader_Vertex, VShaderSrcs[i]); @@ -484,7 +483,7 @@ void* Buffer::Map(size_t start, size_t size, int flags) int mode = GL_WRITE_ONLY; //if (flags & Map_Unsynchronized) // mode |= GL_MAP_UNSYNCHRONIZED; - + glBindBuffer(Use, GLBuffer); void* v = glMapBuffer(Use, mode); glBindBuffer(Use, 0); @@ -723,10 +722,10 @@ Texture* RenderDevice::CreateTexture(int format, int width, int height, const vo Texture* NewTex = new Texture(this, width, height); glBindTexture(GL_TEXTURE_2D, NewTex->TexId); glGetError(); - + glTexImage2D(GL_TEXTURE_2D, 0, glformat, width, height, 0, glformat, gltype, data); OVR_ASSERT(!glGetError()); - + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); @@ -781,4 +780,57 @@ RBuffer::~RBuffer() glDeleteRenderbuffersEXT(1, &BufId); } -}}} +void RenderDevice::Present() { + glfwSwapBuffers(window); +} + +} // Namespace GL + +// Implement static initializer function to create this class. +RenderTiny::RenderDevice* RenderDevice::CreateDevice(const RendererParams& rp, void * oswnd) +{ + int attr[16]; + int nattr = 2; + GLFWwindow *window = (GLFWwindow *)oswnd; + glfwMakeContextCurrent(window); + glfwSwapInterval(1); + return new GL::RenderDevice(rp, window); +} + +} // Namespace RenderTiny +} // Namespace OVR + +// +// +//Render::RenderDevice* RenderDevice::CreateDevice(const RendererParams& rp, void* oswnd) +//{ +// +// 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; +// } +//} diff --git a/Samples/OculusRoomTiny/RenderTiny_GL_Device.h b/Samples/OculusRoomTiny/RenderTiny_GL_Device.h index 5d88180..6c7a390 100644 --- a/Samples/OculusRoomTiny/RenderTiny_GL_Device.h +++ b/Samples/OculusRoomTiny/RenderTiny_GL_Device.h @@ -26,18 +26,8 @@ limitations under the License. #include "RenderTiny_Device.h" -#if defined(OVR_OS_WIN32) -#include <Windows.h> -#endif - -#if defined(OVR_OS_MAC) -#include <OpenGL/gl.h> -#include <OpenGL/glext.h> -#else -#define GL_GLEXT_PROTOTYPES -#include <GL/gl.h> -#include <GL/glext.h> -#endif +#include "GL/glew.h" +#include "GLFW/glfw3.h" namespace OVR { namespace RenderTiny { namespace GL { @@ -154,7 +144,7 @@ public: // Set a uniform (other than the standard matrices). It is undefined whether the // uniforms from one shader occupy the same space as those in other shaders - // (unless a buffer is used, then each buffer is independent). + // (unless a buffer is used, then each buffer is independent). virtual bool SetUniform(const char* name, int n, const float* v); virtual bool SetUniform4x4f(const char* name, const Matrix4f& m); @@ -185,10 +175,15 @@ class RenderDevice : public RenderTiny::RenderDevice GLuint CurrentFbo; const LightingParams* Lighting; - + GLFWwindow* window; + public: - RenderDevice(const RendererParams& p); + RenderDevice(const RendererParams& p, GLFWwindow * oswnd); + virtual void Present(); + + // Implement static initializer function to create this class. + static RenderTiny::RenderDevice* CreateDevice(const RendererParams& rp, void* oswnd); virtual void SetRealViewport(const Viewport& vp); diff --git a/Samples/OculusRoomTiny/Win32_OculusRoomTiny.h b/Samples/OculusRoomTiny/Win32_OculusRoomTiny.h deleted file mode 100644 index a86dd47..0000000 --- a/Samples/OculusRoomTiny/Win32_OculusRoomTiny.h +++ /dev/null @@ -1,189 +0,0 @@ -/************************************************************************************ - -Filename : OculusRoomTiny.h -Content : Simplest possible first-person view test application for Oculus Rift -Created : March 10, 2012 -Authors : Michael Antonov, Andrew Reisse - -Copyright : Copyright 2012 Oculus, 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 INC_OculusRoomTiny_h -#define INC_OculusRoomTiny_h - -#include <Windows.h> -#include <xinput.h> - -#include "OVR.h" -#include "Util/Util_Render_Stereo.h" -#include "../../LibOVR/Src/Kernel/OVR_Timer.h" -#include "RenderTiny_D3D1X_Device.h" - -using namespace OVR; -using namespace OVR::RenderTiny; - - -//------------------------------------------------------------------------------------- -// ***** OculusRoomTiny Description - -// This app renders a simple flat-shaded room allowing the user to move along the -// floor and look around with an HMD, mouse, keyboard and gamepad. -// By default, the application will start full-screen on Oculus Rift. -// -// The following keys work: -// -// 'W', 'S', 'A', 'D' - Move forward, back; strafe left/right. -// F1 - No stereo, no distortion. -// F2 - Stereo, no distortion. -// F3 - Stereo and distortion. -// - -// The world RHS coordinate system is defines as follows (as seen in perspective view): -// Y - Up -// Z - Back -// X - Right -const Vector3f UpVector(0.0f, 1.0f, 0.0f); -const Vector3f ForwardVector(0.0f, 0.0f, -1.0f); -const Vector3f RightVector(1.0f, 0.0f, 0.0f); - -// We start out looking in the positive Z (180 degree rotation). -const float YawInitial = 3.141592f; -const float Sensitivity = 1.0f; -const float MoveSpeed = 3.0f; // m/s - - -//------------------------------------------------------------------------------------- -// ***** OculusRoomTiny Application class - -// An instance of this class is created on application startup (main/WinMain). -// -// It then works as follows: -// -// OnStartup - Window, graphics and HMD setup is done here. -// This function will initialize OVR::DeviceManager and HMD, -// creating SensorDevice and attaching it to SensorFusion. -// This needs to be done before obtaining sensor data. -// -// OnIdle - Does per-frame processing, processing SensorFusion and -// movement input and rendering the frame. - -class OculusRoomTinyApp : public MessageHandler -{ -public: - OculusRoomTinyApp(HINSTANCE hinst); - ~OculusRoomTinyApp(); - - // Initializes graphics, Rift input and creates world model. - virtual int OnStartup(const char* args); - // Called per frame to sample SensorFucion and render the world. - virtual void OnIdle(); - - // Installed for Oculus device messages. Optional. - virtual void OnMessage(const Message& msg); - - // Handle input events for movement. - virtual void OnGamepad(float padLx, float padLY, float padRx, float padRy); - virtual void OnMouseMove(int x, int y, int modifiers); - virtual void OnKey(unsigned vk, bool down); - - // Render the view for one eye. - void Render(const StereoEyeParams& stereo); - - // Main application loop. - int Run(); - - // Return amount of time passed since application started in seconds. - double GetAppTime() const - { - return (OVR::Timer::GetTicks() - StartupTicks) * (1.0 / (double)OVR::Timer::MksPerSecond); - } - - -protected: - - // Win32 window setup interface. - LRESULT windowProc(UINT msg, WPARAM wp, LPARAM lp); - bool setupWindow(); - void destroyWindow(); - // Win32 static function that delegates to WindowProc member function. - static LRESULT CALLBACK systemWindowProc(HWND window, UINT msg, WPARAM wp, LPARAM lp); - - void giveUsFocus(bool setFocus); - - static OculusRoomTinyApp* pApp; - - // *** Rendering Variables - Ptr<RenderDevice> pRender; - RendererParams RenderParams; - int Width, Height; - - - // *** Win32 System Variables - HWND hWnd; - HINSTANCE hInstance; - POINT WindowCenter; // In desktop coordinates - bool Quit; - bool MouseCaptured; - - // Dynamically ink to XInput to simplify projects. - typedef DWORD (WINAPI *PFn_XInputGetState)(DWORD dwUserIndex, XINPUT_STATE* pState); - PFn_XInputGetState pXInputGetState; - HMODULE hXInputModule; - UInt32 LastPadPacketNo; - - - // *** Oculus HMD Variables - - Ptr<DeviceManager> pManager; - Ptr<SensorDevice> pSensor; - Ptr<HMDDevice> pHMD; - SensorFusion SFusion; - OVR::HMDInfo HMDInfo; - - // Last update seconds, used for move speed timing. - double LastUpdate; - UInt64 StartupTicks; - - // Position and look. The following apply: - Vector3f EyePos; - float EyeYaw; // Rotation around Y, CCW positive when looking at RHS (X,Z) plane. - float EyePitch; // Pitch. If sensor is plugged in, only read from sensor. - float EyeRoll; // Roll, only accessible from Sensor. - float LastSensorYaw; // Stores previous Yaw value from to support computing delta. - - // Movement state; different bits may be set based on the state of keys. - UByte MoveForward; - UByte MoveBack; - UByte MoveLeft; - UByte MoveRight; - Vector3f GamepadMove, GamepadRotate; - - Matrix4f View; - RenderTiny::Scene Scene; - - // Stereo view parameters. - StereoConfig SConfig; - PostProcessType PostProcess; - - // Shift accelerates movement/adjustment velocity. - bool ShiftDown; - bool ControlDown; -}; - -// Adds sample models and lights to the argument scene. -void PopulateRoomScene(Scene* scene, RenderDevice* render); - - -#endif |