Main.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. // Copyright (C) 2009-present, 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 <Samples/Common/SampleApp.h>
  7. #include <Samples/PhysicsPlayground/FpsCharacter.h>
  8. using namespace anki;
  9. static Error createDestructionEvent(SceneNode* node)
  10. {
  11. CString script = R"(
  12. function update(event, prevTime, crntTime)
  13. -- Do nothing
  14. end
  15. function onKilled(event, prevTime, crntTime)
  16. logi(string.format("Will kill %s", event:getAssociatedSceneNodes():getAt(0):getName()))
  17. event:getAssociatedSceneNodes():getAt(0):markForDeletion()
  18. end
  19. )";
  20. ScriptEvent* event = SceneGraph::getSingleton().getEventManager().newEvent<ScriptEvent>(-1.0f, 10.0f, script);
  21. event->addAssociatedSceneNode(node);
  22. return Error::kNone;
  23. }
  24. static Error createFogVolumeFadeEvent(SceneNode* node)
  25. {
  26. CString script = R"(
  27. density = 15
  28. radius = 3.5
  29. function update(event, prevTime, crntTime)
  30. node = event:getAssociatedSceneNodes():getAt(0)
  31. -- logi(string.format("Will fade fog for %s", node:getName()))
  32. fogComponent = node:getFirstFogDensityComponent()
  33. dt = crntTime - prevTime
  34. density = density - 4.0 * dt
  35. radius = radius + 0.5 * dt
  36. pos = node:getLocalOrigin()
  37. pos:setY(pos:getY() - 1.1 * dt)
  38. node:setLocalOrigin(pos)
  39. if density <= 0.0 or radius <= 0.0 then
  40. node:markForDeletion()
  41. else
  42. node:setLocalScale(Vec3.new(radius))
  43. fogComponent:setDensity(density)
  44. end
  45. end
  46. function onKilled(event, prevTime, crntTime)
  47. -- Nothing
  48. end
  49. )";
  50. ScriptEvent* event = SceneGraph::getSingleton().getEventManager().newEvent<ScriptEvent>(-1, 10.0, script);
  51. event->addAssociatedSceneNode(node);
  52. return Error::kNone;
  53. }
  54. class MyApp : public SampleApp
  55. {
  56. public:
  57. using SampleApp::SampleApp;
  58. Error sampleExtraInit() override;
  59. Error userMainLoop(Bool& quit, Second elapsedTime) override;
  60. };
  61. Error MyApp::sampleExtraInit()
  62. {
  63. ScriptResourcePtr script;
  64. ANKI_CHECK(ResourceManager::getSingleton().loadResource("Assets/Scene.lua", script));
  65. ANKI_CHECK(ScriptManager::getSingleton().evalString(script->getSource()));
  66. // Create the player
  67. if(1)
  68. {
  69. SceneNode& cam = SceneGraph::getSingleton().getActiveCameraNode();
  70. cam.setLocalTransform(Transform(Vec4(0.0, 2.0, 0.0, 0.0), Mat3x4::getIdentity(), Vec4(1.0f, 1.0f, 1.0f, 0.0f)));
  71. SceneNode& arm = SceneGraph::getSingleton().findSceneNode("arm");
  72. arm.setLocalTransform(Transform(Vec3(0.065f, -0.13f, -0.4f), Mat3(Euler(0.0f, kPi, 0.0f)), Vec3(1.0f, 1.0f, 1.0f)));
  73. arm.setParent(&cam);
  74. SceneNode* player = SceneGraph::getSingleton().newSceneNode<SceneNode>("player");
  75. PlayerControllerComponent* playerc = player->newComponent<PlayerControllerComponent>();
  76. playerc->moveToPosition(Vec3(0.0f, 10.5f, 0.0f));
  77. player->addChild(&cam);
  78. }
  79. // Create a body component with hinge joint
  80. if(1)
  81. {
  82. SceneNode* base = SceneGraph::getSingleton().newSceneNode<SceneNode>("hingeBase");
  83. BodyComponent* bodyc = base->newComponent<BodyComponent>();
  84. bodyc->setBoxExtend(Vec3(0.1f));
  85. bodyc->setCollisionShapeType(BodyComponentCollisionShapeType::kAabb);
  86. bodyc->teleportTo(Vec3(-0.0f, 5.0f, -3.0f), Mat3::getIdentity());
  87. SceneNode* joint = SceneGraph::getSingleton().newSceneNode<SceneNode>("hinge");
  88. JointComponent* jointc = joint->newComponent<JointComponent>();
  89. jointc->setType(JointType::kHinge);
  90. joint->setLocalOrigin(Vec3(-0.0f, 4.8f, -3.0f));
  91. base->addChild(joint);
  92. SceneNode* monkey = SceneGraph::getSingleton().newSceneNode<SceneNode>("monkey_p2p");
  93. monkey->newComponent<MeshComponent>()->setMeshFilename("Assets/Suzanne_e3526e1428c0763c.ankimesh");
  94. monkey->newComponent<MaterialComponent>()->setMaterialFilename("Assets/dynamic_f238b379a41079ff.ankimtl");
  95. const Aabb aabb = monkey->getFirstComponentOfType<MeshComponent>().getMeshResource().getBoundingShape();
  96. const F32 height = aabb.getMax().y() - aabb.getMin().y();
  97. bodyc = monkey->newComponent<BodyComponent>();
  98. bodyc->setCollisionShapeType(BodyComponentCollisionShapeType::kFromMeshComponent);
  99. bodyc->teleportTo(Vec3(-0.0f, 4.8f - height / 2.0f, -3.0f), Mat3::getIdentity());
  100. bodyc->setMass(2.0f);
  101. joint->addChild(monkey);
  102. }
  103. // Create a chain
  104. if(1)
  105. {
  106. const U linkCount = 5;
  107. Transform trf(Vec4(-4.3f, 12.0f, -3.0f, 0.0f), Mat3x4::getIdentity(), Vec4(1.0, 1.0, 1.0, 0.0));
  108. SceneNode* base = SceneGraph::getSingleton().newSceneNode<SceneNode>("p2pBase");
  109. BodyComponent* bodyc = base->newComponent<BodyComponent>();
  110. bodyc->setBoxExtend(Vec3(0.1f));
  111. bodyc->setCollisionShapeType(BodyComponentCollisionShapeType::kAabb);
  112. bodyc->teleportTo(trf.getOrigin().xyz(), trf.getRotation().getRotationPart());
  113. trf.setOrigin(trf.getOrigin() - Vec4(0.0f, 0.5f, 0.0f, 0.0f));
  114. SceneNode* prevNode = base;
  115. for(U32 i = 0; i < linkCount; ++i)
  116. {
  117. SceneNode* joint = SceneGraph::getSingleton().newSceneNode<SceneNode>(String().sprintf("joint_chain%u", i));
  118. JointComponent* jointc = joint->newComponent<JointComponent>();
  119. jointc->setType(JointType::kPoint);
  120. joint->setLocalOrigin(trf.getOrigin().xyz());
  121. joint->setParent(prevNode);
  122. SceneNode* monkey = SceneGraph::getSingleton().newSceneNode<SceneNode>(String().sprintf("monkey_chain%u", i).toCString());
  123. const MeshComponent& meshc = monkey->newComponent<MeshComponent>()->setMeshFilename("Assets/Suzanne_e3526e1428c0763c.ankimesh");
  124. monkey->newComponent<MaterialComponent>()->setMaterialFilename("Assets/dynamic_f238b379a41079ff.ankimtl");
  125. const Aabb aabb = meshc.getMeshResource().getBoundingShape();
  126. const F32 height = aabb.getMax().y() - aabb.getMin().y();
  127. trf.setOrigin(trf.getOrigin() - Vec4(0.0f, height / 2.0f + 0.1f, 0.0f, 0.0f));
  128. BodyComponent* bodyc = monkey->newComponent<BodyComponent>();
  129. bodyc->setCollisionShapeType(BodyComponentCollisionShapeType::kFromMeshComponent);
  130. bodyc->teleportTo(trf.getOrigin().xyz(), trf.getRotation().getRotationPart());
  131. bodyc->setMass(1.0f);
  132. joint->addChild(monkey);
  133. trf.setOrigin(trf.getOrigin() - Vec4(0.0f, height / 2.0f + 0.1f, 0.0f, 0.0f));
  134. prevNode = monkey;
  135. }
  136. }
  137. // Trigger
  138. if(1)
  139. {
  140. SceneNode* node = SceneGraph::getSingleton().newSceneNode<SceneNode>("trigger");
  141. TriggerComponent* triggerc = node->newComponent<TriggerComponent>();
  142. triggerc->setType(TriggerComponentShapeType::kSphere);
  143. node->setLocalScale(Vec3(1.8f, 1.8f, 1.8f));
  144. node->setLocalOrigin(Vec3(4.0f, 0.5f, 0.0f));
  145. }
  146. Input::getSingleton().lockCursor(true);
  147. Input::getSingleton().hideCursor(true);
  148. Input::getSingleton().moveCursor(Vec2(0.0f));
  149. return Error::kNone;
  150. }
  151. Error MyApp::userMainLoop(Bool& quit, [[maybe_unused]] Second elapsedTime)
  152. {
  153. // ANKI_CHECK(SampleApp::userMainLoop(quit));
  154. Renderer& renderer = Renderer::getSingleton();
  155. Input& in = Input::getSingleton();
  156. if(Input::getSingleton().getKey(KeyCode::kEscape))
  157. {
  158. quit = true;
  159. }
  160. if(in.getKey(KeyCode::kY) == 1)
  161. {
  162. renderer.setCurrentDebugRenderTarget(
  163. (renderer.getCurrentDebugRenderTarget() == "IndirectDiffuseClipmapsTest") ? "" : "IndirectDiffuseClipmapsTest");
  164. // g_shadowMappingPcssCVar = !g_shadowMappingPcssCVar;
  165. }
  166. if(in.getKey(KeyCode::kU) == 1)
  167. {
  168. renderer.setCurrentDebugRenderTarget((renderer.getCurrentDebugRenderTarget() == "Reflections") ? "" : "Reflections");
  169. }
  170. if(in.getKey(KeyCode::kI) == 1)
  171. {
  172. renderer.setCurrentDebugRenderTarget((renderer.getCurrentDebugRenderTarget() == "Ssao") ? "" : "Ssao");
  173. }
  174. if(in.getKey(KeyCode::kO) == 1)
  175. {
  176. renderer.setCurrentDebugRenderTarget((renderer.getCurrentDebugRenderTarget() == "HistoryLen") ? "" : "HistoryLen");
  177. }
  178. if(Input::getSingleton().getKey(KeyCode::kP) == 1)
  179. {
  180. static U32 idx = 3;
  181. ++idx;
  182. idx %= 4;
  183. if(idx == 0)
  184. {
  185. renderer.setCurrentDebugRenderTarget("IndirectDiffuseVrsSri");
  186. }
  187. else if(idx == 1)
  188. {
  189. renderer.setCurrentDebugRenderTarget("VrsSriDownscaled");
  190. }
  191. else if(idx == 2)
  192. {
  193. renderer.setCurrentDebugRenderTarget("VrsSri");
  194. }
  195. else
  196. {
  197. renderer.setCurrentDebugRenderTarget("");
  198. }
  199. }
  200. if(Input::getSingleton().getKey(KeyCode::kL) == 1)
  201. {
  202. renderer.setCurrentDebugRenderTarget((renderer.getCurrentDebugRenderTarget() == "Bloom") ? "" : "Bloom");
  203. }
  204. if(Input::getSingleton().getKey(KeyCode::kJ) == 1)
  205. {
  206. g_vrsCVar = !g_vrsCVar;
  207. }
  208. if(Input::getSingleton().getKey(KeyCode::kF1) == 1)
  209. {
  210. static U mode = 0;
  211. mode = (mode + 1) % 3;
  212. if(mode == 0)
  213. {
  214. g_dbgSceneCVar = false;
  215. }
  216. else if(mode == 1)
  217. {
  218. g_dbgSceneCVar = true;
  219. renderer.getDbg().setDepthTestEnabled(true);
  220. renderer.getDbg().setDitheredDepthTestEnabled(false);
  221. }
  222. else
  223. {
  224. g_dbgSceneCVar = true;
  225. renderer.getDbg().setDepthTestEnabled(false);
  226. renderer.getDbg().setDitheredDepthTestEnabled(true);
  227. }
  228. }
  229. if(Input::getSingleton().getKey(KeyCode::kF2) == 1)
  230. {
  231. g_dbgPhysicsCVar = !g_dbgPhysicsCVar;
  232. renderer.getDbg().setDepthTestEnabled(true);
  233. renderer.getDbg().setDitheredDepthTestEnabled(false);
  234. }
  235. // Move player
  236. {
  237. SceneNode& player = SceneGraph::getSingleton().findSceneNode("player");
  238. PlayerControllerComponent& playerc = player.getFirstComponentOfType<PlayerControllerComponent>();
  239. if(Input::getSingleton().getKey(KeyCode::kR))
  240. {
  241. player.getFirstComponentOfType<PlayerControllerComponent>().moveToPosition(Vec3(0.0f, 2.0f, 0.0f));
  242. }
  243. constexpr F32 ang = toRad(7.0f);
  244. F32 y = Input::getSingleton().getMousePosition().y();
  245. F32 x = Input::getSingleton().getMousePosition().x();
  246. if(y != 0.0 || x != 0.0)
  247. {
  248. // Set rotation
  249. Mat3 rot(Euler(ang * y * 11.25f, ang * x * -20.0f, 0.0f));
  250. rot = player.getLocalRotation() * rot;
  251. Vec3 newz = rot.getColumn(2).normalize();
  252. Vec3 newx = Vec3(0.0, 1.0, 0.0).cross(newz);
  253. Vec3 newy = newz.cross(newx);
  254. rot.setColumns(newx, newy, newz);
  255. rot = rot.reorthogonalize();
  256. // Update move
  257. player.setLocalRotation(rot);
  258. }
  259. const F32 speed = 8.5;
  260. Vec3 moveVec(0.0);
  261. if(Input::getSingleton().getKey(KeyCode::kW))
  262. {
  263. moveVec.z() += 1.0f;
  264. }
  265. if(Input::getSingleton().getKey(KeyCode::kA))
  266. {
  267. moveVec.x() += 1.0f;
  268. }
  269. if(Input::getSingleton().getKey(KeyCode::kS))
  270. {
  271. moveVec.z() -= 1.0f;
  272. }
  273. if(Input::getSingleton().getKey(KeyCode::kD))
  274. {
  275. moveVec.x() -= 1.0f;
  276. }
  277. F32 jumpSpeed = 0.0f;
  278. if(Input::getSingleton().getKey(KeyCode::kSpace))
  279. {
  280. jumpSpeed += 8.0f;
  281. }
  282. static Bool crouch = false;
  283. Bool crouchChanged = false;
  284. if(Input::getSingleton().getKey(KeyCode::kC))
  285. {
  286. crouch = !crouch;
  287. crouchChanged = true;
  288. }
  289. if(moveVec != 0.0f || jumpSpeed != 0.0f || crouchChanged)
  290. {
  291. Vec3 dir;
  292. if(moveVec != 0.0f)
  293. {
  294. dir = -(player.getLocalRotation() * moveVec);
  295. dir.y() = 0.0f;
  296. dir = dir.normalize();
  297. }
  298. F32 speed1 = speed;
  299. if(Input::getSingleton().getKey(KeyCode::kLeftShift))
  300. {
  301. speed1 *= 2.0f;
  302. }
  303. playerc.setVelocity(speed1, jumpSpeed, dir, crouch);
  304. }
  305. }
  306. if(Input::getSingleton().getMouseButton(MouseButton::kRight) == 1)
  307. {
  308. ANKI_LOGI("Firing a grenade");
  309. static U32 instance = 0;
  310. Transform camTrf = SceneGraph::getSingleton().getActiveCameraNode().getWorldTransform();
  311. const Vec3 newPos = camTrf.getOrigin().xyz() + camTrf.getRotation().getZAxis() * -3.0f;
  312. camTrf.setOrigin(newPos.xyz0());
  313. SceneNode* grenade = SceneGraph::getSingleton().newSceneNode<SceneNode>(String().sprintf("Grenade%u", instance++).toCString());
  314. grenade->setLocalScale(Vec3(2.8f));
  315. grenade->newComponent<MeshComponent>()->setMeshFilename("Assets/MESH_grenade_818651700502e14b.ankimesh");
  316. grenade->newComponent<MaterialComponent>()->setMaterialFilename("Assets/MTL_grenade_4346150e31bdb957.ankimtl");
  317. // monkey->getFirstComponentOfType<MoveComponent>().setLocalTransform(camTrf);
  318. BodyComponent* bodyc = grenade->newComponent<BodyComponent>();
  319. bodyc->setCollisionShapeType(BodyComponentCollisionShapeType::kFromMeshComponent);
  320. bodyc->teleportTo(camTrf.getOrigin().xyz(), camTrf.getRotation().getRotationPart());
  321. bodyc->setMass(1.0f);
  322. bodyc->applyForce(camTrf.getRotation().getZAxis().xyz() * -1200.0f, Vec3(0.0f, 0.0f, 0.0f));
  323. // Create the destruction event
  324. ANKI_CHECK(createDestructionEvent(grenade));
  325. }
  326. if(Input::getSingleton().getMouseButton(MouseButton::kLeft) == 1)
  327. {
  328. const Transform camTrf = SceneGraph::getSingleton().getActiveCameraNode().getWorldTransform();
  329. for(U32 i = 0; i < 8; ++i)
  330. {
  331. F32 spredAngle = toRad(getRandomRange(-2.0f, 2.0f));
  332. Mat3 randDirection(Axisang(spredAngle, Vec3(1.0f, 0.0f, 0.0f)));
  333. spredAngle = toRad(getRandomRange(-2.0f, 2.0f));
  334. randDirection = randDirection * Mat3(Axisang(spredAngle, Vec3(0.0f, 1.0f, 0.0f)));
  335. randDirection = camTrf.getRotation().getRotationPart() * randDirection;
  336. const Vec3 from = camTrf.getOrigin().xyz();
  337. const Vec3 to = from + -randDirection.getZAxis() * 100.0f;
  338. RayHitResult result;
  339. const Bool hit = PhysicsWorld::getSingleton().castRayClosestHit(from, to, PhysicsLayerBit::kStatic, result);
  340. if(hit)
  341. {
  342. // Create rotation
  343. const Vec3& zAxis = result.m_normal;
  344. Vec3 yAxis = Vec3(0, 1, 0.5);
  345. Vec3 xAxis = yAxis.cross(zAxis).normalize();
  346. yAxis = zAxis.cross(xAxis);
  347. Mat3x4 rot = Mat3x4::getIdentity();
  348. rot.setXAxis(xAxis);
  349. rot.setYAxis(yAxis);
  350. rot.setZAxis(zAxis);
  351. Transform trf(result.m_hitPosition.xyz0(), rot, Vec4(1.0f, 1.0f, 1.0f, 0.0f));
  352. // Create an obj
  353. static U32 id = 0;
  354. SceneNode* bulletDecal = SceneGraph::getSingleton().newSceneNode<SceneNode>(String().sprintf("decal%u", id++).toCString());
  355. bulletDecal->setLocalTransform(trf);
  356. bulletDecal->setLocalScale(Vec3(0.1f, 0.1f, 0.3f));
  357. DecalComponent* decalc = bulletDecal->newComponent<DecalComponent>();
  358. decalc->loadDiffuseImageResource("Assets/bullet_hole_decal.ankitex", 1.0f);
  359. ANKI_CHECK(createDestructionEvent(bulletDecal));
  360. #if 0
  361. // Create some particles
  362. ParticleEmitterComponent* partc = monkey->newComponent<ParticleEmitterComponent>();
  363. partc->loadParticleEmitterResource("Assets/Smoke.ankipart");
  364. #endif
  365. // Create some fog volumes
  366. if(i == 0)
  367. {
  368. static int id = 0;
  369. String name;
  370. name.sprintf("fog%u", id++);
  371. SceneNode* fogNode = SceneGraph::getSingleton().newSceneNode<SceneNode>(name.toCString());
  372. FogDensityComponent* fogComp = fogNode->newComponent<FogDensityComponent>();
  373. fogNode->setLocalScale(Vec3(2.1f));
  374. fogComp->setDensity(15.0f);
  375. fogNode->setLocalTransform(trf);
  376. ANKI_CHECK(createDestructionEvent(fogNode));
  377. ANKI_CHECK(createFogVolumeFadeEvent(fogNode));
  378. }
  379. }
  380. }
  381. }
  382. if(0)
  383. {
  384. SceneNode& node = SceneGraph::getSingleton().findSceneNode("trigger");
  385. TriggerComponent& comp = node.getFirstComponentOfType<TriggerComponent>();
  386. for(U32 i = 0; i < comp.getSceneNodesEnter().getSize(); ++i)
  387. {
  388. // ANKI_LOGI("Touching %s", comp.getContactSceneNodes()[i]->getName().cstr());
  389. }
  390. }
  391. return Error::kNone;
  392. }
  393. ANKI_MAIN_FUNCTION(myMain)
  394. int myMain(int argc, char* argv[])
  395. {
  396. MyApp* app = new MyApp(argc, argv, "PhysicsPlayground");
  397. Error err = app->mainLoop();
  398. delete app;
  399. if(err)
  400. {
  401. ANKI_LOGE("Error reported. Bye!");
  402. }
  403. else
  404. {
  405. ANKI_LOGI("Bye!!");
  406. }
  407. return 0;
  408. }