1
0
mirror of https://github.com/XProger/OpenLara.git synced 2025-08-10 23:24:06 +02:00

#15 osx cocoa PR preparation

This commit is contained in:
XProger
2019-01-10 08:42:06 +03:00
2 changed files with 29 additions and 227 deletions

View File

@@ -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 = "<group>"; };
99713CAE204CA3DA00006FAC /* animation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = animation.h; path = ../../animation.h; sourceTree = "<group>"; };
99713CAF204CA3DA00006FAC /* cache.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cache.h; path = ../../cache.h; sourceTree = "<group>"; };
@@ -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;

View File

@@ -1,220 +0,0 @@
#include <pthread.h>
#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;
}