PlayerNode.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. // Copyright (C) 2014, Panagiotis Christopoulos Charitos.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include "anki/scene/PlayerNode.h"
  6. #include "anki/scene/SceneGraph.h"
  7. #include "anki/scene/MoveComponent.h"
  8. #include "anki/scene/PlayerControllerComponent.h"
  9. #include "anki/physics/PhysicsPlayerController.h"
  10. #include "anki/physics/PhysicsWorld.h"
  11. #include "anki/input/Input.h"
  12. namespace anki {
  13. //==============================================================================
  14. // PlayerNodeFeedbackComponent =
  15. //==============================================================================
  16. /// Feedback component.
  17. class PlayerNodeFeedbackComponent final: public SceneComponent
  18. {
  19. public:
  20. PlayerNodeFeedbackComponent(SceneNode* node)
  21. : SceneComponent(SceneComponent::Type::NONE, node)
  22. {}
  23. Error update(SceneNode& node, F32, F32, Bool& updated) override
  24. {
  25. updated = false;
  26. PlayerControllerComponent& playerc =
  27. node.getComponent<PlayerControllerComponent>();
  28. const Input& in = node.getSceneGraph().getInput();
  29. const F32 ang = toRad(7.0);
  30. F32 y = in.getMousePosition().y();
  31. F32 x = in.getMousePosition().x();
  32. if(playerc.getTimestamp() == node.getGlobalTimestamp()
  33. || y != 0.0
  34. || x != 0.0)
  35. {
  36. MoveComponent& move = node.getComponent<MoveComponent>();
  37. // Set origin
  38. Vec4 origin = playerc.getTransform().getOrigin();
  39. origin.y() += 1.9;
  40. // Set rotation
  41. Mat3x4 rot(Euler(ang * y * -11.25, ang * x * -20.0, 0.0));
  42. rot = move.getLocalRotation().combineTransformations(rot);
  43. Vec3 newz = rot.getColumn(2).getNormalized();
  44. Vec3 newx = Vec3(0.0, 1.0, 0.0).cross(newz);
  45. Vec3 newy = newz.cross(newx);
  46. rot.setColumns(newx, newy, newz, Vec3(0.0));
  47. rot.reorthogonalize();
  48. // Update move
  49. move.setLocalTransform(Transform(origin, rot, 1.0));
  50. }
  51. return ErrorCode::NONE;
  52. }
  53. };
  54. //==============================================================================
  55. // PlayerNodeFeedbackComponent2 =
  56. //==============================================================================
  57. /// Feedback component.
  58. class PlayerNodeFeedbackComponent2 final: public SceneComponent
  59. {
  60. public:
  61. PlayerNodeFeedbackComponent2(SceneNode* node)
  62. : SceneComponent(SceneComponent::Type::NONE, node)
  63. {}
  64. Error update(SceneNode& node, F32, F32, Bool& updated) override
  65. {
  66. updated = false;
  67. PlayerControllerComponent& playerc =
  68. node.getComponent<PlayerControllerComponent>();
  69. MoveComponent& move = node.getComponent<MoveComponent>();
  70. const Input& in = node.getSceneGraph().getInput();
  71. const F32 speed = 3.5;
  72. Vec4 moveVec(0.0);
  73. if(in.getKey(KeyCode::W))
  74. {
  75. moveVec.z() += 1.0;
  76. }
  77. if(in.getKey(KeyCode::A))
  78. {
  79. moveVec.x() -= 1.0;
  80. }
  81. if(in.getKey(KeyCode::S))
  82. {
  83. moveVec.z() -= 1.0;
  84. }
  85. if(in.getKey(KeyCode::D))
  86. {
  87. moveVec.x() += 1.0;
  88. }
  89. Vec4 dir = move.getLocalRotation().getColumn(2).xyz0();
  90. dir.y() = 0.0;
  91. dir.normalize();
  92. playerc.setVelocity(
  93. moveVec.z() * speed,
  94. moveVec.x() * speed,
  95. 0.0,
  96. dir);
  97. return ErrorCode::NONE;
  98. }
  99. };
  100. //==============================================================================
  101. // PlayerNode =
  102. //==============================================================================
  103. //==============================================================================
  104. PlayerNode::PlayerNode(SceneGraph* scene)
  105. : SceneNode(scene)
  106. {}
  107. //==============================================================================
  108. PlayerNode::~PlayerNode()
  109. {
  110. if(m_player)
  111. {
  112. m_player->setMarkedForDeletion();
  113. }
  114. }
  115. //==============================================================================
  116. Error PlayerNode::create(const CString& name, const Vec4& position)
  117. {
  118. Error err = SceneNode::create(name);
  119. if(err)
  120. {
  121. return err;
  122. }
  123. // Create physics object
  124. PhysicsPlayerController::Initializer init;
  125. init.m_position = position;
  126. m_player = getSceneGraph()._getPhysicsWorld().newPlayerController(init);
  127. SceneComponent* comp;
  128. // Player controller component
  129. comp = getSceneAllocator().newInstance<PlayerControllerComponent>(
  130. this, m_player);
  131. if(comp == nullptr)
  132. {
  133. return ErrorCode::OUT_OF_MEMORY;
  134. }
  135. err = addComponent(comp, true);
  136. if(err)
  137. {
  138. return err;
  139. }
  140. // Feedback component
  141. comp = getSceneAllocator().newInstance<PlayerNodeFeedbackComponent>(this);
  142. if(comp == nullptr)
  143. {
  144. return ErrorCode::OUT_OF_MEMORY;
  145. }
  146. err = addComponent(comp, true);
  147. if(err)
  148. {
  149. return err;
  150. }
  151. // Move component
  152. comp = getSceneAllocator().newInstance<MoveComponent>(this);
  153. if(comp == nullptr)
  154. {
  155. return ErrorCode::OUT_OF_MEMORY;
  156. }
  157. err = addComponent(comp, true);
  158. if(err)
  159. {
  160. return err;
  161. }
  162. // Feedback component #2
  163. comp = getSceneAllocator().newInstance<PlayerNodeFeedbackComponent2>(this);
  164. if(comp == nullptr)
  165. {
  166. return ErrorCode::OUT_OF_MEMORY;
  167. }
  168. err = addComponent(comp, true);
  169. if(err)
  170. {
  171. return err;
  172. }
  173. return err;
  174. }
  175. } // end namespace anki