Main.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. // Copyright (C) 2009-2018, 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 "../common/Framework.h"
  7. using namespace anki;
  8. class MyApp : public SampleApp
  9. {
  10. public:
  11. Error sampleExtraInit() override;
  12. Error userMainLoop(Bool& quit) override;
  13. };
  14. Error MyApp::sampleExtraInit()
  15. {
  16. ScriptResourcePtr script;
  17. ANKI_CHECK(getResourceManager().loadResource("assets/scene.lua", script));
  18. ANKI_CHECK(getScriptManager().evalString(script->getSource()));
  19. // Create the player
  20. if(0)
  21. {
  22. SceneNode& cam = getSceneGraph().getActiveCameraNode();
  23. cam.getComponent<MoveComponent>().setLocalTransform(
  24. Transform(Vec4(0.0, 0.0, 5.0, 0.0), Mat3x4::getIdentity(), 1.0));
  25. PlayerNode* player;
  26. ANKI_CHECK(getSceneGraph().newSceneNode("player", player, Vec4(0.0f, 2.5f, 0.0f, 0.0f)));
  27. player->addChild(&cam);
  28. }
  29. // Create a body component with joint
  30. {
  31. ModelNode* monkey;
  32. ANKI_CHECK(
  33. getSceneGraph().newSceneNode<ModelNode>("monkey_p2p", monkey, "assets/SuzanneMaterial-material.ankimdl"));
  34. BodyNode* body;
  35. ANKI_CHECK(getSceneGraph().newSceneNode<BodyNode>("bmonkey_p2p", body, "assets/Suzanne.ankicl"));
  36. body->getComponent<BodyComponent>().setTransform(
  37. Transform(Vec4(-0.0f, 4.0f, -3.0f, 0.0f), Mat3x4::getIdentity(), 1.0f));
  38. body->addChild(monkey);
  39. body->getComponent<JointComponent>().newHingeJoint(Vec3(0.2f, 1.0f, 0.0f), Vec3(1, 0, 0));
  40. }
  41. // Create a chain
  42. {
  43. const U LINKS = 5;
  44. BodyNode* prevBody = nullptr;
  45. for(U i = 0; i < LINKS; ++i)
  46. {
  47. ModelNode* monkey;
  48. ANKI_CHECK(getSceneGraph().newSceneNode<ModelNode>(
  49. StringAuto(getAllocator()).sprintf("monkey_chain%u", i).toCString(),
  50. monkey,
  51. "assets/SuzanneMaterial-material.ankimdl"));
  52. Transform trf(Vec4(-4.3f, 12.0f, -3.0f, 0.0f), Mat3x4::getIdentity(), 1.0f);
  53. trf.getOrigin().y() -= i * 1.25f;
  54. // trf.getOrigin().x() -= i * 0.25f;
  55. // monkey->getComponent<MoveComponent>().setLocalTransform(trf);
  56. BodyNode* body;
  57. ANKI_CHECK(getSceneGraph().newSceneNode<BodyNode>(
  58. StringAuto(getAllocator()).sprintf("bmonkey_chain%u", i).toCString(), body, "assets/Suzanne.ankicl"));
  59. body->getComponent<BodyComponent>().setTransform(trf);
  60. // Create joint
  61. JointComponent& jointc = body->getComponent<JointComponent>();
  62. if(prevBody == nullptr)
  63. {
  64. jointc.newPoint2PointJoint(Vec3(0, 1, 0));
  65. }
  66. else
  67. {
  68. prevBody->addChild(body);
  69. jointc.newPoint2PointJoint2(Vec3(0, 1.0, 0), Vec3(0, -1.0, 0));
  70. }
  71. body->addChild(monkey);
  72. prevBody = body;
  73. }
  74. }
  75. return Error::NONE;
  76. }
  77. Error MyApp::userMainLoop(Bool& quit)
  78. {
  79. ANKI_CHECK(SampleApp::userMainLoop(quit));
  80. if(getInput().getKey(KeyCode::ESCAPE))
  81. {
  82. quit = true;
  83. }
  84. if(getInput().getKey(KeyCode::F1) == 1)
  85. {
  86. static U mode = 0;
  87. mode = (mode + 1) % 3;
  88. if(mode == 0)
  89. {
  90. getMainRenderer().getDbg().setEnabled(false);
  91. }
  92. else if(mode == 1)
  93. {
  94. getMainRenderer().getDbg().setEnabled(true);
  95. getMainRenderer().getDbg().setDepthTestEnabled(true);
  96. getMainRenderer().getDbg().setDitheredDepthTestEnabled(false);
  97. }
  98. else
  99. {
  100. getMainRenderer().getDbg().setEnabled(true);
  101. getMainRenderer().getDbg().setDepthTestEnabled(false);
  102. getMainRenderer().getDbg().setDitheredDepthTestEnabled(true);
  103. }
  104. }
  105. if(getInput().getKey(KeyCode::R))
  106. {
  107. SceneNode& player = getSceneGraph().findSceneNode("player");
  108. player.getComponent<PlayerControllerComponent>().moveToPosition(Vec4(0.0f, 2.0f, 0.0f, 0.0f));
  109. }
  110. if(getInput().getMouseButton(MouseButton::LEFT) == 1)
  111. {
  112. ANKI_LOGI("Firing a monkey");
  113. static U instance = 0;
  114. Transform camTrf = getSceneGraph().getActiveCameraNode().getComponent<MoveComponent>().getWorldTransform();
  115. ModelNode* monkey;
  116. ANKI_CHECK(getSceneGraph().newSceneNode<ModelNode>(
  117. StringAuto(getAllocator()).sprintf("monkey%u", instance++).toCString(),
  118. monkey,
  119. "assets/SuzanneMaterial-material.ankimdl"));
  120. // monkey->getComponent<MoveComponent>().setLocalTransform(camTrf);
  121. BodyNode* body;
  122. ANKI_CHECK(getSceneGraph().newSceneNode<BodyNode>(
  123. StringAuto(getAllocator()).sprintf("bmonkey%u", instance++).toCString(), body, "assets/Suzanne.ankicl"));
  124. body->getComponent<BodyComponent>().setTransform(camTrf);
  125. PhysicsBodyPtr pbody = body->getComponent<BodyComponent>().getPhysicsBody();
  126. pbody->applyForce(camTrf.getRotation().getZAxis().xyz() * -1500.0f, Vec3(0.0f, 0.0f, 0.0f));
  127. body->addChild(monkey);
  128. }
  129. return Error::NONE;
  130. }
  131. int main(int argc, char* argv[])
  132. {
  133. Error err = Error::NONE;
  134. MyApp* app = new MyApp;
  135. err = app->init(argc, argv, argv[0]);
  136. if(!err)
  137. {
  138. err = app->mainLoop();
  139. }
  140. if(err)
  141. {
  142. ANKI_LOGE("Error reported. Bye!");
  143. }
  144. else
  145. {
  146. delete app;
  147. ANKI_LOGI("Bye!!");
  148. }
  149. return 0;
  150. }