Main.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. // Copyright (C) 2009-2022, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <cstdio>
  6. #include <iostream>
  7. #include <fstream>
  8. #include <AnKi/AnKi.h>
  9. using namespace anki;
  10. #define PLAYER 0
  11. #define MOUSE 1
  12. class MyApp : public App
  13. {
  14. public:
  15. Bool m_profile = false;
  16. ConfigSet m_config;
  17. Error init(int argc, char* argv[]);
  18. Error userMainLoop(Bool& quit, Second elapsedTime) override;
  19. };
  20. MyApp* app = nullptr;
  21. Error MyApp::init(int argc, char* argv[])
  22. {
  23. if(argc < 2)
  24. {
  25. ANKI_LOGE("usage: %s relative/path/to/scene.lua [anki config options]", argv[0]);
  26. return Error::USER_DATA;
  27. }
  28. // Config
  29. m_config.init(allocAligned, nullptr);
  30. ANKI_CHECK(m_config.setFromCommandLineArguments(argc - 2, argv + 2));
  31. // Init super class
  32. ANKI_CHECK(App::init(&m_config, allocAligned, nullptr));
  33. // Other init
  34. Renderer& renderer = getMainRenderer().getOffscreenRenderer();
  35. ResourceManager& resources = getResourceManager();
  36. renderer.getVolumetricFog().setFogParticleColor(Vec3(1.0f, 0.9f, 0.9f));
  37. renderer.getVolumetricFog().setParticleDensity(1.0f);
  38. if(getenv("PROFILE"))
  39. {
  40. m_profile = true;
  41. m_config.setCoreTargetFps(240);
  42. TracerSingleton::get().setEnabled(true);
  43. }
  44. // Input
  45. #if MOUSE
  46. getInput().lockCursor(true);
  47. getInput().hideCursor(true);
  48. getInput().moveCursor(Vec2(0.0));
  49. #endif
  50. // Load scene
  51. ScriptResourcePtr script;
  52. ANKI_CHECK(resources.loadResource(argv[1], script));
  53. ANKI_CHECK(getScriptManager().evalString(script->getSource()));
  54. // ANKI_CHECK(renderer.getFinalComposite().loadColorGradingTexture(
  55. // "textures/color_gradient_luts/forge_lut.ankitex"));
  56. #if PLAYER
  57. SceneGraph& scene = getSceneGraph();
  58. SceneNode& cam = scene.getActiveCameraNode();
  59. PlayerNode* pnode;
  60. ANKI_CHECK(scene.newSceneNode<PlayerNode>(
  61. "player", pnode, cam.getFirstComponentOfType<MoveComponent>().getLocalOrigin() - Vec4(0.0, 1.0, 0.0, 0.0)));
  62. cam.getFirstComponentOfType<MoveComponent>().setLocalTransform(
  63. Transform(Vec4(0.0, 0.0, 0.0, 0.0), Mat3x4::getIdentity(), 1.0));
  64. pnode->addChild(&cam);
  65. #endif
  66. return Error::NONE;
  67. }
  68. Error MyApp::userMainLoop(Bool& quit, Second elapsedTime)
  69. {
  70. F32 ang = toRad(2.5f);
  71. F32 scale = 0.01f;
  72. F32 mouseSensivity = 9.0f;
  73. quit = false;
  74. SceneGraph& scene = getSceneGraph();
  75. Input& in = getInput();
  76. Renderer& renderer = getMainRenderer().getOffscreenRenderer();
  77. if(in.getKey(KeyCode::ESCAPE))
  78. {
  79. quit = true;
  80. return Error::NONE;
  81. }
  82. // move the camera
  83. static MoveComponent* mover = &scene.getActiveCameraNode().getFirstComponentOfType<MoveComponent>();
  84. if(in.getKey(KeyCode::_1))
  85. {
  86. mover = scene.getActiveCameraNode().tryGetFirstComponentOfType<MoveComponent>();
  87. }
  88. if(in.getKey(KeyCode::_2))
  89. {
  90. mover = &scene.findSceneNode("Point.018_Orientation").getFirstComponentOfType<MoveComponent>();
  91. }
  92. if(in.getKey(KeyCode::L) == 1)
  93. {
  94. /*Vec3 origin = mover->getWorldTransform().getOrigin().xyz();
  95. printf("%f %f %f\n", origin.x(), origin.y(), origin.z());*/
  96. mover->setLocalOrigin(Vec4(81.169312f, -2.309618f, 17.088392f, 0.0f));
  97. // mover->setLocalRotation(Mat3x4::getIdentity());
  98. }
  99. if(in.getKey(KeyCode::F1) == 1)
  100. {
  101. static U mode = 0;
  102. mode = (mode + 1) % 3;
  103. if(mode == 0)
  104. {
  105. getConfig().setRDbgEnabled(false);
  106. }
  107. else if(mode == 1)
  108. {
  109. getConfig().setRDbgEnabled(true);
  110. renderer.getDbg().setDepthTestEnabled(true);
  111. renderer.getDbg().setDitheredDepthTestEnabled(false);
  112. }
  113. else
  114. {
  115. getConfig().setRDbgEnabled(true);
  116. renderer.getDbg().setDepthTestEnabled(false);
  117. renderer.getDbg().setDitheredDepthTestEnabled(true);
  118. }
  119. }
  120. if(in.getKey(KeyCode::F2) == 1)
  121. {
  122. // renderer.getDbg().flipFlags(DbgFlag::SPATIAL_COMPONENT);
  123. }
  124. if(in.getKey(KeyCode::F3) == 1)
  125. {
  126. // renderer.getDbg().flipFlags(DbgFlag::PHYSICS);
  127. }
  128. if(in.getKey(KeyCode::F4) == 1)
  129. {
  130. // renderer.getDbg().flipFlags(DbgFlag::SECTOR_COMPONENT);
  131. }
  132. if(in.getKey(KeyCode::F6) == 1)
  133. {
  134. renderer.getDbg().switchDepthTestEnabled();
  135. }
  136. /*if(in.getKey(KeyCode::F12) == 1)
  137. {
  138. TracerSingleton::get().setEnabled(!TracerSingleton::get().getEnabled());
  139. }*/
  140. #if !PLAYER
  141. static F32 dist = 0.1f;
  142. if(in.getMouseButton(MouseButton::SCROLL_UP) == 1)
  143. {
  144. dist += 0.1f;
  145. dist = min(dist, 10.0f);
  146. }
  147. if(in.getMouseButton(MouseButton::SCROLL_DOWN) == 1)
  148. {
  149. dist -= 0.1f;
  150. dist = max(dist, 0.1f);
  151. }
  152. if(in.getKey(KeyCode::UP))
  153. mover->rotateLocalX(ang);
  154. if(in.getKey(KeyCode::DOWN))
  155. mover->rotateLocalX(-ang);
  156. if(in.getKey(KeyCode::LEFT))
  157. mover->rotateLocalY(ang);
  158. if(in.getKey(KeyCode::RIGHT))
  159. mover->rotateLocalY(-ang);
  160. if(in.getKey(KeyCode::A))
  161. {
  162. mover->moveLocalX(-dist);
  163. }
  164. if(in.getKey(KeyCode::D))
  165. mover->moveLocalX(dist);
  166. if(in.getKey(KeyCode::SPACE))
  167. mover->moveLocalY(dist);
  168. if(in.getKey(KeyCode::C))
  169. mover->moveLocalY(-dist);
  170. if(in.getKey(KeyCode::W))
  171. mover->moveLocalZ(-dist);
  172. if(in.getKey(KeyCode::S))
  173. mover->moveLocalZ(dist);
  174. if(in.getKey(KeyCode::Q))
  175. mover->rotateLocalZ(ang);
  176. if(in.getKey(KeyCode::E))
  177. mover->rotateLocalZ(-ang);
  178. if(in.getKey(KeyCode::PAGEUP))
  179. {
  180. mover->scale(scale);
  181. }
  182. if(in.getKey(KeyCode::PAGEDOWN))
  183. {
  184. mover->scale(-scale);
  185. }
  186. #endif
  187. #if !PLAYER && MOUSE
  188. if(in.getMousePosition() != Vec2(0.0) && !m_profile)
  189. {
  190. F32 angY = -ang * in.getMousePosition().x() * mouseSensivity * renderer.getAspectRatio();
  191. mover->rotateLocalY(angY);
  192. mover->rotateLocalX(ang * in.getMousePosition().y() * mouseSensivity);
  193. }
  194. #endif
  195. if(in.getKey(KeyCode::U) == 1)
  196. {
  197. renderer.setCurrentDebugRenderTarget(
  198. (renderer.getCurrentDebugRenderTarget() == "GBuffer_albedo") ? "" : "GBuffer_albedo");
  199. }
  200. if(in.getKey(KeyCode::I) == 1)
  201. {
  202. renderer.setCurrentDebugRenderTarget((renderer.getCurrentDebugRenderTarget() == "SSR") ? "" : "SSR");
  203. }
  204. if(in.getKey(KeyCode::O) == 1)
  205. {
  206. renderer.setCurrentDebugRenderTarget((renderer.getCurrentDebugRenderTarget() == "SM_resolve") ? ""
  207. : "SM_resolve");
  208. }
  209. if(in.getKey(KeyCode::H) == 1)
  210. {
  211. renderer.setCurrentDebugRenderTarget((renderer.getCurrentDebugRenderTarget() == "RtShadows") ? ""
  212. : "RtShadows");
  213. }
  214. if(in.getEvent(InputEvent::WINDOW_CLOSED))
  215. {
  216. quit = true;
  217. }
  218. if(m_profile && getGlobalTimestamp() == 1000)
  219. {
  220. quit = true;
  221. return Error::NONE;
  222. }
  223. return Error::NONE;
  224. }
  225. int main(int argc, char* argv[])
  226. {
  227. Error err = Error::NONE;
  228. app = new MyApp;
  229. err = app->init(argc, argv);
  230. if(!err)
  231. {
  232. err = app->mainLoop();
  233. }
  234. if(err)
  235. {
  236. ANKI_LOGE("Error reported. See previous messages");
  237. }
  238. else
  239. {
  240. ANKI_LOGI("Bye!!");
  241. }
  242. delete app;
  243. return 0;
  244. }