Main.cpp 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700
  1. #include <stdio.h>
  2. #include <iostream>
  3. #include <fstream>
  4. #include "anki/input/Input.h"
  5. #include "anki/Math.h"
  6. #include "anki/renderer/Renderer.h"
  7. #include "anki/core/App.h"
  8. #include "anki/resource/Mesh.h"
  9. #include "anki/resource/Material.h"
  10. #include "anki/resource/SkelAnim.h"
  11. #include "anki/physics/Character.h"
  12. #include "anki/renderer/Renderer.h"
  13. #include "anki/renderer/MainRenderer.h"
  14. #include "anki/physics/Character.h"
  15. #include "anki/physics/RigidBody.h"
  16. #include "anki/script/ScriptManager.h"
  17. #include "anki/core/StdinListener.h"
  18. #include "anki/resource/Model.h"
  19. #include "anki/core/Logger.h"
  20. #include "anki/Util.h"
  21. #include "anki/resource/Skin.h"
  22. #include "anki/event/EventManager.h"
  23. #include "anki/event/MainRendererPpsHdrEvent.h"
  24. #include "anki/resource/Material.h"
  25. #include "anki/core/Timestamp.h"
  26. #include "anki/core/NativeWindow.h"
  27. #include "anki/Scene.h"
  28. #include "anki/event/LightEvent.h"
  29. #include "anki/event/AnimationEvent.h"
  30. #include "anki/event/MoveEvent.h"
  31. #include "anki/core/Counters.h"
  32. using namespace anki;
  33. ModelNode* horse;
  34. PerspectiveCamera* cam;
  35. NativeWindow* win;
  36. HeapAllocator<U8> globAlloc;
  37. //==============================================================================
  38. void initPhysics()
  39. {
  40. SceneGraph& scene = SceneGraphSingleton::get();
  41. btCollisionShape* groundShape = new btBoxShape(
  42. btVector3(btScalar(50.), btScalar(50.), btScalar(50.)));
  43. Transform groundTransform;
  44. groundTransform.setIdentity();
  45. groundTransform.setOrigin(Vec3(0, -50, 0));
  46. RigidBody::Initializer init;
  47. init.mass = 0.0;
  48. init.shape = groundShape;
  49. init.startTrf = groundTransform;
  50. init.group = PhysicsWorld::CG_MAP;
  51. init.mask = PhysicsWorld::CG_ALL;
  52. new RigidBody(&SceneGraphSingleton::get().getPhysics(), init);
  53. #if 0
  54. btCollisionShape* colShape = new btBoxShape(
  55. btVector3(1, 1, 1));
  56. init.startTrf.setOrigin(Vec3(0.0, 15.0, 0.0));
  57. init.mass = 20;
  58. init.shape = colShape;
  59. init.group = PhysWorld::CG_PARTICLE;
  60. init.mask = PhysWorld::CG_MAP | PhysWorld::CG_PARTICLE;
  61. const I ARRAY_SIZE_X = 5;
  62. const I ARRAY_SIZE_Y = 5;
  63. const I ARRAY_SIZE_Z = 5;
  64. const I START_POS_X = -5;
  65. const I START_POS_Y = 35;
  66. const I START_POS_Z = -3;
  67. float start_x = START_POS_X - ARRAY_SIZE_X / 2;
  68. float start_y = START_POS_Y;
  69. float start_z = START_POS_Z - ARRAY_SIZE_Z / 2;
  70. for(I k = 0; k < ARRAY_SIZE_Y; k++)
  71. {
  72. for(I i = 0; i < ARRAY_SIZE_X; i++)
  73. {
  74. for(I j = 0; j < ARRAY_SIZE_Z; j++)
  75. {
  76. std::string name = std::string("crate0") + std::to_string(i)
  77. + std::to_string(j) + std::to_string(k);
  78. ModelNode* mnode = new ModelNode(
  79. name.c_str(), &SceneGraphSingleton::get(), nullptr,
  80. MoveComponent::MF_NONE, "models/crate0/crate0.mdl");
  81. init.movable = mnode;
  82. ANKI_ASSERT(init.movable);
  83. Transform trf(
  84. Vec3(2.0 * i + start_x, 2.0 * k + start_y,
  85. 2.0 * j + start_z), Mat3::getIdentity(), 1.0);
  86. init.startTrf = trf;
  87. new RigidBody(&SceneGraphSingleton::get().getPhysics(), init);
  88. }
  89. }
  90. }
  91. #endif
  92. }
  93. //==============================================================================
  94. void init()
  95. {
  96. ANKI_LOGI("Other init...");
  97. SceneGraph& scene = SceneGraphSingleton::get();
  98. scene.setAmbientColor(Vec4(0.1, 0.05, 0.05, 0.0) * 3);
  99. #if 0
  100. painter = new UiPainter(Vec2(AppSingleton::get().getWindowWidth(),
  101. AppSingleton::get().getWindowHeight()));
  102. painter->setFont("engine-rsrc/ModernAntiqua.ttf", 25, 25);
  103. #endif
  104. // camera
  105. cam = scene.newSceneNode<PerspectiveCamera>("main-camera");
  106. const F32 ang = 45.0;
  107. cam->setAll(
  108. MainRendererSingleton::get().getAspectRatio() * toRad(ang),
  109. toRad(ang), 0.5, 500.0);
  110. cam->setLocalTransform(Transform(Vec3(17.0, 5.2, 0.0),
  111. Mat3(Euler(toRad(-10.0), toRad(90.0), toRad(0.0))),
  112. 1.0));
  113. scene.setActiveCamera(cam);
  114. // lights
  115. #if 1
  116. Vec3 lpos(-24.0, 0.1, -10.0);
  117. for(int i = 0; i < 50; i++)
  118. {
  119. for(int j = 0; j < 10; j++)
  120. {
  121. std::string name = "plight" + std::to_string(i) + std::to_string(j);
  122. PointLight* point = scene.newSceneNode<PointLight>(name.c_str());
  123. point->setRadius(0.5);
  124. point->setDiffuseColor(Vec4(randFloat(6.0) - 2.0,
  125. randFloat(6.0) - 2.0, randFloat(6.0) - 2.0, 0.0));
  126. point->setSpecularColor(Vec4(randFloat(6.0) - 3.0,
  127. randFloat(6.0) - 3.0, randFloat(6.0) - 3.0, 0.0));
  128. point->setLocalOrigin(lpos);
  129. lpos.z() += 2.0;
  130. }
  131. lpos.x() += 0.93;
  132. lpos.z() = -10;
  133. }
  134. #endif
  135. #if 1
  136. SpotLight* spot = scene.newSceneNode<SpotLight>("spot0");
  137. spot->setOuterAngle(toRad(45.0));
  138. spot->setInnerAngle(toRad(15.0));
  139. spot->setLocalTransform(Transform(Vec3(8.27936, 5.86285, 1.85526),
  140. Mat3(Quat(-0.125117, 0.620465, 0.154831, 0.758544)), 1.0));
  141. spot->setDiffuseColor(Vec4(1.0));
  142. spot->setSpecularColor(Vec4(-1.0));
  143. spot->setDistance(30.0);
  144. spot->setShadowEnabled(true);
  145. spot = scene.newSceneNode<SpotLight>("spot1");
  146. spot->setOuterAngle(toRad(45.0));
  147. spot->setInnerAngle(toRad(15.0));
  148. spot->setLocalTransform(Transform(Vec3(5.3, 4.3, 3.0),
  149. Mat3::getIdentity(), 1.0));
  150. spot->setDiffuseColor(Vec4(3.0, 0.0, 0.0, 0.0));
  151. spot->setSpecularColor(Vec4(3.0, 3.0, 0.0, 0.0));
  152. spot->setDistance(30.0);
  153. spot->setShadowEnabled(true);
  154. #endif
  155. #if 1
  156. // Vase point lights
  157. F32 x = 8.5;
  158. F32 y = 2.25;
  159. F32 z = 2.49;
  160. Array<Vec3, 4> vaseLightPos = {{Vec3(x, y, -z - 1.4), Vec3(x, y, z),
  161. Vec3(-x - 2.3, y, z), Vec3(-x - 2.3, y, -z - 1.4)}};
  162. for(U i = 0; i < vaseLightPos.getSize(); i++)
  163. {
  164. Vec3 lightPos = vaseLightPos[i];
  165. PointLight* point = scene.newSceneNode<PointLight>(
  166. ("vase_plight" + std::to_string(i)).c_str());
  167. point->loadLensFlare("textures/lens_flare/flares0.ankitex");
  168. point->setRadius(2.0);
  169. point->setLocalOrigin(lightPos);
  170. point->setDiffuseColor(Vec4(3.0, 0.2, 0.0, 0.0));
  171. point->setSpecularColor(Vec4(1.0, 1.0, 0.0, 0.0));
  172. point->setLensFlaresStretchMultiplier(Vec2(10.0, 1.0));
  173. point->setLensFlaresAlpha(1.0);
  174. LightEventData eventData;
  175. eventData.radiusMultiplier = 0.2;
  176. eventData.intensityMultiplier = Vec4(-1.2, 0.0, 0.0, 0.0);
  177. eventData.specularIntensityMultiplier = Vec4(0.1, 0.1, 0.0, 0.0);
  178. LightEvent* event;
  179. scene.getEventManager().newEvent(event, 0.0, 0.8, point, eventData);
  180. event->enableBits(Event::EF_REANIMATE);
  181. MoveEventData moveData;
  182. moveData.posMin = Vec3(-0.5, 0.0, -0.5);
  183. moveData.posMax = Vec3(0.5, 0.0, 0.5);
  184. MoveEvent* mevent;
  185. scene.getEventManager().newEvent(mevent, 0.0, 2.0, point, moveData);
  186. mevent->enableBits(Event::EF_REANIMATE);
  187. ParticleEmitter* pe;
  188. /**/
  189. if(i == 0)
  190. {
  191. pe = scene.newSceneNode<ParticleEmitter>(
  192. "pefire", "particles/fire.ankipart");
  193. pe->setLocalOrigin(lightPos);
  194. pe = scene.newSceneNode<ParticleEmitter>(
  195. "pesmoke", "particles/smoke.ankipart");
  196. pe->setLocalOrigin(lightPos);
  197. }
  198. else
  199. {
  200. InstanceNode* instance;
  201. instance = scene.newSceneNode<InstanceNode>(
  202. ("pefire_inst" + std::to_string(i)).c_str());
  203. instance->setLocalOrigin(lightPos);
  204. SceneNode& sn = scene.findSceneNode("pefire");
  205. sn.addChild(instance);
  206. instance = scene.newSceneNode<InstanceNode>(
  207. ("pesmoke_inst" + std::to_string(i)).c_str());
  208. instance->setLocalOrigin(lightPos);
  209. scene.findSceneNode("pesmoke").addChild(instance);
  210. }
  211. /*{
  212. scene.newSceneNode(pe, ("pesparks" + std::to_string(i)).c_str(),
  213. "particles/sparks.ankipart");
  214. pe->setLocalOrigin(lightPos);
  215. }*/
  216. }
  217. #endif
  218. #if 1
  219. // horse
  220. horse = scene.newSceneNode<ModelNode>("horse", "models/horse/horse.ankimdl");
  221. horse->setLocalTransform(Transform(Vec3(-2, 0, 0), Mat3::getIdentity(),
  222. 0.7));
  223. //horse = scene.newSceneNode<ModelNode>("crate", "models/crate0/crate0.ankimdl");
  224. //horse->setLocalTransform(Transform(Vec3(2, 10.0, 0), Mat3::getIdentity(),
  225. // 1.0));
  226. // barrel
  227. /*ModelNode* redBarrel = new ModelNode(
  228. "red_barrel", &scene, nullptr, MoveComponent::MF_NONE,
  229. "models/red_barrel/red_barrel.mdl");
  230. redBarrel->setLocalTransform(Transform(Vec3(+2, 0, 0), Mat3::getIdentity(),
  231. 0.7));*/
  232. #endif
  233. #if 0
  234. StaticGeometryNode* sponzaModel = new StaticGeometryNode(
  235. //"data/maps/sponza/sponza_no_bmeshes.mdl",
  236. //"data/maps/sponza/sponza.mdl",
  237. "sponza", &scene, "data/maps/sponza/static_geometry.mdl");
  238. (void)sponzaModel;
  239. #endif
  240. //scene.load("maps/sponza/master.ankiscene");
  241. {
  242. String str;
  243. File file(ANKI_R("maps/sponza/scene.lua"), File::OpenFlag::READ);
  244. file.readAllText(str);
  245. ScriptManagerSingleton::get().evalString(str.c_str());
  246. }
  247. initPhysics();
  248. /*AnimationResourcePointer anim;
  249. anim.load("maps/sponza/unnamed_0.ankianim");
  250. AnimationEvent* event;
  251. scene.getEventManager().newEvent(event, anim, cam);*/
  252. // Sectors
  253. #if 0
  254. SectorGroup& sgroup = scene.getSectorGroup();
  255. Sector* sectorA = sgroup.createNewSector(
  256. Aabb(Vec3(-38, -3, -20), Vec3(38, 27, 20)));
  257. Sector* sectorB = sgroup.createNewSector(Aabb(Vec3(-5), Vec3(5)));
  258. sgroup.createNewPortal(sectorA, sectorB, Obb(Vec3(0.0, 3.0, 0.0),
  259. Mat3::getIdentity(), Vec3(1.0, 2.0, 2.0)));
  260. Sector* sectorC = sgroup.createNewSector(
  261. Aabb(Vec3(-30, -10, -35), Vec3(30, 10, -25)));
  262. sgroup.createNewPortal(sectorA, sectorC, Obb(Vec3(-1.1, 2.0, -11.0),
  263. Mat3::getIdentity(), Vec3(1.3, 1.8, 0.5)));
  264. #endif
  265. // Path
  266. /*Path* path = new Path("todo", "path", &scene, MoveComponent::MF_NONE, nullptr);
  267. (void)path;
  268. const F32 distPerSec = 2.0;
  269. scene.getEventManager().newFollowPathEvent(-1.0,
  270. path->getDistance() / distPerSec,
  271. cam, path, distPerSec);*/
  272. }
  273. //==============================================================================
  274. /// The func pools the stdinListener for string in the console, if
  275. /// there are any it executes them with scriptingEngine
  276. void execStdinScpripts()
  277. {
  278. while(1)
  279. {
  280. std::string cmd = StdinListenerSingleton::get().getLine();
  281. if(cmd.length() < 1)
  282. {
  283. break;
  284. }
  285. try
  286. {
  287. ScriptManagerSingleton::get().evalString(cmd.c_str());
  288. }
  289. catch(Exception& e)
  290. {
  291. ANKI_LOGE(e.what());
  292. }
  293. }
  294. }
  295. //==============================================================================
  296. void mainLoopExtra()
  297. {
  298. F32 dist = 0.1;
  299. F32 ang = toRad(1.5);
  300. F32 scale = 0.01;
  301. F32 mouseSensivity = 6.0;
  302. // move the camera
  303. static MoveComponent* mover =
  304. &SceneGraphSingleton::get().getActiveCamera().getComponent<MoveComponent>();
  305. Input& in = InputSingleton::get();
  306. if(in.getKey(KC_1))
  307. {
  308. mover = &SceneGraphSingleton::get().getActiveCamera();
  309. }
  310. if(in.getKey(KC_2))
  311. {
  312. mover = &SceneGraphSingleton::get().findSceneNode("horse").getComponent<MoveComponent>();
  313. }
  314. if(in.getKey(KC_3))
  315. {
  316. mover = &SceneGraphSingleton::get().findSceneNode("spot0").getComponent<MoveComponent>();
  317. }
  318. if(in.getKey(KC_4))
  319. {
  320. mover = &SceneGraphSingleton::get().findSceneNode("spot1").getComponent<MoveComponent>();
  321. }
  322. if(in.getKey(KC_5))
  323. {
  324. mover = &SceneGraphSingleton::get().findSceneNode("pe").getComponent<MoveComponent>();
  325. }
  326. if(in.getKey(KC_6))
  327. {
  328. mover = &SceneGraphSingleton::get().findSceneNode("vase_plight0").getComponent<MoveComponent>();
  329. }
  330. if(in.getKey(KC_7))
  331. {
  332. mover = &SceneGraphSingleton::get().findSceneNode("red_barrel").getComponent<MoveComponent>();
  333. }
  334. /*if(in.getKey(KC_L) == 1)
  335. {
  336. SceneNode& l =
  337. SceneGraphSingleton::get().findSceneNode("crate");
  338. Transform trf;
  339. trf.setIdentity();
  340. trf.getOrigin().y() = 20.0;
  341. l.getComponent<MoveComponent>().setLocalTransform(trf);
  342. }*/
  343. if(in.getKey(KC_F1) == 1)
  344. {
  345. MainRendererSingleton::get().getDbg().setEnabled(
  346. !MainRendererSingleton::get().getDbg().getEnabled());
  347. }
  348. if(in.getKey(KC_F2) == 1)
  349. {
  350. MainRendererSingleton::get().getDbg().switchBits(
  351. Dbg::DF_SPATIAL);
  352. }
  353. if(in.getKey(KC_F3) == 1)
  354. {
  355. MainRendererSingleton::get().getDbg().switchBits(
  356. Dbg::DF_PHYSICS);
  357. }
  358. if(in.getKey(KC_F4) == 1)
  359. {
  360. MainRendererSingleton::get().getDbg().switchBits(
  361. Dbg::DF_SECTOR);
  362. }
  363. if(in.getKey(KC_F5) == 1)
  364. {
  365. MainRendererSingleton::get().getDbg().switchBits(
  366. Dbg::DF_OCTREE);
  367. }
  368. if(in.getKey(KC_F6) == 1)
  369. {
  370. MainRendererSingleton::get().getDbg().switchDepthTestEnabled();
  371. }
  372. if(in.getKey(KC_F12) == 1)
  373. {
  374. MainRendererSingleton::get().takeScreenshot("screenshot.tga");
  375. }
  376. if(in.getKey(KC_UP)) mover->rotateLocalX(ang);
  377. if(in.getKey(KC_DOWN)) mover->rotateLocalX(-ang);
  378. if(in.getKey(KC_LEFT)) mover->rotateLocalY(ang);
  379. if(in.getKey(KC_RIGHT)) mover->rotateLocalY(-ang);
  380. if(in.getKey(KC_A)) mover->moveLocalX(-dist);
  381. if(in.getKey(KC_D)) mover->moveLocalX(dist);
  382. if(in.getKey(KC_Z)) mover->moveLocalY(dist);
  383. if(in.getKey(KC_SPACE)) mover->moveLocalY(-dist);
  384. if(in.getKey(KC_W)) mover->moveLocalZ(-dist);
  385. if(in.getKey(KC_S)) mover->moveLocalZ(dist);
  386. if(in.getKey(KC_Q)) mover->rotateLocalZ(ang);
  387. if(in.getKey(KC_E)) mover->rotateLocalZ(-ang);
  388. if(in.getKey(KC_PAGEUP))
  389. {
  390. mover->scale(scale);
  391. }
  392. if(in.getKey(KC_PAGEDOWN))
  393. {
  394. mover->scale(-scale);
  395. }
  396. if(in.getKey(KC_P) == 1)
  397. {
  398. std::cout << "{Vec3("
  399. << mover->getWorldTransform().getOrigin().toString()
  400. << "), Quat("
  401. << Quat(mover->getWorldTransform().getRotation()).toString()
  402. << ")}," << std::endl;
  403. }
  404. if(in.getKey(KC_L) == 1)
  405. {
  406. try
  407. {
  408. ScriptManagerSingleton::get().evalString(
  409. R"(scene = SceneGraphSingleton.get()
  410. node = scene:tryFindSceneNode("horse")
  411. if Anki.userDataValid(node) == 1 then
  412. print("valid")
  413. else
  414. print("invalid")
  415. end)");
  416. }
  417. catch(Exception& e)
  418. {
  419. ANKI_LOGE(e.what());
  420. }
  421. }
  422. if(in.getMousePosition() != Vec2(0.0))
  423. {
  424. F32 angY = -ang * in.getMousePosition().x() * mouseSensivity *
  425. MainRendererSingleton::get().getAspectRatio();
  426. mover->rotateLocalY(angY);
  427. mover->rotateLocalX(ang * in.getMousePosition().y() * mouseSensivity);
  428. }
  429. execStdinScpripts();
  430. }
  431. //==============================================================================
  432. void mainLoop()
  433. {
  434. ANKI_LOGI("Entering main loop");
  435. HighRezTimer::Scalar prevUpdateTime = HighRezTimer::getCurrentTime();
  436. HighRezTimer::Scalar crntTime = prevUpdateTime;
  437. ANKI_COUNTER_START_TIMER(FPS);
  438. while(1)
  439. {
  440. HighRezTimer timer;
  441. timer.start();
  442. prevUpdateTime = crntTime;
  443. crntTime = HighRezTimer::getCurrentTime();
  444. // Update
  445. //
  446. InputSingleton::get().handleEvents();
  447. mainLoopExtra();
  448. SceneGraphSingleton::get().update(
  449. prevUpdateTime, crntTime, MainRendererSingleton::get());
  450. //EventManagerSingleton::get().updateAllEvents(prevUpdateTime, crntTime);
  451. MainRendererSingleton::get().render(SceneGraphSingleton::get());
  452. if(InputSingleton::get().getKey(KC_ESCAPE))
  453. {
  454. break;
  455. }
  456. GlManagerSingleton::get().swapBuffers();
  457. ANKI_COUNTERS_RESOLVE_FRAME();
  458. // Sleep
  459. //
  460. #if 1
  461. timer.stop();
  462. if(timer.getElapsedTime() < AppSingleton::get().getTimerTick())
  463. {
  464. HighRezTimer::sleep(AppSingleton::get().getTimerTick()
  465. - timer.getElapsedTime());
  466. }
  467. #else
  468. if(MainRendererSingleton::get().getFramesCount() == 2000)
  469. {
  470. break;
  471. }
  472. #endif
  473. increaseGlobTimestamp();
  474. }
  475. GlManagerSingleton::get().destroy();
  476. ANKI_COUNTER_STOP_TIMER_INC(FPS);
  477. ANKI_COUNTERS_FLUSH();
  478. #if 0
  479. MainRendererSingleton::get().takeScreenshot("screenshot.tga");
  480. #endif
  481. }
  482. //==============================================================================
  483. // initSubsystems =
  484. //==============================================================================
  485. void makeCurrent(void* ctx)
  486. {
  487. win->contextMakeCurrent(ctx);
  488. }
  489. void swapBuffers(void* wind)
  490. {
  491. NativeWindow* win = (NativeWindow*)wind;
  492. win->swapBuffers();
  493. }
  494. void initSubsystems(int argc, char* argv[])
  495. {
  496. #if ANKI_GL == ANKI_GL_DESKTOP
  497. U32 glmajor = 4;
  498. U32 glminor = 4;
  499. #else
  500. U32 glmajor = 3;
  501. U32 glminor = 0;
  502. #endif
  503. globAlloc = HeapAllocator<U8>(HeapMemoryPool(0));
  504. // Logger
  505. LoggerSingleton::get().init(
  506. Logger::InitFlags::WITH_SYSTEM_MESSAGE_HANDLER, globAlloc);
  507. // App
  508. AppSingleton::get().init();
  509. // Window
  510. NativeWindowInitializer nwinit;
  511. nwinit.m_width = 1280;
  512. nwinit.m_height = 720;
  513. nwinit.m_majorVersion = glmajor;
  514. nwinit.m_minorVersion = glminor;
  515. nwinit.m_depthBits = 0;
  516. nwinit.m_stencilBits = 0;
  517. nwinit.m_fullscreenDesktopRez = true;
  518. nwinit.m_debugContext = ANKI_DEBUG;
  519. win = new NativeWindow;
  520. win->create(nwinit);
  521. void* context = win->getCurrentContext();
  522. win->contextMakeCurrent(nullptr);
  523. // GL stuff
  524. GlManagerSingleton::get().init(makeCurrent, context,
  525. swapBuffers, win, nwinit.m_debugContext);
  526. // Input
  527. InputSingleton::get().init(win);
  528. InputSingleton::get().lockCursor(true);
  529. InputSingleton::get().hideCursor(true);
  530. InputSingleton::get().moveCursor(Vec2(0.0));
  531. // Main renderer
  532. RendererInitializer initializer;
  533. initializer.set("ms.ez.enabled", false);
  534. initializer.set("ms.ez.maxObjectsToDraw", 100);
  535. initializer.set("dbg.enabled", false);
  536. initializer.set("is.sm.bilinearEnabled", true);
  537. initializer.set("is.groundLightEnabled", true);
  538. initializer.set("is.sm.enabled", true);
  539. initializer.set("is.sm.poissonEnabled", true);
  540. initializer.set("is.sm.resolution", 1024);
  541. initializer.set("pps.enabled", true);
  542. initializer.set("pps.hdr.enabled", true);
  543. initializer.set("pps.hdr.renderingQuality", 0.6);
  544. initializer.set("pps.hdr.blurringDist", 1.0);
  545. initializer.set("pps.hdr.blurringIterationsCount", 1);
  546. initializer.set("pps.hdr.exposure", 8.0);
  547. initializer.set("pps.hdr.samples", 9);
  548. initializer.set("pps.sslr.enabled", true);
  549. initializer.set("pps.sslr.renderingQuality", 0.35);
  550. initializer.set("pps.sslr.blurringIterationsCount", 1);
  551. initializer.set("pps.ssao.blurringIterationsCount", 1);
  552. initializer.set("pps.ssao.enabled", true);
  553. initializer.set("pps.ssao.renderingQuality", 0.35);
  554. initializer.set("pps.bl.enabled", true);
  555. initializer.set("pps.bl.blurringIterationsCount", 2);
  556. initializer.set("pps.bl.sideBlurFactor", 1.0);
  557. initializer.set("pps.lf.enabled", true);
  558. initializer.set("pps.sharpen", true);
  559. initializer.set("renderingQuality", 1.0);
  560. initializer.set("width", win->getWidth());
  561. initializer.set("height", win->getHeight());
  562. initializer.set("lodDistance", 20.0);
  563. initializer.set("samples", 1);
  564. initializer.set("tessellation", false);
  565. initializer.set("tilesXCount", 16);
  566. initializer.set("tilesYCount", 16);
  567. MainRendererSingleton::get().init(initializer);
  568. // Stdin listener
  569. StdinListenerSingleton::get().start();
  570. // Parallel jobs
  571. ThreadpoolSingleton::get().init(getCpuCoresCount());
  572. }
  573. //==============================================================================
  574. int main(int argc, char* argv[])
  575. {
  576. int exitCode;
  577. try
  578. {
  579. initSubsystems(argc, argv);
  580. init();
  581. mainLoop();
  582. ANKI_LOGI("Exiting...");
  583. AppSingleton::get().quit(EXIT_SUCCESS);
  584. exitCode = 0;
  585. }
  586. catch(std::exception& e)
  587. {
  588. ANKI_LOGE("Aborting: %s", e.what());
  589. exitCode = 1;
  590. }
  591. ANKI_LOGI("Bye!!");
  592. return exitCode;
  593. }