PolyCocoaCore.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296
  1. /*
  2. * PolyCocoaCore.cpp
  3. * Poly
  4. *
  5. * Created by Ivan Safrin on 2/16/10.
  6. * Copyright 2010 Ivan Safrin. All rights reserved.
  7. *
  8. */
  9. #include "PolyCocoaCore.h"
  10. #include <iostream>
  11. using namespace Polycode;
  12. long getThreadID() {
  13. return (long)pthread_self();
  14. }
  15. CocoaCore::CocoaCore(SubstanceView *view, int xRes, int yRes, bool fullScreen,int aaLevel, int frameRate) : Core(xRes, yRes, fullScreen,aaLevel, frameRate) {
  16. eventMutex = createMutex();
  17. NSOpenGLPixelFormatAttribute attrs[] =
  18. {
  19. NSOpenGLPFADoubleBuffer,
  20. NSOpenGLPFADepthSize, 24,
  21. 0
  22. };
  23. [view lockContext];
  24. [view setCore:this];
  25. NSOpenGLPixelFormat *format = [[NSOpenGLPixelFormat alloc] initWithAttributes:attrs];
  26. context = [[NSOpenGLContext alloc] initWithFormat: format shareContext:nil];
  27. [view clearGLContext];
  28. [view setOpenGLContext:context];
  29. [context setView: view];
  30. glView = view;
  31. initTime = mach_absolute_time();
  32. while(![view isContextReady]) {
  33. }
  34. renderer = new OpenGLRenderer();
  35. services->setRenderer(renderer);
  36. [view unlockContext];
  37. setVideoMode(xRes,yRes,fullScreen,aaLevel);
  38. }
  39. void CocoaCore::copyStringToClipboard(wstring str) {
  40. NSPasteboard *pb = [NSPasteboard generalPasteboard];
  41. NSArray *types = [NSArray arrayWithObjects:NSStringPboardType, nil];
  42. [pb declareTypes:types owner:glView];
  43. //NSString *nsstr = [NSString stringWithCharacters: (unichar*) str.c_str() length: str.length()];
  44. char* data = (char*)str.data();
  45. unsigned size = str.size() * sizeof(wchar_t);
  46. NSString* nsstr = [[[NSString alloc] initWithBytes:data length:size encoding:NSUTF32LittleEndianStringEncoding] autorelease];
  47. [pb setString: nsstr forType:NSStringPboardType];
  48. }
  49. wstring CocoaCore::getClipboardString() {
  50. }
  51. void CocoaCore::setVideoMode(int xRes, int yRes, bool fullScreen, int aaLevel) {
  52. this->xRes = xRes;
  53. this->yRes = yRes;
  54. this->fullScreen = fullScreen;
  55. this->aaLevel = aaLevel;
  56. renderer->Resize(xRes, yRes);
  57. // CoreServices::getInstance()->getMaterialManager()->reloadProgramsAndTextures();
  58. dispatchEvent(new Event(), EVENT_CORE_RESIZE);
  59. NSRect visibleFrame = [[NSScreen mainScreen] visibleFrame];
  60. NSRect frame = NSMakeRect([[glView window] frame].origin.x, [[glView window] frame].origin.y, xRes, yRes);
  61. // frame.origin.x = (visibleFrame.size.width - frame.size.width) * 0.5;
  62. // frame.origin.y = (visibleFrame.size.height - frame.size.height) * (9.0/10.0);
  63. [[glView window] setFrame: frame display: YES animate: NO];
  64. }
  65. void CocoaCore::resizeTo(int xRes, int yRes) {
  66. this->xRes = xRes;
  67. this->yRes = yRes;
  68. renderer->Resize(xRes, yRes);
  69. dispatchEvent(new Event(), EVENT_CORE_RESIZE);
  70. }
  71. vector<Polycode::Rectangle> CocoaCore::getVideoModes() {
  72. vector<Polycode::Rectangle> retVector;
  73. return retVector;
  74. }
  75. CocoaCore::~CocoaCore() {
  76. [glView clearGLContext];
  77. [context release];
  78. }
  79. void *ManagedThreadFunc(void *data) {
  80. Threaded *target = static_cast<Threaded*>(data);
  81. target->runThread();
  82. return NULL;
  83. }
  84. void CocoaCore::createThread(Threaded *target) {
  85. pthread_t thread;
  86. pthread_create( &thread, NULL, ManagedThreadFunc, (void*)target);
  87. }
  88. void CocoaCore::lockMutex(CoreMutex *mutex) {
  89. PosixMutex *m = (PosixMutex*) mutex;
  90. pthread_mutex_lock(&m->pMutex);
  91. }
  92. void CocoaCore::unlockMutex(CoreMutex *mutex) {
  93. PosixMutex *m = (PosixMutex*) mutex;
  94. pthread_mutex_unlock(&m->pMutex);
  95. }
  96. CoreMutex *CocoaCore::createMutex() {
  97. PosixMutex *mutex = new PosixMutex();
  98. pthread_mutex_init(&mutex->pMutex, NULL);
  99. return mutex;
  100. }
  101. unsigned int CocoaCore::getTicks() {
  102. uint64_t time = mach_absolute_time();
  103. double conversion = 0.0;
  104. mach_timebase_info_data_t info;
  105. mach_timebase_info( &info );
  106. conversion = 1e-9 * (double) info.numer / (double) info.denom;
  107. return (((double)(time - initTime)) * conversion) * 1000.0f;
  108. }
  109. void CocoaCore::enableMouse(bool newval) {
  110. Core::enableMouse(newval);
  111. }
  112. void CocoaCore::setCursor(int cursorType) {
  113. NSCursor *newCursor;
  114. switch(cursorType) {
  115. case CURSOR_TEXT:
  116. newCursor = [NSCursor IBeamCursor];
  117. break;
  118. case CURSOR_POINTER:
  119. newCursor = [NSCursor pointingHandCursor];
  120. break;
  121. case CURSOR_CROSSHAIR:
  122. newCursor = [NSCursor crosshairCursor];
  123. break;
  124. case CURSOR_RESIZE_LEFT_RIGHT:
  125. newCursor = [NSCursor resizeLeftRightCursor];
  126. break;
  127. case CURSOR_RESIZE_UP_DOWN:
  128. newCursor = [NSCursor resizeUpDownCursor];
  129. break;
  130. default:
  131. newCursor = [NSCursor arrowCursor];
  132. break;
  133. }
  134. [glView setCurrentCursor:newCursor];
  135. [glView resetCursorRects];
  136. [[glView window] invalidateCursorRectsForView: glView];
  137. }
  138. void CocoaCore::checkEvents() {
  139. lockMutex(eventMutex);
  140. CocoaEvent event;
  141. for(int i=0; i < cocoaEvents.size(); i++) {
  142. event = cocoaEvents[i];
  143. switch(event.eventGroup) {
  144. case CocoaEvent::INPUT_EVENT:
  145. switch(event.eventCode) {
  146. case InputEvent::EVENT_MOUSEMOVE:
  147. input->setDeltaPosition(lastMouseX - event.mouseX, lastMouseY - event.mouseY);
  148. lastMouseX = event.mouseX;
  149. lastMouseY = event.mouseY;
  150. input->setMousePosition(event.mouseX, event.mouseY, getTicks());
  151. break;
  152. case InputEvent::EVENT_MOUSEDOWN:
  153. input->setMouseButtonState(event.mouseButton, true, getTicks());
  154. break;
  155. case InputEvent::EVENT_MOUSEWHEEL_UP:
  156. input->mouseWheelUp(getTicks());
  157. break;
  158. case InputEvent::EVENT_MOUSEWHEEL_DOWN:
  159. input->mouseWheelDown(getTicks());
  160. break;
  161. case InputEvent::EVENT_MOUSEUP:
  162. input->setMouseButtonState(event.mouseButton, false, getTicks());
  163. break;
  164. case InputEvent::EVENT_KEYDOWN:
  165. input->setKeyState(event.keyCode, event.unicodeChar, true, getTicks());
  166. break;
  167. case InputEvent::EVENT_KEYUP:
  168. input->setKeyState(event.keyCode, event.unicodeChar, false, getTicks());
  169. break;
  170. }
  171. break;
  172. }
  173. }
  174. cocoaEvents.clear();
  175. unlockMutex(eventMutex);
  176. }
  177. void CocoaCore::createFolder(string folderPath) {
  178. [[NSFileManager defaultManager] createDirectoryAtPath:[NSString stringWithUTF8String: folderPath.c_str()] withIntermediateDirectories:YES attributes:nil error:nil];
  179. }
  180. void CocoaCore::copyDiskItem(string itemPath, string destItemPath) {
  181. [[NSFileManager defaultManager] copyItemAtPath: [NSString stringWithUTF8String: itemPath.c_str()] toPath: [NSString stringWithUTF8String: destItemPath.c_str()] error: nil];
  182. }
  183. void CocoaCore::moveDiskItem(string itemPath, string destItemPath) {
  184. [[NSFileManager defaultManager] moveItemAtPath: [NSString stringWithUTF8String: itemPath.c_str()] toPath: [NSString stringWithUTF8String: destItemPath.c_str()] error: nil];
  185. }
  186. void CocoaCore::removeDiskItem(string itemPath) {
  187. [[NSFileManager defaultManager] removeItemAtPath: [NSString stringWithUTF8String: itemPath.c_str()] error:nil];
  188. }
  189. string CocoaCore::openFolderPicker() {
  190. NSOpenPanel *attachmentPanel = [NSOpenPanel openPanel];
  191. [attachmentPanel setCanChooseFiles:NO];
  192. [attachmentPanel setCanCreateDirectories: YES];
  193. [attachmentPanel setCanChooseDirectories:YES];
  194. if ( [attachmentPanel runModalForDirectory:nil file:nil] == NSOKButton )
  195. {
  196. // files and directories selected.
  197. NSArray* files = [attachmentPanel filenames];
  198. NSString* fileName = [files objectAtIndex:0];
  199. return [fileName UTF8String];
  200. } else {
  201. return [@"" UTF8String];
  202. }
  203. }
  204. vector<string> CocoaCore::openFilePicker(vector<CoreFileExtension> extensions, bool allowMultiple) {
  205. vector<string> retVector;
  206. NSOpenPanel *attachmentPanel = [NSOpenPanel openPanel];
  207. [attachmentPanel setCanChooseFiles:YES];
  208. [attachmentPanel setCanCreateDirectories: YES];
  209. [attachmentPanel setCanChooseDirectories:NO];
  210. [attachmentPanel setAllowsMultipleSelection: allowMultiple];
  211. NSMutableArray *types = [[NSMutableArray alloc] init];
  212. for(int i=0; i < extensions.size(); i++) {
  213. CoreFileExtension extInfo = extensions[i];
  214. [types addObject: [NSString stringWithUTF8String: extInfo.extension.c_str()]];
  215. }
  216. if ( [attachmentPanel runModalForDirectory:nil file:nil types:types] == NSOKButton )
  217. {
  218. NSArray* files = [attachmentPanel filenames];
  219. NSString* fileName = [files objectAtIndex:0];
  220. retVector.push_back([fileName UTF8String]);
  221. } else {
  222. retVector.push_back("");
  223. }
  224. return retVector;
  225. }
  226. bool CocoaCore::Update() {
  227. if(!running)
  228. return false;
  229. lockMutex(CoreServices::getRenderMutex());
  230. checkEvents();
  231. renderer->BeginRender();
  232. updateCore();
  233. renderer->EndRender();
  234. [context flushBuffer];
  235. unlockMutex(CoreServices::getRenderMutex());
  236. doSleep();
  237. return running;
  238. }