Main.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599
  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/renderer/Renderer.h"
  12. #include "anki/renderer/MainRenderer.h"
  13. #include "anki/script/ScriptManager.h"
  14. #include "anki/core/StdinListener.h"
  15. #include "anki/resource/Model.h"
  16. #include "anki/resource/Script.h"
  17. #include "anki/util/Logger.h"
  18. #include "anki/Util.h"
  19. #include "anki/resource/Skin.h"
  20. #include "anki/event/EventManager.h"
  21. #include "anki/event/MainRendererPpsHdrEvent.h"
  22. #include "anki/resource/Material.h"
  23. #include "anki/core/Timestamp.h"
  24. #include "anki/core/NativeWindow.h"
  25. #include "anki/Scene.h"
  26. #include "anki/event/LightEvent.h"
  27. #include "anki/event/AnimationEvent.h"
  28. #include "anki/event/JitterMoveEvent.h"
  29. #include "anki/core/Counters.h"
  30. #include "anki/core/Config.h"
  31. #include "anki/scene/LensFlareComponent.h"
  32. using namespace anki;
  33. App* app;
  34. ModelNode* horse;
  35. PerspectiveCamera* cam;
  36. //==============================================================================
  37. Error init()
  38. {
  39. Error err = ErrorCode::NONE;
  40. ANKI_LOGI("Other init...");
  41. SpotLight* spot;
  42. PointLight* point;
  43. MoveComponent* move;
  44. LightComponent* lightc;
  45. SceneGraph& scene = app->getSceneGraph();
  46. MainRenderer& renderer = app->getMainRenderer();
  47. ResourceManager& resources = app->getResourceManager();
  48. scene.setAmbientColor(Vec4(0.1, 0.05, 0.05, 0.0) * 1.0);
  49. if(getenv("PROFILE"))
  50. {
  51. app->setTimerTick(0.0);
  52. }
  53. // camera
  54. err = scene.newSceneNode<PerspectiveCamera>("main-camera", cam);
  55. if(err) return err;
  56. const F32 ang = 45.0;
  57. cam->setAll(
  58. renderer.getAspectRatio() * toRad(ang),
  59. toRad(ang), 0.5, 500.0);
  60. cam->getComponent<MoveComponent>().
  61. setLocalTransform(Transform(Vec4(17.0, 5.2, 0.0, 0),
  62. Mat3x4(Euler(toRad(-10.0), toRad(90.0), toRad(0.0))),
  63. 1.0));
  64. scene.setActiveCamera(cam);
  65. // lights
  66. #if 0
  67. Vec3 lpos(-24.0, 0.1, -10.0);
  68. for(int i = 0; i < 50; i++)
  69. {
  70. for(int j = 0; j < 10; j++)
  71. {
  72. std::string name = "plight" + std::to_string(i) + std::to_string(j);
  73. PointLight* point;
  74. err = scene.newSceneNode<PointLight>(name.c_str(), point);
  75. if(err) return err;
  76. point->setRadius(0.5);
  77. point->setDiffuseColor(Vec4(randFloat(6.0) - 2.0,
  78. randFloat(6.0) - 2.0, randFloat(6.0) - 2.0, 0.0));
  79. point->setSpecularColor(Vec4(randFloat(6.0) - 3.0,
  80. randFloat(6.0) - 3.0, randFloat(6.0) - 3.0, 0.0));
  81. point->setLocalOrigin(lpos.xyz0());
  82. lpos.z() += 2.0;
  83. }
  84. lpos.x() += 0.93;
  85. lpos.z() = -10;
  86. }
  87. #endif
  88. #if 1
  89. err = scene.newSceneNode<SpotLight>("spot0", spot);
  90. if(err) return err;
  91. lightc = spot->tryGetComponent<LightComponent>();
  92. lightc->setOuterAngle(toRad(35.0));
  93. lightc->setInnerAngle(toRad(15.0));
  94. lightc->setDiffuseColor(Vec4(1.0));
  95. lightc->setSpecularColor(Vec4(1.2));
  96. lightc->setDistance(30.0);
  97. lightc->setShadowEnabled(true);
  98. move = spot->tryGetComponent<MoveComponent>();
  99. move->setLocalTransform(Transform(Vec4(8.27936, 5.86285, 1.85526, 0.0),
  100. Mat3x4(Quat(-0.125117, 0.620465, 0.154831, 0.758544)), 1.0));
  101. #endif
  102. #if 0
  103. err = scene.newSceneNode<SpotLight>("spot1", spot);
  104. if(err) return err;
  105. spot->setOuterAngle(toRad(45.0));
  106. spot->setInnerAngle(toRad(15.0));
  107. spot->setLocalTransform(Transform(Vec4(5.3, 4.3, 3.0, 0.0),
  108. Mat3x4::getIdentity(), 1.0));
  109. spot->setDiffuseColor(Vec4(3.0, 0.0, 0.0, 0.0));
  110. spot->setSpecularColor(Vec4(3.0, 3.0, 0.0, 0.0));
  111. spot->setDistance(30.0);
  112. spot->setShadowEnabled(true);
  113. #endif
  114. #if 0
  115. // Vase point lights
  116. F32 x = 8.5;
  117. F32 y = 2.25;
  118. F32 z = 2.49;
  119. Array<Vec3, 4> vaseLightPos = {{Vec3(x, y, -z - 1.4), Vec3(x, y, z),
  120. Vec3(-x - 2.3, y, z), Vec3(-x - 2.3, y, -z - 1.4)}};
  121. for(U i = 0; i < vaseLightPos.getSize(); i++)
  122. {
  123. Vec4 lightPos = vaseLightPos[i].xyz0();
  124. PointLight* point;
  125. err = scene.newSceneNode<PointLight>(
  126. ("vase_plight" + std::to_string(i)).c_str(), point);
  127. if(err) return err;
  128. point->setRadius(2.0);
  129. point->setLocalOrigin(lightPos);
  130. point->setDiffuseColor(Vec4(3.0, 0.2, 0.0, 0.0));
  131. point->setSpecularColor(Vec4(1.0, 1.0, 0.0, 0.0));
  132. //if(i == 0)
  133. {
  134. point->loadLensFlare("textures/lens_flare/flares0.ankitex");
  135. LensFlareComponent& lf = point->getComponent<LensFlareComponent>();
  136. lf.setFirstFlareSize(Vec2(0.5, 0.2));
  137. lf.setColorMultiplier(Vec4(1.0, 1.0, 1.0, 0.6));
  138. }
  139. LightEvent* event;
  140. err = scene.getEventManager().newEvent(event, 0.0, 0.8, point);
  141. if(err) return err;
  142. event->setRadiusMultiplier(0.2);
  143. event->setIntensityMultiplier(Vec4(-1.2, 0.0, 0.0, 0.0));
  144. event->setSpecularIntensityMultiplier(Vec4(0.1, 0.1, 0.0, 0.0));
  145. event->setReanimate(true);
  146. JitterMoveEvent* mevent;
  147. scene.getEventManager().newEvent(mevent, 0.0, 2.0, point);
  148. mevent->setPositionLimits(
  149. Vec4(-0.5, 0.0, -0.5, 0), Vec4(0.5, 0.0, 0.5, 0));
  150. mevent->setReanimate(true);
  151. ParticleEmitter* pe;
  152. /**/
  153. if(i == 0)
  154. {
  155. err = scene.newSceneNode<ParticleEmitter>(
  156. "pefire", pe, "particles/fire.ankipart");
  157. if(err) return err;
  158. pe->setLocalOrigin(lightPos);
  159. err = scene.newSceneNode<ParticleEmitter>(
  160. "pesmoke", pe, "particles/smoke.ankipart");
  161. if(err) return err;
  162. pe->setLocalOrigin(lightPos);
  163. }
  164. else
  165. {
  166. InstanceNode* instance;
  167. err = scene.newSceneNode<InstanceNode>(
  168. ("pefire_inst" + std::to_string(i)).c_str(), instance);
  169. if(err) return err;
  170. instance->setLocalOrigin(lightPos);
  171. SceneNode& sn = scene.findSceneNode("pefire");
  172. sn.addChild(instance);
  173. err = scene.newSceneNode<InstanceNode>(
  174. ("pesmoke_inst" + std::to_string(i)).c_str(), instance);
  175. if(err) return err;
  176. instance->setLocalOrigin(lightPos);
  177. scene.findSceneNode("pesmoke").addChild(instance);
  178. }
  179. /*{
  180. scene.newSceneNode(pe, ("pesparks" + std::to_string(i)).c_str(),
  181. "particles/sparks.ankipart");
  182. pe->setLocalOrigin(lightPos);
  183. }*/
  184. }
  185. #endif
  186. #if 0
  187. // horse
  188. err = scene.newSceneNode<ModelNode>("horse", horse,
  189. "models/horse/horse.ankimdl");
  190. if(err) return err;
  191. horse->getComponent<MoveComponent>().setLocalTransform(
  192. Transform(Vec4(-2, 0, 0, 0.0), Mat3x4::getIdentity(), 0.7));
  193. //horse = scene.newSceneNode<ModelNode>("crate", "models/crate0/crate0.ankimdl");
  194. //horse->setLocalTransform(Transform(Vec3(2, 10.0, 0), Mat3::getIdentity(),
  195. // 1.0));
  196. // barrel
  197. /*ModelNode* redBarrel = new ModelNode(
  198. "red_barrel", &scene, nullptr, MoveComponent::MF_NONE,
  199. "models/red_barrel/red_barrel.mdl");
  200. redBarrel->setLocalTransform(Transform(Vec3(+2, 0, 0), Mat3::getIdentity(),
  201. 0.7));*/
  202. #endif
  203. if(0)
  204. {
  205. err = scene.newSceneNode<PointLight>("plight0", point);
  206. if(err) return err;
  207. lightc = point->tryGetComponent<LightComponent>();
  208. lightc->setRadius(30.0);
  209. lightc->setDiffuseColor(Vec4(0.6));
  210. lightc->setSpecularColor(Vec4(0.6, 0.6, 0.3, 1.0));
  211. move = point->tryGetComponent<MoveComponent>();
  212. move->setLocalOrigin(Vec4(0.0, 1.4, 0.6, 0.0));
  213. }
  214. #if 1
  215. {
  216. ScriptResourcePointer script;
  217. err = script.load("maps/adis/scene.lua", &resources);
  218. if(err) return err;
  219. err = app->getScriptManager().evalString(script->getSource());
  220. if(err) return err;
  221. }
  222. #endif
  223. /*AnimationResourcePointer anim;
  224. anim.load("maps/sponza/unnamed_0.ankianim");
  225. AnimationEvent* event;
  226. scene.getEventManager().newEvent(event, anim, cam);*/
  227. // Sectors
  228. #if 0
  229. SectorGroup& sgroup = scene.getSectorGroup();
  230. Sector* sectorA = sgroup.createNewSector(
  231. Aabb(Vec3(-38, -3, -20), Vec3(38, 27, 20)));
  232. Sector* sectorB = sgroup.createNewSector(Aabb(Vec3(-5), Vec3(5)));
  233. sgroup.createNewPortal(sectorA, sectorB, Obb(Vec3(0.0, 3.0, 0.0),
  234. Mat3::getIdentity(), Vec3(1.0, 2.0, 2.0)));
  235. Sector* sectorC = sgroup.createNewSector(
  236. Aabb(Vec3(-30, -10, -35), Vec3(30, 10, -25)));
  237. sgroup.createNewPortal(sectorA, sectorC, Obb(Vec3(-1.1, 2.0, -11.0),
  238. Mat3::getIdentity(), Vec3(1.3, 1.8, 0.5)));
  239. #endif
  240. // Path
  241. /*Path* path = new Path("todo", "path", &scene, MoveComponent::MF_NONE, nullptr);
  242. (void)path;
  243. const F32 distPerSec = 2.0;
  244. scene.getEventManager().newFollowPathEvent(-1.0,
  245. path->getDistance() / distPerSec,
  246. cam, path, distPerSec);*/
  247. #if 0
  248. horse = scene.newSceneNode<ModelNode>("shape0",
  249. "models/collision_test/Cube_Material-material.ankimdl");
  250. horse->setLocalTransform(Transform(Vec4(0.0, 0, 0, 0),
  251. Mat3x4::getIdentity(), 0.01));
  252. horse = scene.newSceneNode<ModelNode>("shape1",
  253. "models/collision_test/Cube.001_Material_001-material.ankimdl");
  254. horse->setLocalTransform(Transform(Vec4(3.1, 2, 0.2, 0),
  255. Mat3x4(Euler(toRad(-13.0), toRad(90.0), toRad(2.0))),
  256. 0.01));
  257. horse->setLocalRotation(Mat3x4(0.135899, -0.534728, 0.834033, 0.000000,
  258. 0.091205, 0.845038, 0.526900, 0.000000 ,
  259. -0.986537, 0.004463, 0.163603, 0.000000));
  260. #endif
  261. }
  262. //==============================================================================
  263. #if 0
  264. /// The func pools the stdinListener for string in the console, if
  265. /// there are any it executes them with scriptingEngine
  266. void execStdinScpripts()
  267. {
  268. while(1)
  269. {
  270. std::string cmd = StdinListenerSingleton::get().getLine();
  271. if(cmd.length() < 1)
  272. {
  273. break;
  274. }
  275. try
  276. {
  277. ScriptManagerSingleton::get().evalString(cmd.c_str());
  278. }
  279. catch(Exception& e)
  280. {
  281. ANKI_LOGE(e.what());
  282. }
  283. }
  284. }
  285. #endif
  286. //==============================================================================
  287. Error mainLoopExtra(App& app, void*, Bool& quit)
  288. {
  289. Error err = ErrorCode::NONE;
  290. F32 dist = 0.1;
  291. F32 ang = toRad(2.5);
  292. F32 scale = 0.01;
  293. F32 mouseSensivity = 9.0;
  294. quit = false;
  295. SceneGraph& scene = app.getSceneGraph();
  296. Input& in = app.getInput();
  297. MainRenderer& renderer = app.getMainRenderer();
  298. if(in.getKey(KeyCode::ESCAPE))
  299. {
  300. quit = true;
  301. return err;
  302. }
  303. // move the camera
  304. static MoveComponent* mover =
  305. &scene.getActiveCamera().getComponent<MoveComponent>();
  306. if(in.getKey(KeyCode::_1))
  307. {
  308. mover = scene.getActiveCamera().tryGetComponent<MoveComponent>();
  309. }
  310. if(in.getKey(KeyCode::_2))
  311. {
  312. mover = &scene.findSceneNode("horse").getComponent<MoveComponent>();
  313. }
  314. if(in.getKey(KeyCode::_3))
  315. {
  316. mover = &scene.findSceneNode("spot0").getComponent<MoveComponent>();
  317. }
  318. if(in.getKey(KeyCode::_4))
  319. {
  320. mover = &scene.findSceneNode("spot1").getComponent<MoveComponent>();
  321. }
  322. if(in.getKey(KeyCode::_5))
  323. {
  324. mover = &scene.findSceneNode("pe").getComponent<MoveComponent>();
  325. }
  326. if(in.getKey(KeyCode::_6))
  327. {
  328. mover = &scene.findSceneNode("shape0").getComponent<MoveComponent>();
  329. }
  330. if(in.getKey(KeyCode::_7))
  331. {
  332. mover = &scene.findSceneNode("shape1").getComponent<MoveComponent>();
  333. }
  334. /*if(in.getKey(KeyCode::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(KeyCode::F1) == 1)
  344. {
  345. renderer.getDbg().setEnabled(!renderer.getDbg().getEnabled());
  346. }
  347. if(in.getKey(KeyCode::F2) == 1)
  348. {
  349. renderer.getDbg().switchBits(Dbg::Flag::SPATIAL);
  350. }
  351. if(in.getKey(KeyCode::F3) == 1)
  352. {
  353. renderer.getDbg().switchBits(Dbg::Flag::PHYSICS);
  354. }
  355. if(in.getKey(KeyCode::F4) == 1)
  356. {
  357. renderer.getDbg().switchBits(Dbg::Flag::SECTOR);
  358. }
  359. if(in.getKey(KeyCode::F5) == 1)
  360. {
  361. renderer.getDbg().switchBits(Dbg::Flag::OCTREE);
  362. }
  363. if(in.getKey(KeyCode::F6) == 1)
  364. {
  365. renderer.getDbg().switchDepthTestEnabled();
  366. }
  367. if(in.getKey(KeyCode::F12) == 1)
  368. {
  369. renderer.takeScreenshot("screenshot.tga");
  370. }
  371. if(in.getKey(KeyCode::UP)) mover->rotateLocalX(ang);
  372. if(in.getKey(KeyCode::DOWN)) mover->rotateLocalX(-ang);
  373. if(in.getKey(KeyCode::LEFT)) mover->rotateLocalY(ang);
  374. if(in.getKey(KeyCode::RIGHT)) mover->rotateLocalY(-ang);
  375. if(in.getKey(KeyCode::A))
  376. {
  377. mover->moveLocalX(-dist);
  378. }
  379. if(in.getKey(KeyCode::D)) mover->moveLocalX(dist);
  380. if(in.getKey(KeyCode::Z)) mover->moveLocalY(dist);
  381. if(in.getKey(KeyCode::SPACE)) mover->moveLocalY(-dist);
  382. if(in.getKey(KeyCode::W)) mover->moveLocalZ(-dist);
  383. if(in.getKey(KeyCode::S)) mover->moveLocalZ(dist);
  384. if(in.getKey(KeyCode::Q)) mover->rotateLocalZ(ang);
  385. if(in.getKey(KeyCode::E)) mover->rotateLocalZ(-ang);
  386. if(in.getKey(KeyCode::PAGEUP))
  387. {
  388. mover->scale(scale);
  389. }
  390. if(in.getKey(KeyCode::PAGEDOWN))
  391. {
  392. mover->scale(-scale);
  393. }
  394. #if 0
  395. if(in.getKey(KeyCode::P) == 1)
  396. {
  397. std::cout << "{Vec3("
  398. << mover->getWorldTransform().getOrigin().toString()
  399. << "), Quat("
  400. << Quat(mover->getWorldTransform().getRotation()).toString()
  401. << ")}," << std::endl;
  402. }
  403. #endif
  404. #if 0
  405. if(in.getKey(KeyCode::L) == 1)
  406. {
  407. try
  408. {
  409. ScriptManagerSingleton::get().evalString(
  410. R"(scene = SceneGraphSingleton.get()
  411. node = scene:tryFindSceneNode("horse")
  412. if Anki.userDataValid(node) == 1 then
  413. print("valid")
  414. else
  415. print("invalid")
  416. end)");
  417. }
  418. catch(Exception& e)
  419. {
  420. ANKI_LOGE(e.what());
  421. }
  422. }
  423. #endif
  424. if(in.getMousePosition() != Vec2(0.0))
  425. {
  426. F32 angY = -ang * in.getMousePosition().x() * mouseSensivity *
  427. renderer.getAspectRatio();
  428. mover->rotateLocalY(angY);
  429. mover->rotateLocalX(ang * in.getMousePosition().y() * mouseSensivity);
  430. }
  431. //execStdinScpripts();
  432. if(getenv("PROFILE") && getGlobTimestamp() == 2000)
  433. {
  434. quit = true;
  435. return err;
  436. }
  437. return err;
  438. }
  439. //==============================================================================
  440. Error initSubsystems(int argc, char* argv[])
  441. {
  442. Error err = ErrorCode::NONE;
  443. // Config
  444. Config config;
  445. config.set("ms.ez.enabled", false);
  446. config.set("ms.ez.maxObjectsToDraw", 100);
  447. config.set("dbg.enabled", false);
  448. config.set("is.sm.bilinearEnabled", true);
  449. config.set("is.groundLightEnabled", true);
  450. config.set("is.sm.enabled", true);
  451. config.set("is.sm.poissonEnabled", true);
  452. config.set("is.sm.resolution", 1024);
  453. config.set("pps.enabled", false);
  454. config.set("pps.hdr.enabled", true);
  455. config.set("pps.hdr.renderingQuality", 0.5);
  456. config.set("pps.hdr.blurringDist", 1.0);
  457. config.set("pps.hdr.blurringIterationsCount", 2);
  458. config.set("pps.hdr.exposure", 10.0);
  459. config.set("pps.hdr.samples", 17);
  460. config.set("pps.sslr.enabled", true);
  461. config.set("pps.sslr.renderingQuality", 0.5);
  462. config.set("pps.sslr.blurringIterationsCount", 1);
  463. config.set("pps.ssao.blurringIterationsCount", 2);
  464. config.set("pps.ssao.enabled", true);
  465. config.set("pps.ssao.renderingQuality", 0.35);
  466. config.set("pps.bl.enabled", true);
  467. config.set("pps.bl.blurringIterationsCount", 2);
  468. config.set("pps.bl.sideBlurFactor", 1.0);
  469. config.set("pps.lf.enabled", true);
  470. config.set("pps.sharpen", true);
  471. config.set("renderingQuality", 1.0);
  472. config.set("width", 1280);
  473. config.set("height", 720);
  474. config.set("lodDistance", 20.0);
  475. config.set("samples", 1);
  476. config.set("tessellation", true);
  477. config.set("tilesXCount", 16);
  478. config.set("tilesYCount", 16);
  479. config.set("fullscreenDesktopResolution", false);
  480. config.set("debugContext", false);
  481. app = new App;
  482. err = app->create(config, allocAligned, nullptr);
  483. if(err) return err;
  484. // Input
  485. app->getInput().lockCursor(true);
  486. app->getInput().hideCursor(true);
  487. app->getInput().moveCursor(Vec2(0.0));
  488. return err;
  489. }
  490. //==============================================================================
  491. int main(int argc, char* argv[])
  492. {
  493. Error err = ErrorCode::NONE;
  494. err = initSubsystems(argc, argv);
  495. if(!err)
  496. {
  497. err = init();
  498. }
  499. if(!err)
  500. {
  501. err = app->mainLoop(mainLoopExtra, nullptr);
  502. }
  503. if(err)
  504. {
  505. ANKI_LOGE("Error reported. See previous messages");
  506. }
  507. else
  508. {
  509. ANKI_LOGI("Bye!!");
  510. }
  511. return 0;
  512. }