OpenSource.cpp 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. #include <kapusha/core/Log.h>
  2. #include <kapusha/math/types.h>
  3. #include <kapusha/render/Render.h>
  4. #include <kapusha/io/StreamFile.h>
  5. #include "Materializer.h"
  6. #include "BSP.h"
  7. #include "OpenSource.h"
  8. OpenSource::OpenSource(
  9. const char *path,
  10. const char *file,
  11. int depth)
  12. : resources_(path)
  13. , depth_(depth)
  14. , camera_(kapusha::vec3f(0,10,0), kapusha::vec3f(0), kapusha::vec3f(0,0,1), 60.f, 1.7, 10.f, 100000.f)
  15. , forward_speed_(0), right_speed_(0), pitch_speed_(0), yaw_speed_(0)
  16. , selection_(0)
  17. , show_selection_(false)
  18. , mouselook_(false)
  19. {
  20. maps_to_load_.push_back(file);
  21. }
  22. OpenSource::~OpenSource(void)
  23. {
  24. }
  25. void OpenSource::init(kapusha::IViewportController* viewctrl)
  26. {
  27. viewctrl_ = viewctrl;
  28. render_ = new kapusha::Render;
  29. Materializer materializer(resources_);
  30. while (depth_ > 0 && !maps_to_load_.empty())
  31. {
  32. //L("maps to load left %d %d", maps_to_load_.size(), depth_);
  33. std::string map = maps_to_load_.front();
  34. maps_to_load_.pop_front();
  35. L("Loading map %s", map.c_str());
  36. kapusha::StreamSeekable *stream = resources_.open(map.c_str(), ResRes::ResourceMap);
  37. if (!stream)
  38. {
  39. L("cannot load map %s", map.c_str());
  40. continue;
  41. }
  42. BSP *bsp = new BSP;
  43. KP_ENSURE(bsp->load(stream, &materializer));
  44. delete stream;
  45. //! \hack inject c1a0c link to previous map
  46. BSP::MapLink hacklink;
  47. if (map == "c1a0c")
  48. {
  49. hacklink = bsp->getMapLinks();
  50. hacklink.maps["c1a0b"] = "c1a0btoc";
  51. hacklink.landmarks["c1a0btoc"] = kapusha::vec3f(2052.f, 864.f, 566.f);
  52. }
  53. const BSP::MapLink& link = hacklink.landmarks.empty() ? bsp->getMapLinks() : hacklink;
  54. {
  55. bool link_found = false;
  56. for(auto ref = link.maps.begin(); ref != link.maps.end(); ++ref)
  57. {
  58. auto refmark = link.landmarks.find(ref->second);
  59. KP_ASSERT(refmark != link.landmarks.end());
  60. L("\t links to %s via landmark \"%s\" (%f, %f, %f)",
  61. ref->first.c_str(), refmark->first.c_str(),
  62. refmark->second.x, refmark->second.y, refmark->second.z);
  63. auto found = levels_.find(ref->first);
  64. if (found != levels_.end())
  65. {
  66. if (!link_found)
  67. {
  68. auto landmark = found->second->getMapLinks().landmarks.find(ref->second);
  69. KP_ASSERT(landmark != found->second->getMapLinks().landmarks.end());
  70. bsp->setParent(found->second, landmark->second - refmark->second);
  71. /*L("%s (%f, %f, %f) links to %s (%f, %f, %f)",
  72. map.c_str(), minemark->second.x, minemark->second.y, minemark->second.z,
  73. ref->first.c_str(), landmark->second.x, landmark->second.y, landmark->second.z);*/
  74. link_found = true;
  75. }
  76. } else {
  77. if (map != ref->first &&
  78. std::find(maps_to_load_.begin(),
  79. maps_to_load_.end(), ref->first) == maps_to_load_.end())
  80. {
  81. if (enabled_maps_.empty() || enabled_maps_.count(ref->first))
  82. maps_to_load_.push_back(ref->first);
  83. }
  84. }
  85. }
  86. if (!link_found && !levels_.empty())
  87. L("WARNING! %s doesn't link to any existing map! This map will begin from (0, 0, 0)", map.c_str());
  88. }
  89. levels_[map] = bsp;
  90. levelsv_.push_back(bsp);
  91. depth_--;
  92. }
  93. {
  94. materializer.print();
  95. }
  96. {
  97. L("List of all loaded maps:");
  98. int i = 0;
  99. for (auto it = levels_.begin(); it != levels_.end(); ++it, ++i)
  100. L("%d: %s (%f, %f, %f)", i, it->first.c_str(),
  101. it->second->translation().x, it->second->translation().y, it->second->translation().z);
  102. }
  103. render_->cullFace().on();
  104. render_->depthTest().on();
  105. glFrontFace(GL_CW);
  106. }
  107. void OpenSource::resize(kapusha::vec2i s)
  108. {
  109. glViewport(0, 0, s.x, s.y);
  110. viewport_ = kapusha::rect2f(0, (float)s.x, (float)s.y, 0);
  111. camera_.setAspect((float)s.x / (float)s.y);
  112. }
  113. void OpenSource::draw(int ms, float dt)
  114. {
  115. const float speed = 1000.f *
  116. (viewctrl_->keyState().isShiftPressed() ? 5.f : 1);
  117. camera_.moveForward(forward_speed_ * dt * speed);
  118. camera_.moveRigth(right_speed_ * dt * speed);
  119. camera_.update();
  120. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  121. for (auto it = levelsv_.begin(); it != levelsv_.end(); ++it)
  122. (*it)->draw(camera_);
  123. if (show_selection_)
  124. levelsv_[selection_]->drawContours(camera_);
  125. if (forward_speed_ != 0 || right_speed_ != 0)
  126. viewctrl_->requestRedraw();
  127. }
  128. void OpenSource::inputKey(const kapusha::KeyState &keys)
  129. {
  130. using kapusha::KeyState;
  131. switch (keys.getLastKey()) {
  132. case KeyState::KeyW:
  133. forward_speed_ += keys.isLastKeyPressed() ? 1.f : -1.f;
  134. break;
  135. case KeyState::KeyS:
  136. forward_speed_ += keys.isLastKeyPressed() ? -1.f : 1.f;
  137. break;
  138. case KeyState::KeyA:
  139. right_speed_ += keys.isLastKeyPressed() ? -1.f : 1.f;
  140. break;
  141. case KeyState::KeyD:
  142. right_speed_ += keys.isLastKeyPressed() ? 1.f : -1.f;
  143. break;
  144. case KeyState::KeyZ:
  145. if (keys.isLastKeyPressed()) show_selection_ = !show_selection_;
  146. break;
  147. case KeyState::KeyE:
  148. {
  149. if (!keys.isLastKeyPressed()) break;
  150. ++selection_;
  151. selection_ %= levelsv_.size();
  152. }
  153. break;
  154. case KeyState::KeyQ:
  155. {
  156. if (!keys.isLastKeyPressed()) break;
  157. --selection_;
  158. if (selection_ < 0) selection_ += levelsv_.size();
  159. }
  160. break;
  161. case KeyState::KeyY:
  162. if (keys.isLastKeyPressed()) {
  163. levelsv_[selection_]->updateShift(levelsv_[selection_]->shift() - kapusha::vec3f(1.f,0,0)*(keys.isShiftPressed()?100.f:1));
  164. L("(%f, %f, %f)", levelsv_[selection_]->shift().x, levelsv_[selection_]->shift().y, levelsv_[selection_]->shift().z);
  165. for (auto it = levelsv_.begin(); it != levelsv_.end(); ++it)
  166. (*it)->updateShift((*it)->shift());
  167. }
  168. break;
  169. case 'U':
  170. if (keys.isLastKeyPressed()) {
  171. levelsv_[selection_]->updateShift(levelsv_[selection_]->shift() + kapusha::vec3f(1.f,0,0)*(keys.isShiftPressed()?100.f:1));
  172. L("(%f, %f, %f)", levelsv_[selection_]->shift().x, levelsv_[selection_]->shift().y, levelsv_[selection_]->shift().z);
  173. for (auto it = levelsv_.begin(); it != levelsv_.end(); ++it)
  174. (*it)->updateShift((*it)->shift());
  175. }
  176. break;
  177. case 'H':
  178. if (keys.isLastKeyPressed()) {
  179. levelsv_[selection_]->updateShift(levelsv_[selection_]->shift() - kapusha::vec3f(0,1.f,0)*(keys.isShiftPressed()?100.f:1));
  180. L("(%f, %f, %f)", levelsv_[selection_]->shift().x, levelsv_[selection_]->shift().y, levelsv_[selection_]->shift().z);
  181. for (auto it = levelsv_.begin(); it != levelsv_.end(); ++it)
  182. (*it)->updateShift((*it)->shift());
  183. }
  184. break;
  185. case 'J':
  186. if (keys.isLastKeyPressed()) {
  187. levelsv_[selection_]->updateShift(levelsv_[selection_]->shift() + kapusha::vec3f(0,1.f,0)*(keys.isShiftPressed()?100.f:1));
  188. L("(%f, %f, %f)", levelsv_[selection_]->shift().x, levelsv_[selection_]->shift().y, levelsv_[selection_]->shift().z);
  189. for (auto it = levelsv_.begin(); it != levelsv_.end(); ++it)
  190. (*it)->updateShift((*it)->shift());
  191. }
  192. break;
  193. case 'N':
  194. if (keys.isLastKeyPressed()) {
  195. levelsv_[selection_]->updateShift(levelsv_[selection_]->shift() - kapusha::vec3f(0,0,1.f)*(keys.isShiftPressed()?100.f:1));
  196. L("(%f, %f, %f)", levelsv_[selection_]->shift().x, levelsv_[selection_]->shift().y, levelsv_[selection_]->shift().z);
  197. for (auto it = levelsv_.begin(); it != levelsv_.end(); ++it)
  198. (*it)->updateShift((*it)->shift());
  199. }
  200. break;
  201. case 'm':
  202. if (keys.isLastKeyPressed()) {
  203. levelsv_[selection_]->updateShift(levelsv_[selection_]->shift() + kapusha::vec3f(0,0,1.f)*(keys.isShiftPressed()?100.f:1));
  204. L("(%f, %f, %f)", levelsv_[selection_]->shift().x, levelsv_[selection_]->shift().y, levelsv_[selection_]->shift().z);
  205. for (auto it = levelsv_.begin(); it != levelsv_.end(); ++it)
  206. (*it)->updateShift((*it)->shift());
  207. }
  208. break;
  209. case KeyState::KeyUp:
  210. pitch_speed_ += keys.isLastKeyPressed() ? 1.f : -1.f;
  211. break;
  212. case KeyState::KeyDown:
  213. pitch_speed_ += keys.isLastKeyPressed() ? -1.f : 1.f;
  214. break;
  215. case KeyState::KeyLeft:
  216. yaw_speed_ += keys.isLastKeyPressed() ? 1.f : -1.f;
  217. break;
  218. case KeyState::KeyRight:
  219. yaw_speed_ += keys.isLastKeyPressed() ? -1.f : 1.f;
  220. break;
  221. case KeyState::KeyEsc:
  222. if (keys.isLastKeyPressed())
  223. {
  224. if (mouselook_)
  225. {
  226. viewctrl_->limitlessPointer(false);
  227. viewctrl_->hideCursor(false);
  228. mouselook_ = false;
  229. } else
  230. viewctrl_->quit(0);
  231. }
  232. break;
  233. default:
  234. return;
  235. }
  236. viewctrl_->requestRedraw();
  237. }
  238. void OpenSource::inputPointer(const kapusha::PointerState &pointers)
  239. {
  240. if (mouselook_)
  241. {
  242. camera_.rotatePitch(pointers.main().movement.y);
  243. camera_.rotateAxis(kapusha::vec3f(0.f, 0.f, 1.f), -pointers.main().movement.x);
  244. viewctrl_->requestRedraw();
  245. } else if (pointers.wasPressed())
  246. {
  247. viewctrl_->limitlessPointer(true);
  248. viewctrl_->hideCursor(true);
  249. mouselook_ = true;
  250. }
  251. }