PolySDLCore.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. /*
  2. * PolySDLCore.cpp
  3. * Poly
  4. *
  5. * Created by Ivan Safrin on 3/12/08.
  6. * Copyright 2008 __MyCompanyName__. All rights reserved.
  7. *
  8. */
  9. /*
  10. #include "PolySDLCore.h"
  11. #ifdef COMPILE_SDL_CORE
  12. #include "SDL.h"
  13. #include <iostream>
  14. using namespace Polycode;
  15. SDLCore::SDLCore(int xRes, int yRes, bool fullScreen,int aaLevel) : Core(xRes, yRes, fullScreen,aaLevel) {
  16. putenv("SDL_VIDEO_CENTERED=1");
  17. if(SDL_Init(SDL_INIT_VIDEO) < 0) {
  18. }
  19. renderer = new OpenGLRenderer();
  20. services->setRenderer(renderer);
  21. setVideoMode(xRes, yRes, fullScreen, aaLevel);
  22. #if PLATFORM == PLATFORM_WINDOWS
  23. WSADATA WsaData;
  24. if(WSAStartup( MAKEWORD(2,2), &WsaData ) != NO_ERROR ){
  25. Logger::log("Error initializing sockets!\n");
  26. }
  27. #endif
  28. SDL_EnableUNICODE(1);
  29. // SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
  30. }
  31. void SDLCore::setVideoMode(int xRes, int yRes, bool fullScreen, int aaLevel) {
  32. SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 24);
  33. SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1);
  34. SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 8);
  35. SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 8);
  36. SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 8);
  37. SDL_GL_SetAttribute( SDL_GL_ALPHA_SIZE, 8);
  38. if(aaLevel > 0) {
  39. SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, 1);
  40. SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, aaLevel); //0, 2, 4
  41. } else {
  42. SDL_GL_SetAttribute( SDL_GL_MULTISAMPLEBUFFERS, 0);
  43. SDL_GL_SetAttribute( SDL_GL_MULTISAMPLESAMPLES, 0);
  44. }
  45. SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 0);
  46. if(fullScreen) {
  47. if( SDL_SetVideoMode(xRes, yRes, 0, SDL_OPENGL|SDL_FULLSCREEN) == NULL ) {
  48. }
  49. } else {
  50. if( SDL_SetVideoMode(xRes, yRes, 0, SDL_OPENGL) == NULL ) {
  51. }
  52. }
  53. renderer->Resize(xRes, yRes);
  54. CoreServices::getInstance()->getMaterialManager()->reloadProgramsAndTextures();
  55. }
  56. vector<Poly::Rectangle> SDLCore::getVideoModes() {
  57. vector<Poly::Rectangle> retVector;
  58. SDL_Rect **modes;
  59. modes=SDL_ListModes(NULL, SDL_FULLSCREEN);
  60. for(int i=0;modes[i];++i) {
  61. Rectangle res;
  62. res.w = modes[i]->w;
  63. res.h = modes[i]->h;
  64. retVector.push_back(res);
  65. }
  66. return retVector;
  67. }
  68. SDLCore::~SDLCore() {
  69. #if PLATFORM == PLATFORM_WINDOWS
  70. WSACleanup();
  71. #endif
  72. SDL_Quit();
  73. }
  74. int SDLThreadFunc(void *data) {
  75. Threaded *target = (Threaded*)data;
  76. target->runThread();
  77. return 1;
  78. }
  79. void SDLCore::createThread(Threaded *target) {
  80. SDL_CreateThread(SDLThreadFunc, (void*)target);
  81. }
  82. unsigned int SDLCore::getTicks() {
  83. return SDL_GetTicks();
  84. }
  85. void SDLCore::enableMouse(bool newval) {
  86. if(newval) {
  87. SDL_ShowCursor(1);
  88. SDL_WM_GrabInput(SDL_GRAB_OFF);
  89. } else {
  90. SDL_ShowCursor(0);
  91. SDL_WM_GrabInput(SDL_GRAB_ON);
  92. }
  93. Core::enableMouse(newval);
  94. }
  95. bool SDLCore::Update() {
  96. if(!running)
  97. return false;
  98. renderer->BeginRender();
  99. updateCore();
  100. renderer->EndRender();
  101. SDL_GL_SwapBuffers();
  102. SDL_Event event;
  103. while ( SDL_PollEvent(&event) ) {
  104. switch (event.type) {
  105. case SDL_QUIT:
  106. running = false;
  107. break;
  108. case SDL_JOYBUTTONDOWN:
  109. // input->setKeyState((TAUKey)(event.key.keysym.sym), true);
  110. break;
  111. case SDL_KEYDOWN:
  112. input->setKeyState((TAUKey)(event.key.keysym.sym), (char)event.key.keysym.unicode, true, getTicks());
  113. break;
  114. case SDL_KEYUP:
  115. input->setKeyState((TAUKey)(event.key.keysym.sym), (char)event.key.keysym.unicode, false, getTicks());
  116. break;
  117. case SDL_MOUSEBUTTONDOWN:
  118. if(event.button.button == SDL_BUTTON_WHEELUP) {
  119. input->mouseWheelUp(getTicks());
  120. } else if(event.button.button == SDL_BUTTON_WHEELDOWN) {
  121. input->mouseWheelDown(getTicks());
  122. } else {
  123. input->setMouseButtonState(CoreInput::MOUSE_BUTTON1, true, getTicks());
  124. }
  125. break;
  126. case SDL_MOUSEBUTTONUP:
  127. if(event.button.button == SDL_BUTTON_WHEELUP || event.button.button == SDL_BUTTON_WHEELDOWN) {
  128. } else {
  129. input->setMouseButtonState(CoreInput::MOUSE_BUTTON1, false, getTicks());
  130. }
  131. break;
  132. case SDL_MOUSEMOTION:
  133. input->setDeltaPosition(event.motion.xrel, event.motion.yrel);
  134. input->setMousePosition(event.motion.x, event.motion.y, getTicks());
  135. break;
  136. default:
  137. break;
  138. }
  139. }
  140. return running;
  141. }
  142. #endif
  143. */