💿🐜 Antkeeper source code https://antkeeper.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

653 lines
35 KiB

7 years ago
  1. /*
  2. * Copyright (C) 2017 Christopher J. Howard
  3. *
  4. * This file is part of Antkeeper Source Code.
  5. *
  6. * Antkeeper Source Code is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * Antkeeper Source Code is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with Antkeeper Source Code. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. #include "splash-state.hpp"
  20. #include "title-state.hpp"
  21. #include "experiment-state.hpp"
  22. #include "../application.hpp"
  23. #include "../camera-controller.hpp"
  24. #include "../debug.hpp"
  25. #include "../model-loader.hpp"
  26. #include <iostream>
  27. #include <cstdio>
  28. #include <SDL.h>
  29. const float blankDuration = 0.0f;
  30. const float fadeInDuration = 0.5f;
  31. const float hangDuration = 1.0f;
  32. const float fadeOutDuration = 0.5f;
  33. SplashState::SplashState(Application* application):
  34. ApplicationState(application)
  35. {}
  36. SplashState::~SplashState()
  37. {}
  38. void SplashState::enter()
  39. {
  40. std::cout << "Entering SplashState..." << std::endl;
  41. application->scene.addLayer();
  42. application->uiScene.addLayer();
  43. // Debug
  44. application->lineBatcher = new LineBatcher(4096);
  45. BillboardBatch* lineBatch = application->lineBatcher->getBatch();
  46. lineBatch->setAlignment(&application->camera, BillboardAlignmentMode::CYLINDRICAL);
  47. lineBatch->setAlignmentVector(Vector3(1, 0, 0));
  48. application->scene.getLayer(0)->addObject(lineBatch);
  49. // Load menu font
  50. application->menuFont = new Font(512, 512);
  51. FontLoader* fontLoader = new FontLoader();
  52. if (!fontLoader->load("data/fonts/Varela-Regular.ttf", application->fontSizePX, application->menuFont))
  53. {
  54. std::cerr << "Failed to load font" << std::endl;
  55. }
  56. delete fontLoader;
  57. // Load splash texture
  58. application->splashTexture.load("data/textures/splash.png");
  59. // Load title texture
  60. application->titleTexture.load("data/textures/title.png");
  61. // Get UI strings
  62. std::string pressAnyKeyString;
  63. std::string backString;
  64. std::string challengeString;
  65. std::string experimentString;
  66. std::string settingsString;
  67. std::string quitString;
  68. std::string loadString;
  69. std::string newString;
  70. std::string videoString;
  71. std::string audioString;
  72. std::string controlsString;
  73. std::string gameString;
  74. std::string resumeString;
  75. std::string returnToMainMenuString;
  76. std::string quitToDesktopString;
  77. application->strings.get("press-any-key", &pressAnyKeyString);
  78. application->strings.get("back", &backString);
  79. application->strings.get("challenge", &challengeString);
  80. application->strings.get("experiment", &experimentString);
  81. application->strings.get("settings", &settingsString);
  82. application->strings.get("quit", &quitString);
  83. application->strings.get("load", &loadString);
  84. application->strings.get("new", &newString);
  85. application->strings.get("video", &videoString);
  86. application->strings.get("audio", &audioString);
  87. application->strings.get("controls", &controlsString);
  88. application->strings.get("game", &gameString);
  89. application->strings.get("resume", &resumeString);
  90. application->strings.get("return-to-main-menu", &returnToMainMenuString);
  91. application->strings.get("quit-to-desktop", &quitToDesktopString);
  92. // Colors
  93. application->selectedColor = Vector4(1.0f, 1.0f, 1.0f, 1.0f);
  94. application->deselectedColor = Vector4(0.35f, 0.35f, 0.35f, 1.0f);
  95. // Build UI
  96. application->uiRootElement = new UIContainer();
  97. application->uiRootElement->setDimensions(Vector2(application->width, application->height));
  98. application->mouse->addMouseMotionObserver(application->uiRootElement);
  99. application->mouse->addMouseButtonObserver(application->uiRootElement);
  100. application->blackoutImage = new UIImage();
  101. application->blackoutImage->setDimensions(Vector2(application->width, application->height));
  102. application->blackoutImage->setLayerOffset(99);
  103. application->blackoutImage->setTintColor(Vector4(0.0f, 0.0f, 0.0f, 1.0f));
  104. application->blackoutImage->setVisible(false);
  105. application->uiRootElement->addChild(application->blackoutImage);
  106. application->splashImage = new UIImage();
  107. application->splashImage->setAnchor(Anchor::CENTER);
  108. application->splashImage->setDimensions(Vector2(application->splashTexture.getWidth(), application->splashTexture.getHeight()));
  109. application->splashImage->setTexture(&application->splashTexture);
  110. application->splashImage->setVisible(false);
  111. application->uiRootElement->addChild(application->splashImage);
  112. application->titleImage = new UIImage();
  113. application->titleImage->setAnchor(Vector2(0.5f, 0.0f));
  114. application->titleImage->setDimensions(Vector2(application->titleTexture.getWidth(), application->titleTexture.getHeight()));
  115. application->titleImage->setTranslation(Vector2(0.0f, (int)(application->height * (1.0f / 3.0f) - application->titleTexture.getHeight())));
  116. application->titleImage->setTexture(&application->titleTexture);
  117. application->titleImage->setVisible(false);
  118. application->uiRootElement->addChild(application->titleImage);
  119. /*
  120. application->copyrightImage = new UIImage();
  121. application->copyrightImage->setAnchor(Vector2(0.5f, 1.0f));
  122. application->copyrightImage->setDimensions(Vector2(copyrightTextureWidth, copyrightTextureHeight));
  123. application->copyrightImage->setTranslation(Vector2(-.5f, (int)(-application->height * (1.0f / 10.0f) - copyrightTextureHeight * 0.5f)));
  124. application->copyrightImage->setTexture(nullptr);
  125. application->copyrightImage->setVisible(false);
  126. application->uiRootElement->addChild(application->copyrightImage);
  127. */
  128. application->anyKeyLabel = new UILabel();
  129. application->anyKeyLabel->setAnchor(Vector2(0.5f, 1.0f));
  130. application->anyKeyLabel->setFont(application->menuFont);
  131. application->anyKeyLabel->setTranslation(Vector2(0.0f, (int)(-application->height * (1.0f / 3.0f)/* - application->menuFont->getMetrics().getHeight() * 0.5f*/)));
  132. application->anyKeyLabel->setText(pressAnyKeyString);
  133. application->anyKeyLabel->setVisible(false);
  134. application->uiRootElement->addChild(application->anyKeyLabel);
  135. application->menuSelectorLabel = new UILabel();
  136. application->menuSelectorLabel->setAnchor(Anchor::TOP_LEFT);
  137. application->menuSelectorLabel->setFont(application->menuFont);
  138. application->menuSelectorLabel->setText(">");
  139. /*
  140. application->menuSelectorLabel = new UIImage();
  141. application->menuSelectorLabel->setAnchor(Anchor::TOP_LEFT);
  142. application->menuSelectorLabel->setDimensions(Vector2(selectorTextureWidth, selectorTextureHeight));
  143. application->menuSelectorLabel->setTextureID(selectorTextureID);
  144. */
  145. application->menuSelectorLabel->setVisible(false);
  146. application->uiRootElement->addChild(application->menuSelectorLabel);
  147. application->mainMenuContainer = new UIContainer();
  148. application->mainMenuContainer->setDimensions(Vector2(application->width, application->menuFont->getMetrics().getHeight() * 4));
  149. application->mainMenuContainer->setAnchor(Vector2(0.0f, 0.5f));
  150. application->mainMenuContainer->setVisible(false);
  151. application->mainMenuContainer->setActive(false);
  152. application->uiRootElement->addChild(application->mainMenuContainer);
  153. application->challengeLabel = new UILabel();
  154. application->challengeLabel->setFont(application->menuFont);
  155. application->challengeLabel->setText(challengeString);
  156. application->challengeLabel->setTintColor(application->deselectedColor);
  157. application->experimentLabel = new UILabel();
  158. application->experimentLabel->setFont(application->menuFont);
  159. application->experimentLabel->setText(experimentString);
  160. application->experimentLabel->setTranslation(Vector2(0.0f, application->menuFont->getMetrics().getHeight()));
  161. application->experimentLabel->setTintColor(application->deselectedColor);
  162. application->settingsLabel = new UILabel();
  163. application->settingsLabel->setFont(application->menuFont);
  164. application->settingsLabel->setText(settingsString);
  165. application->settingsLabel->setTranslation(Vector2(0.0f, application->menuFont->getMetrics().getHeight() * 2));
  166. application->settingsLabel->setTintColor(application->deselectedColor);
  167. application->quitLabel = new UILabel();
  168. application->quitLabel->setFont(application->menuFont);
  169. application->quitLabel->setText(quitString);
  170. application->quitLabel->setTintColor(application->deselectedColor);
  171. application->quitLabel->setTranslation(Vector2(0.0f, application->menuFont->getMetrics().getHeight() * 3));
  172. application->mainMenuContainer->addChild(application->challengeLabel);
  173. application->mainMenuContainer->addChild(application->experimentLabel);
  174. application->mainMenuContainer->addChild(application->settingsLabel);
  175. application->mainMenuContainer->addChild(application->quitLabel);
  176. application->challengeMenuContainer = new UIContainer();
  177. application->challengeMenuContainer->setDimensions(Vector2(application->width, application->menuFont->getMetrics().getHeight() * 4));
  178. application->challengeMenuContainer->setAnchor(Vector2(0.0f, 0.5f));
  179. application->challengeMenuContainer->setVisible(false);
  180. application->challengeMenuContainer->setActive(false);
  181. application->uiRootElement->addChild(application->challengeMenuContainer);
  182. application->experimentMenuContainer = new UIContainer();
  183. application->experimentMenuContainer->setDimensions(Vector2(application->width, application->menuFont->getMetrics().getHeight() * 3));
  184. application->experimentMenuContainer->setAnchor(Vector2(0.0f, 0.5f));
  185. application->experimentMenuContainer->setVisible(false);
  186. application->experimentMenuContainer->setActive(false);
  187. application->uiRootElement->addChild(application->experimentMenuContainer);
  188. application->loadLabel = new UILabel();
  189. application->loadLabel->setFont(application->menuFont);
  190. application->loadLabel->setText(loadString);
  191. application->loadLabel->setTintColor(application->deselectedColor);
  192. application->loadLabel->setTranslation(Vector2(0.0f, application->menuFont->getMetrics().getHeight() * 0));
  193. application->experimentMenuContainer->addChild(application->loadLabel);
  194. application->newLabel = new UILabel();
  195. application->newLabel->setFont(application->menuFont);
  196. application->newLabel->setText(newString);
  197. application->newLabel->setTintColor(application->deselectedColor);
  198. application->newLabel->setTranslation(Vector2(0.0f, application->menuFont->getMetrics().getHeight() * 1));
  199. application->experimentMenuContainer->addChild(application->newLabel);
  200. application->experimentBackLabel = new UILabel();
  201. application->experimentBackLabel->setFont(application->menuFont);
  202. application->experimentBackLabel->setText(backString);
  203. application->experimentBackLabel->setTintColor(application->deselectedColor);
  204. application->experimentBackLabel->setTranslation(Vector2(0.0f, application->menuFont->getMetrics().getHeight() * 2));
  205. application->experimentMenuContainer->addChild(application->experimentBackLabel);
  206. application->settingsMenuContainer = new UIContainer();
  207. application->settingsMenuContainer->setDimensions(Vector2(application->width, application->menuFont->getMetrics().getHeight() * 5));
  208. application->settingsMenuContainer->setAnchor(Vector2(0.0f, 0.5f));
  209. application->settingsMenuContainer->setVisible(false);
  210. application->settingsMenuContainer->setActive(false);
  211. application->uiRootElement->addChild(application->settingsMenuContainer);
  212. application->videoLabel = new UILabel();
  213. application->videoLabel->setFont(application->menuFont);
  214. application->videoLabel->setText(videoString);
  215. application->videoLabel->setTintColor(application->deselectedColor);
  216. application->videoLabel->setTranslation(Vector2(0.0f, application->menuFont->getMetrics().getHeight() * 0));
  217. application->settingsMenuContainer->addChild(application->videoLabel);
  218. application->audioLabel = new UILabel();
  219. application->audioLabel->setFont(application->menuFont);
  220. application->audioLabel->setText(audioString);
  221. application->audioLabel->setTintColor(application->deselectedColor);
  222. application->audioLabel->setTranslation(Vector2(0.0f, application->menuFont->getMetrics().getHeight() * 1));
  223. application->settingsMenuContainer->addChild(application->audioLabel);
  224. application->controlsLabel = new UILabel();
  225. application->controlsLabel->setFont(application->menuFont);
  226. application->controlsLabel->setText(controlsString);
  227. application->controlsLabel->setTintColor(application->deselectedColor);
  228. application->controlsLabel->setTranslation(Vector2(0.0f, application->menuFont->getMetrics().getHeight() * 2));
  229. application->settingsMenuContainer->addChild(application->controlsLabel);
  230. application->gameLabel = new UILabel();
  231. application->gameLabel->setFont(application->menuFont);
  232. application->gameLabel->setText(gameString);
  233. application->gameLabel->setTintColor(application->deselectedColor);
  234. application->gameLabel->setTranslation(Vector2(0.0f, application->menuFont->getMetrics().getHeight() * 3));
  235. application->settingsMenuContainer->addChild(application->gameLabel);
  236. application->settingsBackLabel = new UILabel();
  237. application->settingsBackLabel->setFont(application->menuFont);
  238. application->settingsBackLabel->setText(backString);
  239. application->settingsBackLabel->setTintColor(application->deselectedColor);
  240. application->settingsBackLabel->setTranslation(Vector2(0.0f, application->menuFont->getMetrics().getHeight() * 4));
  241. application->settingsMenuContainer->addChild(application->settingsBackLabel);
  242. application->pauseMenuContainer = new UIContainer();
  243. application->pauseMenuContainer->setDimensions(Vector2(application->width, application->menuFont->getMetrics().getHeight() * 6));
  244. application->pauseMenuContainer->setAnchor(Anchor::CENTER);
  245. application->pauseMenuContainer->setVisible(false);
  246. application->pauseMenuContainer->setActive(false);
  247. application->uiRootElement->addChild(application->pauseMenuContainer);
  248. application->pausedResumeLabel = new UILabel();
  249. application->pausedResumeLabel->setFont(application->menuFont);
  250. application->pausedResumeLabel->setText(resumeString);
  251. application->pausedResumeLabel->setTintColor(application->deselectedColor);
  252. application->pausedResumeLabel->setTranslation(Vector2(0.0f, application->menuFont->getMetrics().getHeight() * 0));
  253. application->pauseMenuContainer->addChild(application->pausedResumeLabel);
  254. application->returnToMainMenuLabel = new UILabel();
  255. application->returnToMainMenuLabel->setFont(application->menuFont);
  256. application->returnToMainMenuLabel->setText(returnToMainMenuString);
  257. application->returnToMainMenuLabel->setTintColor(application->deselectedColor);
  258. application->returnToMainMenuLabel->setTranslation(Vector2(0.0f, application->menuFont->getMetrics().getHeight() * 1));
  259. application->pauseMenuContainer->addChild(application->returnToMainMenuLabel);
  260. application->quitToDesktopLabel = new UILabel();
  261. application->quitToDesktopLabel->setFont(application->menuFont);
  262. application->quitToDesktopLabel->setText(quitToDesktopString);
  263. application->quitToDesktopLabel->setTintColor(application->deselectedColor);
  264. application->quitToDesktopLabel->setTranslation(Vector2(0.0f, application->menuFont->getMetrics().getHeight() * 2));
  265. application->pauseMenuContainer->addChild(application->quitToDesktopLabel);
  266. /*
  267. UIContainer* pauseMenuContainer;
  268. UILabel* pausedResumeLabel;
  269. UILabel* pausedSaveLabel;
  270. UILabel* pausedNewLabel;
  271. UILabel* pausedSettingsLabel;
  272. UILabel* returnToMainMenuLabel;
  273. UILabel* quitToDesktopLabel;*/
  274. // Setup UI batch
  275. application->uiBatch = new BillboardBatch();
  276. application->uiBatch->resize(256);
  277. application->uiBatcher = new UIBatcher();
  278. // Setup UI render pass and compositor
  279. application->uiPass.setRenderTarget(&application->defaultRenderTarget);
  280. application->uiCompositor.addPass(&application->uiPass);
  281. application->uiCompositor.load(nullptr);
  282. // Setup UI camera
  283. application->uiCamera.lookAt(glm::vec3(0), glm::vec3(0, 0, -1), glm::vec3(0, 1, 0));
  284. application->uiCamera.setCompositor(&application->uiCompositor);
  285. application->uiCamera.setCompositeIndex(0);
  286. // Setup UI scene
  287. application->uiScene.getLayer(0)->addObject(application->uiBatch);
  288. application->uiScene.getLayer(0)->addObject(&application->uiCamera);
  289. // Setup tweening
  290. application->tweener = new Tweener();
  291. application->fadeInTween = new Tween<Vector4>(EaseFunction::IN_CUBIC, 0.0f, 1.5f, Vector4(0.0f, 0.0f, 0.0f, 1.0f), Vector4(0.0f, 0.0f, 0.0f, -1.0f));
  292. application->fadeInTween->setUpdateCallback(std::bind(UIElement::setTintColor, application->blackoutImage, std::placeholders::_1));
  293. application->tweener->addTween(application->fadeInTween);
  294. application->fadeOutTween = new Tween<Vector4>(EaseFunction::OUT_CUBIC, 0.0f, 1.5f, Vector4(0.0f, 0.0f, 0.0f, 0.0f), Vector4(0.0f, 0.0f, 0.0f, 1.0f));
  295. application->fadeOutTween->setUpdateCallback(std::bind(UIElement::setTintColor, application->blackoutImage, std::placeholders::_1));
  296. application->tweener->addTween(application->fadeOutTween);
  297. application->splashFadeInTween = new Tween<Vector4>(EaseFunction::IN_CUBIC, 0.0f, 0.5f, Vector4(1.0f, 1.0f, 1.0f, 0.0f), Vector4(0.0f, 0.0f, 0.0f, 1.0f));
  298. application->splashFadeInTween->setUpdateCallback(std::bind(UIElement::setTintColor, application->splashImage, std::placeholders::_1));
  299. application->tweener->addTween(application->splashFadeInTween);
  300. application->splashFadeOutTween = new Tween<Vector4>(EaseFunction::OUT_CUBIC, 0.0f, 0.5f, Vector4(1.0f, 1.0f, 1.0f, 1.0f), Vector4(0.0f, 0.0f, 0.0f, -1.0f));
  301. application->splashFadeOutTween->setUpdateCallback(std::bind(UIElement::setTintColor, application->splashImage, std::placeholders::_1));
  302. application->tweener->addTween(application->splashFadeOutTween);
  303. application->titleFadeInTween = new Tween<Vector4>(EaseFunction::IN_CUBIC, 0.0f, 2.0f, Vector4(1.0f, 1.0f, 1.0f, 0.0f), Vector4(0.0f, 0.0f, 0.0f, 1.0f));
  304. application->titleFadeInTween->setUpdateCallback(std::bind(UIElement::setTintColor, application->titleImage, std::placeholders::_1));
  305. application->tweener->addTween(application->titleFadeInTween);
  306. application->titleFadeOutTween = new Tween<Vector4>(EaseFunction::OUT_CUBIC, 0.0f, 0.25f, Vector4(1.0f, 1.0f, 1.0f, 1.0f), Vector4(0.0f, 0.0f, 0.0f, -1.0f));
  307. application->titleFadeOutTween->setUpdateCallback(std::bind(UIElement::setTintColor, application->titleImage, std::placeholders::_1));
  308. application->tweener->addTween(application->titleFadeOutTween);
  309. application->copyrightFadeInTween = new Tween<Vector4>(EaseFunction::IN_CUBIC, 0.0f, 1.0f, Vector4(1.0f, 1.0f, 1.0f, 0.0f), Vector4(0.0f, 0.0f, 0.0f, 1.0f));
  310. application->copyrightFadeInTween->setUpdateCallback(std::bind(UIElement::setTintColor, application->copyrightImage, std::placeholders::_1));
  311. application->tweener->addTween(application->copyrightFadeInTween);
  312. application->copyrightFadeOutTween = new Tween<Vector4>(EaseFunction::OUT_CUBIC, 0.0f, 0.25f, Vector4(1.0f, 1.0f, 1.0f, 1.0f), Vector4(0.0f, 0.0f, 0.0f, -1.0f));
  313. application->copyrightFadeOutTween->setUpdateCallback(std::bind(UIElement::setTintColor, application->copyrightImage, std::placeholders::_1));
  314. application->tweener->addTween(application->copyrightFadeOutTween);
  315. application->anyKeyFadeInTween = new Tween<Vector4>(EaseFunction::LINEAR, 0.0f, 1.5f, Vector4(1.0f, 1.0f, 1.0f, 0.0f), Vector4(0.0f, 0.0f, 0.0f, 1.0f));
  316. application->anyKeyFadeInTween->setUpdateCallback(std::bind(UIElement::setTintColor, application->anyKeyLabel, std::placeholders::_1));
  317. application->tweener->addTween(application->anyKeyFadeInTween);
  318. application->anyKeyFadeOutTween = new Tween<Vector4>(EaseFunction::LINEAR, 0.0f, 1.5f, Vector4(1.0f, 1.0f, 1.0f, 1.0f), Vector4(0.0f, 0.0f, 0.0f, -1.0f));
  319. application->anyKeyFadeOutTween->setUpdateCallback(std::bind(UIElement::setTintColor, application->anyKeyLabel, std::placeholders::_1));
  320. application->tweener->addTween(application->anyKeyFadeOutTween);
  321. float menuFadeInDuration = 0.15f;
  322. Vector4 menuFadeInStartColor = Vector4(1.0f, 1.0f, 1.0f, 0.0f);
  323. Vector4 menuFadeInDeltaColor = Vector4(0.0f, 0.0f, 0.0f, 1.0f);
  324. float menuFadeOutDuration = 0.15f;
  325. Vector4 menuFadeOutStartColor = Vector4(1.0f, 1.0f, 1.0f, 1.0f);
  326. Vector4 menuFadeOutDeltaColor = Vector4(0.0f, 0.0f, 0.0f, -1.0f);
  327. float menuSlideInDuration = 0.35f;
  328. Vector2 menuSlideInStartTranslation = Vector2(-64.0f, 0.0f);
  329. Vector2 menuSlideInDeltaTranslation = Vector2(128.0f, 0.0f);
  330. application->menuFadeInTween = new Tween<Vector4>(EaseFunction::OUT_QUINT, 0.0f, menuFadeInDuration, menuFadeInStartColor, menuFadeInDeltaColor);
  331. application->tweener->addTween(application->menuFadeInTween);
  332. application->menuFadeOutTween = new Tween<Vector4>(EaseFunction::OUT_QUINT, 0.0f, menuFadeOutDuration, menuFadeOutStartColor, menuFadeOutDeltaColor);
  333. application->tweener->addTween(application->menuFadeOutTween);
  334. application->menuSlideInTween = new Tween<Vector2>(EaseFunction::OUT_QUINT, 0.0f, menuSlideInDuration, menuSlideInStartTranslation, menuSlideInDeltaTranslation);
  335. application->tweener->addTween(application->menuSlideInTween);
  336. // Link tweens
  337. application->anyKeyFadeInTween->setEndCallback(std::bind(TweenBase::start, application->anyKeyFadeOutTween));
  338. application->anyKeyFadeOutTween->setEndCallback(std::bind(TweenBase::start, application->anyKeyFadeInTween));
  339. // Menus
  340. application->selectedMenuItemIndex = 0;
  341. application->mainMenu = new Menu();
  342. MenuItem* challengeItem = application->mainMenu->addItem();
  343. challengeItem->setSelectedCallback(std::bind(UIElement::setTintColor, application->challengeLabel, application->selectedColor));
  344. challengeItem->setDeselectedCallback(std::bind(UIElement::setTintColor, application->challengeLabel, application->deselectedColor));
  345. challengeItem->setActivatedCallback(std::bind(std::printf, "0\n"));
  346. application->challengeLabel->setMouseOverCallback(std::bind(Application::selectMenuItem, application, challengeItem->getIndex()));
  347. application->challengeLabel->setMouseMovedCallback(std::bind(Application::selectMenuItem, application, challengeItem->getIndex()));
  348. application->challengeLabel->setMousePressedCallback(std::bind(Application::activateMenuItem, application, challengeItem->getIndex()));
  349. MenuItem* experimentItem = application->mainMenu->addItem();
  350. experimentItem->setSelectedCallback(std::bind(UIElement::setTintColor, application->experimentLabel, application->selectedColor));
  351. experimentItem->setDeselectedCallback(std::bind(UIElement::setTintColor, application->experimentLabel, application->deselectedColor));
  352. experimentItem->setActivatedCallback(std::bind(Application::enterMenu, application, 2));
  353. application->experimentLabel->setMouseOverCallback(std::bind(Application::selectMenuItem, application, experimentItem->getIndex()));
  354. application->experimentLabel->setMouseMovedCallback(std::bind(Application::selectMenuItem, application, experimentItem->getIndex()));
  355. application->experimentLabel->setMousePressedCallback(std::bind(Application::activateMenuItem, application, experimentItem->getIndex()));
  356. MenuItem* settingsItem = application->mainMenu->addItem();
  357. settingsItem->setSelectedCallback(std::bind(UIElement::setTintColor, application->settingsLabel, application->selectedColor));
  358. settingsItem->setDeselectedCallback(std::bind(UIElement::setTintColor, application->settingsLabel, application->deselectedColor));
  359. settingsItem->setActivatedCallback(std::bind(Application::enterMenu, application, 3));
  360. application->settingsLabel->setMouseOverCallback(std::bind(Application::selectMenuItem, application, settingsItem->getIndex()));
  361. application->settingsLabel->setMouseMovedCallback(std::bind(Application::selectMenuItem, application, settingsItem->getIndex()));
  362. application->settingsLabel->setMousePressedCallback(std::bind(Application::activateMenuItem, application, settingsItem->getIndex()));
  363. MenuItem* quitItem = application->mainMenu->addItem();
  364. quitItem->setSelectedCallback(std::bind(UIElement::setTintColor, application->quitLabel, application->selectedColor));
  365. quitItem->setDeselectedCallback(std::bind(UIElement::setTintColor, application->quitLabel, application->deselectedColor));
  366. quitItem->setActivatedCallback(std::bind(Application::close, application, EXIT_SUCCESS));
  367. application->quitLabel->setMouseOverCallback(std::bind(Application::selectMenuItem, application, quitItem->getIndex()));
  368. application->quitLabel->setMouseMovedCallback(std::bind(Application::selectMenuItem, application, quitItem->getIndex()));
  369. application->quitLabel->setMousePressedCallback(std::bind(Application::activateMenuItem, application, quitItem->getIndex()));
  370. application->experimentMenu = new Menu();
  371. MenuItem* loadItem = application->experimentMenu->addItem();
  372. loadItem->setSelectedCallback(std::bind(UIElement::setTintColor, application->loadLabel, application->selectedColor));
  373. loadItem->setDeselectedCallback(std::bind(UIElement::setTintColor, application->loadLabel, application->deselectedColor));
  374. loadItem->setActivatedCallback(std::bind(std::printf, "0\n"));
  375. application->loadLabel->setMouseOverCallback(std::bind(Application::selectMenuItem, application, loadItem->getIndex()));
  376. application->loadLabel->setMouseMovedCallback(std::bind(Application::selectMenuItem, application, loadItem->getIndex()));
  377. application->loadLabel->setMousePressedCallback(std::bind(Application::activateMenuItem, application, loadItem->getIndex()));
  378. MenuItem* newItem = application->experimentMenu->addItem();
  379. newItem->setSelectedCallback(std::bind(UIElement::setTintColor, application->newLabel, application->selectedColor));
  380. newItem->setDeselectedCallback(std::bind(UIElement::setTintColor, application->newLabel, application->deselectedColor));
  381. newItem->setActivatedCallback(std::bind(Application::changeState, application, application->experimentState));
  382. application->newLabel->setMouseOverCallback(std::bind(Application::selectMenuItem, application, newItem->getIndex()));
  383. application->newLabel->setMouseMovedCallback(std::bind(Application::selectMenuItem, application, newItem->getIndex()));
  384. application->newLabel->setMousePressedCallback(std::bind(Application::activateMenuItem, application, newItem->getIndex()));
  385. MenuItem* experimentBackItem = application->experimentMenu->addItem();
  386. experimentBackItem->setSelectedCallback(std::bind(UIElement::setTintColor, application->experimentBackLabel, application->selectedColor));
  387. experimentBackItem->setDeselectedCallback(std::bind(UIElement::setTintColor, application->experimentBackLabel, application->deselectedColor));
  388. experimentBackItem->setActivatedCallback(std::bind(Application::enterMenu, application, 0));
  389. application->experimentBackLabel->setMouseOverCallback(std::bind(Application::selectMenuItem, application, experimentBackItem->getIndex()));
  390. application->experimentBackLabel->setMouseMovedCallback(std::bind(Application::selectMenuItem, application, experimentBackItem->getIndex()));
  391. application->experimentBackLabel->setMousePressedCallback(std::bind(Application::activateMenuItem, application, experimentBackItem->getIndex()));
  392. application->settingsMenu = new Menu();
  393. MenuItem* videoItem = application->settingsMenu->addItem();
  394. videoItem->setSelectedCallback(std::bind(UIElement::setTintColor, application->videoLabel, application->selectedColor));
  395. videoItem->setDeselectedCallback(std::bind(UIElement::setTintColor, application->videoLabel, application->deselectedColor));
  396. videoItem->setActivatedCallback(std::bind(std::printf, "0\n"));
  397. application->videoLabel->setMouseOverCallback(std::bind(Application::selectMenuItem, application, videoItem->getIndex()));
  398. application->videoLabel->setMouseMovedCallback(std::bind(Application::selectMenuItem, application, videoItem->getIndex()));
  399. application->videoLabel->setMousePressedCallback(std::bind(Application::activateMenuItem, application, videoItem->getIndex()));
  400. MenuItem* audioItem = application->settingsMenu->addItem();
  401. audioItem->setSelectedCallback(std::bind(UIElement::setTintColor, application->audioLabel, application->selectedColor));
  402. audioItem->setDeselectedCallback(std::bind(UIElement::setTintColor, application->audioLabel, application->deselectedColor));
  403. audioItem->setActivatedCallback(std::bind(std::printf, "1\n"));
  404. application->audioLabel->setMouseOverCallback(std::bind(Application::selectMenuItem, application, audioItem->getIndex()));
  405. application->audioLabel->setMouseMovedCallback(std::bind(Application::selectMenuItem, application, audioItem->getIndex()));
  406. application->audioLabel->setMousePressedCallback(std::bind(Application::activateMenuItem, application, audioItem->getIndex()));
  407. MenuItem* controlsItem = application->settingsMenu->addItem();
  408. controlsItem->setSelectedCallback(std::bind(UIElement::setTintColor, application->controlsLabel, application->selectedColor));
  409. controlsItem->setDeselectedCallback(std::bind(UIElement::setTintColor, application->controlsLabel, application->deselectedColor));
  410. controlsItem->setActivatedCallback(std::bind(std::printf, "2\n"));
  411. application->controlsLabel->setMouseOverCallback(std::bind(Application::selectMenuItem, application, controlsItem->getIndex()));
  412. application->controlsLabel->setMouseMovedCallback(std::bind(Application::selectMenuItem, application, controlsItem->getIndex()));
  413. application->controlsLabel->setMousePressedCallback(std::bind(Application::activateMenuItem, application, controlsItem->getIndex()));
  414. MenuItem* gameItem = application->settingsMenu->addItem();
  415. gameItem->setSelectedCallback(std::bind(UIElement::setTintColor, application->gameLabel, application->selectedColor));
  416. gameItem->setDeselectedCallback(std::bind(UIElement::setTintColor, application->gameLabel, application->deselectedColor));
  417. gameItem->setActivatedCallback(std::bind(std::printf, "3\n"));
  418. application->gameLabel->setMouseOverCallback(std::bind(Application::selectMenuItem, application, gameItem->getIndex()));
  419. application->gameLabel->setMouseMovedCallback(std::bind(Application::selectMenuItem, application, gameItem->getIndex()));
  420. application->gameLabel->setMousePressedCallback(std::bind(Application::activateMenuItem, application, gameItem->getIndex()));
  421. MenuItem* settingsBackItem = application->settingsMenu->addItem();
  422. settingsBackItem->setSelectedCallback(std::bind(UIElement::setTintColor, application->settingsBackLabel, application->selectedColor));
  423. settingsBackItem->setDeselectedCallback(std::bind(UIElement::setTintColor, application->settingsBackLabel, application->deselectedColor));
  424. settingsBackItem->setActivatedCallback(std::bind(Application::enterMenu, application, 0));
  425. application->settingsBackLabel->setMouseOverCallback(std::bind(Application::selectMenuItem, application, settingsBackItem->getIndex()));
  426. application->settingsBackLabel->setMouseMovedCallback(std::bind(Application::selectMenuItem, application, settingsBackItem->getIndex()));
  427. application->settingsBackLabel->setMousePressedCallback(std::bind(Application::activateMenuItem, application, settingsBackItem->getIndex()));
  428. application->menuCount = 4;
  429. application->menus = new Menu*[application->menuCount];
  430. application->menus[0] = application->mainMenu;
  431. application->menus[1] = application->challengeMenu;
  432. application->menus[2] = application->experimentMenu;
  433. application->menus[3] = application->settingsMenu;
  434. application->menuContainers = new UIContainer*[application->menuCount];
  435. application->menuContainers[0] = application->mainMenuContainer;
  436. application->menuContainers[1] = application->challengeMenuContainer;
  437. application->menuContainers[2] = application->experimentMenuContainer;
  438. application->menuContainers[3] = application->settingsMenuContainer;
  439. application->currentMenu = application->mainMenu;
  440. application->currentMenuIndex = 0;
  441. application->selectedMenuItemIndex = 0;
  442. application->selectMenuItem(application->selectedMenuItemIndex);
  443. // Models
  444. application->displayModel = application->modelLoader->load("data/models/display.mdl");
  445. application->antModel = application->modelLoader->load("data/models/worker-ant.mdl");
  446. // Model instances
  447. application->displayModelInstance = new ModelInstance();
  448. application->antModelInstance = new ModelInstance();
  449. // Allocate game variables
  450. application->surfaceCam = new SurfaceCameraController();
  451. application->tunnelCam = new TunnelCameraController();
  452. // Setup screen fade-in transition
  453. fadeIn = false;
  454. fadeOut = false;
  455. // Check for splash screen skip setting
  456. skip = false;
  457. application->settings.get("skip_splash", &skip);
  458. // Add window observer and set layout
  459. application->inputManager->addWindowObserver(this);
  460. windowResized(application->width, application->height);
  461. // Start timer
  462. stateTime = 0.0f;
  463. application->frameTimer.reset();
  464. application->frameTimer.start();
  465. }
  466. void SplashState::execute()
  467. {
  468. // Calculate delta time (in seconds)
  469. float dt = static_cast<float>(application->frameTimer.microseconds().count()) / 1000000.0f;
  470. application->frameTimer.reset();
  471. // Add dt to state time
  472. stateTime += dt;
  473. // Listen for splash screen skip
  474. InputEvent event;
  475. application->inputManager->listen(&event);
  476. if (skip || event.type != InputEvent::Type::NONE)
  477. {
  478. application->menuControlProfile->update();
  479. application->inputManager->update();
  480. // Check if application was closed
  481. if (application->escape.isTriggered())
  482. {
  483. application->close(EXIT_SUCCESS);
  484. return;
  485. }
  486. // Check if fullscreen was toggled
  487. else if (application->toggleFullscreen.isTriggered() && !application->toggleFullscreen.wasTriggered())
  488. {
  489. application->changeFullscreen();
  490. }
  491. else
  492. {
  493. // Clear screen
  494. glClear(GL_COLOR_BUFFER_BIT);
  495. SDL_GL_SwapWindow(application->window);
  496. // Change to title state
  497. application->changeState(application->titleState);
  498. return;
  499. }
  500. }
  501. // Start fade-in
  502. if (!fadeIn && stateTime >= blankDuration)
  503. {
  504. // Begin fade-in
  505. fadeIn = true;
  506. application->splashImage->setVisible(true);
  507. application->splashFadeInTween->start();
  508. }
  509. // Begin fade-out
  510. if (!fadeOut && stateTime >= blankDuration + application->splashFadeInTween->getDuration() + hangDuration)
  511. {
  512. fadeOut = true;
  513. application->splashFadeOutTween->start();
  514. }
  515. // Next state
  516. if (fadeOut && application->splashFadeOutTween->isStopped())
  517. {
  518. application->splashImage->setVisible(false);
  519. application->changeState(application->titleState);
  520. return;
  521. }
  522. // Update input
  523. application->inputManager->update();
  524. // Update menu controls
  525. application->menuControlProfile->update();
  526. // Check if application was closed
  527. if (application->inputManager->wasClosed() || application->escape.isTriggered())
  528. {
  529. application->close(EXIT_SUCCESS);
  530. return;
  531. }
  532. // Perform tweening
  533. application->tweener->update(dt);
  534. // Update UI
  535. application->uiRootElement->update();
  536. // Clear to black
  537. glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
  538. glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
  539. // Form billboard batch for UI then render UI scene
  540. application->uiBatcher->batch(application->uiBatch, application->uiRootElement);
  541. application->renderer.render(application->uiScene);
  542. // Swap buffers
  543. SDL_GL_SwapWindow(application->window);
  544. }
  545. void SplashState::exit()
  546. {
  547. std::cout << "Exiting SplashState..." << std::endl;
  548. // Hide splash screen
  549. application->splashImage->setVisible(false);
  550. application->inputManager->removeWindowObserver(this);
  551. }
  552. void SplashState::windowClosed()
  553. {
  554. application->close(EXIT_SUCCESS);
  555. }
  556. void SplashState::windowResized(int width, int height)
  557. {
  558. // Update application dimensions
  559. application->width = width;
  560. application->height = height;
  561. if (application->fullscreen)
  562. {
  563. application->fullscreenWidth = width;
  564. application->fullscreenHeight = height;
  565. }
  566. else
  567. {
  568. application->windowedWidth = width;
  569. application->windowedHeight = height;
  570. }
  571. // Setup default render target
  572. application->defaultRenderTarget.width = application->width;
  573. application->defaultRenderTarget.height = application->height;
  574. // Resize UI
  575. application->resizeUI();
  576. }