diff --git a/src/platform/osx/OpenLara.xcodeproj/project.pbxproj b/src/platform/osx/OpenLara.xcodeproj/project.pbxproj index 5ecd506..5d9c158 100644 --- a/src/platform/osx/OpenLara.xcodeproj/project.pbxproj +++ b/src/platform/osx/OpenLara.xcodeproj/project.pbxproj @@ -8,16 +8,18 @@ /* Begin PBXBuildFile section */ 99713CC9204CAD9900006FAC /* tinflate.c in Sources */ = {isa = PBXBuildFile; fileRef = 99713CC8204CAD9900006FAC /* tinflate.c */; }; - 99BFB6A21DCA7F5300E2E997 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 99BFB6A11DCA7F5300E2E997 /* main.cpp */; }; + 523F97E41DDF7AA5006FE2FC /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 523F97E31DDF7AA5006FE2FC /* Cocoa.framework */; }; + 523F97E61DDF926E006FE2FC /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 523F97E51DDF926E006FE2FC /* QuartzCore.framework */; }; + 99BFB6A21DCA7F5300E2E997 /* main.mm in Sources */ = {isa = PBXBuildFile; fileRef = 99BFB6A11DCA7F5300E2E997 /* main.mm */; }; 99BFB6A91DCA87BF00E2E997 /* stb_vorbis.c in Sources */ = {isa = PBXBuildFile; fileRef = 99BFB6A81DCA87BF00E2E997 /* stb_vorbis.c */; }; 99BFB6AB1DCA87C500E2E997 /* minimp3.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 99BFB6AA1DCA87C500E2E997 /* minimp3.cpp */; }; - 99C4C0B71796AB730032DE85 /* AGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 99C4C0951796A9730032DE85 /* AGL.framework */; }; - 99C4C0B91796AB7B0032DE85 /* Carbon.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 99C4C0B81796AB7B0032DE85 /* Carbon.framework */; }; 99C4C0BA1796AB810032DE85 /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 99C4C0931796A96F0032DE85 /* OpenGL.framework */; }; 99DF7BC41DCBA30B00C40D0A /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 99DF7BC31DCBA30B00C40D0A /* AudioToolbox.framework */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 523F97E31DDF7AA5006FE2FC /* Cocoa.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Cocoa.framework; path = System/Library/Frameworks/Cocoa.framework; sourceTree = SDKROOT; }; + 523F97E51DDF926E006FE2FC /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; }; 995C97EF1E91A857003825B2 /* shaders */ = {isa = PBXFileReference; lastKnownFileType = folder; name = shaders; path = ../../shaders; sourceTree = ""; }; 99713CAE204CA3DA00006FAC /* animation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = animation.h; path = ../../animation.h; sourceTree = ""; }; 99713CAF204CA3DA00006FAC /* cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cache.h; path = ../../cache.h; sourceTree = ""; }; @@ -64,10 +66,10 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 523F97E61DDF926E006FE2FC /* QuartzCore.framework in Frameworks */, + 523F97E41DDF7AA5006FE2FC /* Cocoa.framework in Frameworks */, 99DF7BC41DCBA30B00C40D0A /* AudioToolbox.framework in Frameworks */, 99C4C0BA1796AB810032DE85 /* OpenGL.framework in Frameworks */, - 99C4C0B91796AB7B0032DE85 /* Carbon.framework in Frameworks */, - 99C4C0B71796AB730032DE85 /* AGL.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -107,7 +109,25 @@ 99BFB6AA1DCA87C500E2E997 /* minimp3.cpp */, 99BFB6A81DCA87BF00E2E997 /* stb_vorbis.c */, 99713CC8204CAD9900006FAC /* tinflate.c */, - 99BFB6A11DCA7F5300E2E997 /* main.cpp */, + 99BFB69E1DCA7F1700E2E997 /* libs */, + 99BFB6A11DCA7F5300E2E997 /* main.mm */, + 99BFB68D1DCA7F1700E2E997 /* lara.h */, + 99BFB68E1DCA7F1700E2E997 /* format.h */, + 99BFB68F1DCA7F1700E2E997 /* level.h */, + 99BFB6901DCA7F1700E2E997 /* mesh.h */, + 99BFB6911DCA7F1700E2E997 /* debug.h */, + 99BFB6921DCA7F1700E2E997 /* controller.h */, + 99BFB6931DCA7F1700E2E997 /* utils.h */, + 99BFB6941DCA7F1700E2E997 /* sound.h */, + 99BFB6951DCA7F1700E2E997 /* camera.h */, + 99BFB6961DCA7F1700E2E997 /* core.h */, + 99BFB6971DCA7F1700E2E997 /* trigger.h */, + 99BFB6981DCA7F1700E2E997 /* shader.h */, + 99BFB6991DCA7F1700E2E997 /* shader.glsl */, + 99BFB69A1DCA7F1700E2E997 /* input.h */, + 99BFB69B1DCA7F1700E2E997 /* enemy.h */, + 99BFB69C1DCA7F1700E2E997 /* game.h */, + 99BFB69D1DCA7F1700E2E997 /* texture.h */, 99C4C0A31796AACF0032DE85 /* Supporting Files */, 99C4C0821796A8230032DE85 /* Frameworks */, 99C4C0811796A8230032DE85 /* Products */, @@ -125,6 +145,8 @@ 99C4C0821796A8230032DE85 /* Frameworks */ = { isa = PBXGroup; children = ( + 523F97E51DDF926E006FE2FC /* QuartzCore.framework */, + 523F97E31DDF7AA5006FE2FC /* Cocoa.framework */, 99DF7BC31DCBA30B00C40D0A /* AudioToolbox.framework */, 99DF7BC11DCBA2D100C40D0A /* CoreAudioKit.framework */, 99DF7BBF1DCBA2BF00C40D0A /* CoreAudio.framework */, @@ -207,7 +229,7 @@ files = ( 99713CC9204CAD9900006FAC /* tinflate.c in Sources */, 99BFB6AB1DCA87C500E2E997 /* minimp3.cpp in Sources */, - 99BFB6A21DCA7F5300E2E997 /* main.cpp in Sources */, + 99BFB6A21DCA7F5300E2E997 /* main.mm in Sources */, 99BFB6A91DCA87BF00E2E997 /* stb_vorbis.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/src/platform/osx/main.cpp b/src/platform/osx/main.cpp deleted file mode 100644 index 8ff8564..0000000 --- a/src/platform/osx/main.cpp +++ /dev/null @@ -1,220 +0,0 @@ -#include -#include "game.h" - -WindowRef window; -AGLContext context; - -// sound -#define SND_SIZE 8192 - -static AudioQueueRef audioQueue; - -void soundFill(void* inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer) { - void* frames = inBuffer->mAudioData; - UInt32 count = inBuffer->mAudioDataBytesCapacity / 4; - Sound::fill((Sound::Frame*)frames, count); - inBuffer->mAudioDataByteSize = count * 4; - AudioQueueEnqueueBuffer(audioQueue, inBuffer, 0, NULL); -} - -void soundInit() { - AudioStreamBasicDescription deviceFormat; - deviceFormat.mSampleRate = 44100; - deviceFormat.mFormatID = kAudioFormatLinearPCM; - deviceFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger; - deviceFormat.mBytesPerPacket = 4; - deviceFormat.mFramesPerPacket = 1; - deviceFormat.mBytesPerFrame = 4; - deviceFormat.mChannelsPerFrame = 2; - deviceFormat.mBitsPerChannel = 16; - deviceFormat.mReserved = 0; - - AudioQueueNewOutput(&deviceFormat, soundFill, NULL, NULL, NULL, 0, &audioQueue); - - for (int i = 0; i < 2; i++) { - AudioQueueBufferRef mBuffer; - AudioQueueAllocateBuffer(audioQueue, SND_SIZE, &mBuffer); - soundFill(NULL, audioQueue, mBuffer); - } - AudioQueueStart(audioQueue, NULL); -} - -// common input functions -InputKey keyToInputKey(int code) { - static const int codes[] = { - 0x7B, 0x7C, 0x7E, 0x7D, 0x31, 0x30, 0x24, 0x35, 0x38, 0x3B, 0x3A, - 0x1D, 0x12, 0x13, 0x14, 0x15, 0x17, 0x16, 0x1A, 0x1C, 0x19, // 0..9 - 0x00, 0x0B, 0x08, 0x02, 0x0E, 0x03, 0x05, 0x04, 0x22, 0x26, 0x28, 0x25, 0x2E, // A..M - 0x2D, 0x1F, 0x23, 0x0C, 0x0F, 0x01, 0x11, 0x20, 0x09, 0x0D, 0x07, 0x10, 0x06, // N..Z - }; - - for (int i = 0; i < sizeof(codes) / sizeof(codes[0]); i++) - if (codes[i] == code) - return (InputKey)(ikLeft + i); - return ikNone; -} - -InputKey mouseToInputKey(int btn) { - switch (btn) { - case 1 : return ikMouseL; - case 2 : return ikMouseR; - case 3 : return ikMouseM; - } - return ikNone; -} - -bool osJoyReady(int index) { - return false; -} - -void osJoyVibrate(int index, float L, float R) { - // TODO -} - -OSStatus eventHandler(EventHandlerCallRef handler, EventRef event, void* userData) { - OSType eventClass = GetEventClass(event); - UInt32 eventKind = GetEventKind(event); - - switch (eventClass) { - case kEventClassWindow : - switch (eventKind) { - case kEventWindowClosed : - Core::quit(); - break; - case kEventWindowBoundsChanged : { - aglUpdateContext(context); - Rect rect; - GetWindowPortBounds(window, &rect); - Core::width = rect.right - rect.left; - Core::height = rect.bottom - rect.top; - break; - } - } - break; - - case kEventClassMouse : { - EventMouseButton mouseButton; - CGPoint mousePos; - Rect wndRect; - - GetEventParameter(event, kEventParamMouseLocation, typeHIPoint, NULL, sizeof(mousePos), NULL, &mousePos); - GetEventParameter(event, kEventParamMouseButton, typeMouseButton, NULL, sizeof(mouseButton), nil, &mouseButton); - - GetWindowBounds(window, kWindowContentRgn, &wndRect); - mousePos.x -= wndRect.left; - mousePos.y -= wndRect.top; - vec2 pos(mousePos.x, mousePos.y); - - switch (eventKind) { - case kEventMouseDown : - case kEventMouseUp : { - InputKey key = mouseToInputKey(mouseButton); - Input::setPos(key, pos); - Input::setDown(key, eventKind == kEventMouseDown); - break; - } - case kEventMouseDragged : - Input::setPos(ikMouseL, pos); - break; - } - break; - } - - case kEventClassKeyboard : { - switch (eventKind) { - case kEventRawKeyDown : - case kEventRawKeyUp : { - uint32 keyCode; - if (GetEventParameter(event, kEventParamKeyCode, typeUInt32, NULL, sizeof(keyCode), NULL, &keyCode) == noErr) - Input::setDown(keyToInputKey(keyCode), eventKind != kEventRawKeyUp); - break; - } - case kEventRawKeyModifiersChanged : { - uint32 modifiers; - if (GetEventParameter(event, kEventParamKeyModifiers, typeUInt32, NULL, sizeof(modifiers), NULL, &modifiers) == noErr) { - Input::setDown(ikShift, modifiers & shiftKey); - Input::setDown(ikCtrl, modifiers & controlKey); - Input::setDown(ikAlt, modifiers & optionKey); - } - break; - } - } - break; - } - } - - return CallNextEventHandler(handler, event); -} - -// timing -int osGetTime() { - UInt64 t; - Microseconds((UnsignedWide*)&t); - return int(t / 1000); -} - -int main() { - cacheDir[0] = saveDir[0] = contentDir[0] = 0; - - // get path to game content - CFBundleRef bundle = CFBundleGetMainBundle(); - CFURLRef bundleURL = CFBundleCopyBundleURL(bundle); - CFStringRef pathStr = CFURLCopyFileSystemPath(bundleURL, kCFURLPOSIXPathStyle); - CFStringGetFileSystemRepresentation(pathStr, contentDir, 230); - strcat(contentDir, "/Contents/Resources/"); - -// init window - Rect rect = {0, 0, 720, 1280}; - CreateNewWindow(kDocumentWindowClass, kWindowCloseBoxAttribute | kWindowCollapseBoxAttribute | kWindowFullZoomAttribute | kWindowResizableAttribute | kWindowStandardHandlerAttribute, &rect, &window); - SetWTitle(window, "\pOpenLara"); - - // init OpenGL context - GLint attribs[] = { - AGL_RGBA, - AGL_DOUBLEBUFFER, - AGL_BUFFER_SIZE, 32, - AGL_DEPTH_SIZE, 24, - AGL_STENCIL_SIZE, 8, - AGL_NONE - }; - AGLPixelFormat format = aglChoosePixelFormat(NULL, 0, (GLint*)&attribs); - context = aglCreateContext(format, NULL); - aglDestroyPixelFormat(format); - - aglSetDrawable(context, GetWindowPort(window)); - aglSetCurrentContext(context); - - soundInit(); - Game::init(); - - // show window - const int events[][2] = { - { kEventClassWindow, kEventWindowClosed }, - { kEventClassWindow, kEventWindowBoundsChanged }, - { kEventClassKeyboard, kEventRawKeyDown }, - { kEventClassKeyboard, kEventRawKeyUp }, - { kEventClassKeyboard, kEventRawKeyModifiersChanged }, - { kEventClassMouse, kEventMouseDown }, - { kEventClassMouse, kEventMouseUp }, - { kEventClassMouse, kEventMouseDragged }, - }; - - InstallEventHandler(GetApplicationEventTarget(), (EventHandlerUPP)eventHandler, sizeof(events) / sizeof(events[0]), (EventTypeSpec*)&events, NULL, NULL); - SelectWindow(window); - ShowWindow(window); - - EventRecord event; - while (!Core::isQuit) - if (!GetNextEvent(0xffff, &event) && Game::update()) { - Game::render(); - aglSwapBuffers(context); - } - - Game::deinit(); - // TODO: sndFree - - aglSetCurrentContext(NULL); - ReleaseWindow(window); - - return 0; -}