Browse Source

Player controller work in scene

Panagiotis Christopoulos Charitos 11 years ago
parent
commit
ff2346e689

+ 7 - 1
include/anki/scene/PlayerControllerComponent.h

@@ -7,7 +7,7 @@
 #define ANKI_SCENE_PLAYER_CONTROLLER_COMPONENT_H
 #define ANKI_SCENE_PLAYER_CONTROLLER_COMPONENT_H
 
 
 #include "anki/scene/SceneComponent.h"
 #include "anki/scene/SceneComponent.h"
-#include "anki/physics/PlayerControllerComponent.h"
+#include "anki/physics/PhysicsPlayerController.h"
 
 
 namespace anki {
 namespace anki {
 
 
@@ -33,6 +33,12 @@ public:
 		m_player->moveToPosition(trf.getOrigin());
 		m_player->moveToPosition(trf.getOrigin());
 	}
 	}
 
 
+	void setVelocity(F32 forwardSpeed, F32 strafeSpeed, F32 jumpSpeed, 
+		const Vec4& forwardDir)
+	{
+		m_player->setVelocity(forwardSpeed, strafeSpeed, jumpSpeed, forwardDir);
+	}
+
 	/// @name SceneComponent overrides
 	/// @name SceneComponent overrides
 	/// @{
 	/// @{
 	ANKI_USE_RESULT Error update(SceneNode&, F32, F32, Bool& updated) override
 	ANKI_USE_RESULT Error update(SceneNode&, F32, F32, Bool& updated) override

+ 2 - 1
src/physics/PhysicsPlayerController.cpp

@@ -223,7 +223,8 @@ Error PhysicsPlayerController::create(const Initializer& init)
 
 
 	// Create the kinematic body
 	// Create the kinematic body
 	Mat4 locationMatrix(Mat4::getIdentity());
 	Mat4 locationMatrix(Mat4::getIdentity());
-	m_body = NewtonCreateKinematicBody(world, playerShape, &locationMatrix[0]);
+	m_body = NewtonCreateKinematicBody(world, playerShape, 
+		&toNewton(locationMatrix)[0]);
 	if(m_body == nullptr)
 	if(m_body == nullptr)
 	{
 	{
 		ANKI_LOGE("NewtonCreateKinematicBody() failed");
 		ANKI_LOGE("NewtonCreateKinematicBody() failed");

+ 84 - 14
src/scene/PlayerNode.cpp

@@ -6,6 +6,7 @@
 #include "anki/scene/PlayerNode.h"
 #include "anki/scene/PlayerNode.h"
 #include "anki/scene/SceneGraph.h"
 #include "anki/scene/SceneGraph.h"
 #include "anki/scene/MoveComponent.h"
 #include "anki/scene/MoveComponent.h"
+#include "anki/scene/PlayerControllerComponent.h"
 #include "anki/physics/PhysicsPlayerController.h"
 #include "anki/physics/PhysicsPlayerController.h"
 #include "anki/physics/PhysicsWorld.h"
 #include "anki/physics/PhysicsWorld.h"
 #include "anki/input/Input.h"
 #include "anki/input/Input.h"
@@ -26,33 +27,59 @@ public:
 
 
 	Error update(SceneNode& node, F32, F32, Bool& updated) override
 	Error update(SceneNode& node, F32, F32, Bool& updated) override
 	{
 	{
-		PlayerNode& pnode = static_cast<PlayerNode&>(node);
+		updated = false;
+
+		PlayerControllerComponent& playerc = 
+			node.getComponent<PlayerControllerComponent>();
 
 
 		// Process physics move
 		// Process physics move
-		const Transform& trf = pnode.m_player->getTransform(updated);
-		if(updated)
+		if(playerc.getTimestamp() == getGlobTimestamp())
 		{
 		{
 			MoveComponent& move = node.getComponent<MoveComponent>();
 			MoveComponent& move = node.getComponent<MoveComponent>();
-			move.setLocalTransform(trf);
+			move.setLocalTransform(playerc.getTransform());
 		}
 		}
 
 
+		return ErrorCode::NONE;
+	}
+};
+
+//==============================================================================
+// PlayerNodeFeedbackComponent2                                                =
+//==============================================================================
+
+/// Feedback component.
+class PlayerNodeFeedbackComponent2 final: public SceneComponent
+{
+public:
+	PlayerNodeFeedbackComponent2(SceneNode* node)
+	:	SceneComponent(SceneComponent::Type::NONE, node)
+	{}
+
+	Error update(SceneNode& node, F32, F32, Bool& updated) override
+	{
+		updated = false;
+
+		PlayerControllerComponent& playerc = 
+			node.getComponent<PlayerControllerComponent>();
+		MoveComponent& move = node.getComponent<MoveComponent>();
+
 		// Process input
 		// Process input
 		const Input& in = node.getSceneGraph().getInput();
 		const Input& in = node.getSceneGraph().getInput();
 		Vec4 moveVec(0.0);
 		Vec4 moveVec(0.0);
 
 
 		if(in.getKey(KeyCode::W))
 		if(in.getKey(KeyCode::W))
 		{
 		{
-			moveVec.z() += -1.0;
+			moveVec.z() += 1.0;
 		}
 		}
 
 
 		if(in.getKey(KeyCode::A))
 		if(in.getKey(KeyCode::A))
 		{
 		{
-			moveVec.x() += -1.0;
+			moveVec.x() -= 1.0;
 		}
 		}
 
 
 		if(in.getKey(KeyCode::S))
 		if(in.getKey(KeyCode::S))
 		{
 		{
-			moveVec.z() += 1.0;
+			moveVec.z() -= 1.0;
 		}
 		}
 
 
 		if(in.getKey(KeyCode::D))
 		if(in.getKey(KeyCode::D))
@@ -60,16 +87,32 @@ public:
 			moveVec.x() += 1.0;
 			moveVec.x() += 1.0;
 		}
 		}
 
 
-		//if(moveVec != Vec4(0.0))
+		const Transform& trf = playerc.getTransform();
+		Vec4 dir = trf.getRotation().getColumn(2).xyz0();
+
+		if(in.getKey(KeyCode::LEFT))
 		{
 		{
-			const F32 speed = 2.0;
-			pnode.m_player->setVelocity(
-				moveVec.x() * speed, 
-				moveVec.z() * speed,
-				0.0, 
-				Vec4(0.0, 0.0, -1.0, 0.0));
+			Mat3x4 rot = trf.getRotation();
+			rot.rotateYAxis(toRad(10.0));
+
+			dir = rot.getColumn(2).xyz0();
 		}
 		}
 
 
+		if(in.getKey(KeyCode::RIGHT))
+		{
+			Mat3x4 rot = trf.getRotation();
+			rot.rotateYAxis(toRad(-10.0));
+
+			dir = rot.getColumn(2).xyz0();
+		}
+
+		const F32 speed = 2.0;
+		playerc.setVelocity(
+			moveVec.z() * speed, 
+			moveVec.x() * speed,
+			0.0, 
+			dir);
+
 		return ErrorCode::NONE;
 		return ErrorCode::NONE;
 	}
 	}
 };
 };
@@ -107,6 +150,20 @@ Error PlayerNode::create(const CString& name)
 
 
 	SceneComponent* comp;
 	SceneComponent* comp;
 
 
+	// Player controller component
+	comp = getSceneAllocator().newInstance<PlayerControllerComponent>(
+		this, m_player);
+	if(comp == nullptr)
+	{
+		return ErrorCode::OUT_OF_MEMORY; 
+	}
+
+	err = addComponent(comp, true);
+	if(err)
+	{
+		return err;
+	}
+
 	// Feedback component
 	// Feedback component
 	comp = getSceneAllocator().newInstance<PlayerNodeFeedbackComponent>(this);
 	comp = getSceneAllocator().newInstance<PlayerNodeFeedbackComponent>(this);
 	if(comp == nullptr)
 	if(comp == nullptr)
@@ -133,6 +190,19 @@ Error PlayerNode::create(const CString& name)
 		return err;
 		return err;
 	}
 	}
 
 
+	// Feedback component #2
+	comp = getSceneAllocator().newInstance<PlayerNodeFeedbackComponent2>(this);
+	if(comp == nullptr)
+	{
+		return ErrorCode::OUT_OF_MEMORY; 
+	}
+
+	err = addComponent(comp, true);
+	if(err)
+	{
+		return err;
+	}
+
 	return err;
 	return err;
 }
 }
 
 

+ 11 - 5
testapp/Main.cpp

@@ -71,8 +71,8 @@ Error init()
 		renderer.getAspectRatio() * toRad(ang),
 		renderer.getAspectRatio() * toRad(ang),
 		toRad(ang), 0.5, 500.0);
 		toRad(ang), 0.5, 500.0);
 	cam->getComponent<MoveComponent>().
 	cam->getComponent<MoveComponent>().
-		setLocalTransform(Transform(Vec4(17.0, 5.2, 0.0, 0),
-		Mat3x4(Euler(toRad(-10.0), toRad(90.0), toRad(0.0))),
+		setLocalTransform(Transform(Vec4(0.0, 3.0, -6.0, 0.0),
+		Mat3x4(Euler(toRad(-20.0), toRad(180.0), toRad(0.0))),
 		1.0));
 		1.0));
 	scene.setActiveCamera(cam);
 	scene.setActiveCamera(cam);
 
 
@@ -251,7 +251,7 @@ Error init()
 		move->setLocalOrigin(Vec4(0.0, 1.4, 0.6, 0.0));
 		move->setLocalOrigin(Vec4(0.0, 1.4, 0.6, 0.0));
 	}
 	}
 
 
-#if 0
+#if 1
 	{
 	{
 		ScriptResourcePointer script;
 		ScriptResourcePointer script;
 
 
@@ -271,6 +271,8 @@ Error init()
 	PlayerNode* pnode;
 	PlayerNode* pnode;
 	scene.newSceneNode<PlayerNode>("player", pnode);
 	scene.newSceneNode<PlayerNode>("player", pnode);
 
 
+	pnode->addChild(cam);
+
 	PhysicsCollisionShape::Initializer initc;
 	PhysicsCollisionShape::Initializer initc;
 	auto box = 
 	auto box = 
 		scene._getPhysicsWorld().newCollisionShape<PhysicsBox>(
 		scene._getPhysicsWorld().newCollisionShape<PhysicsBox>(
@@ -415,7 +417,7 @@ Error mainLoopExtra(App& app, void*, Bool& quit)
 
 
 	if(in.getKey(KeyCode::L) == 1)
 	if(in.getKey(KeyCode::L) == 1)
 	{
 	{
-		SceneNode& l = scene.findSceneNode("horse");
+		/*SceneNode& l = scene.findSceneNode("horse");
 		
 		
 		BodyComponent* bodyc = l.tryGetComponent<BodyComponent>();
 		BodyComponent* bodyc = l.tryGetComponent<BodyComponent>();
 		if(bodyc)
 		if(bodyc)
@@ -424,7 +426,9 @@ Error mainLoopExtra(App& app, void*, Bool& quit)
 
 
 			bodyc->setTransform(
 			bodyc->setTransform(
 				Transform(pos, Mat3x4::getIdentity(), 1.0));
 				Transform(pos, Mat3x4::getIdentity(), 1.0));
-		}
+		}*/
+
+		SceneNode& l = scene.findSceneNode("player");
 	}
 	}
 
 
 	if(in.getKey(KeyCode::F1) == 1)
 	if(in.getKey(KeyCode::F1) == 1)
@@ -456,6 +460,7 @@ Error mainLoopExtra(App& app, void*, Bool& quit)
 		renderer.takeScreenshot("screenshot.tga");
 		renderer.takeScreenshot("screenshot.tga");
 	}
 	}
 
 
+#if 0
 	if(in.getKey(KeyCode::UP)) mover->rotateLocalX(ang);
 	if(in.getKey(KeyCode::UP)) mover->rotateLocalX(ang);
 	if(in.getKey(KeyCode::DOWN)) mover->rotateLocalX(-ang);
 	if(in.getKey(KeyCode::DOWN)) mover->rotateLocalX(-ang);
 	if(in.getKey(KeyCode::LEFT)) mover->rotateLocalY(ang);
 	if(in.getKey(KeyCode::LEFT)) mover->rotateLocalY(ang);
@@ -480,6 +485,7 @@ Error mainLoopExtra(App& app, void*, Bool& quit)
 	{
 	{
 		mover->scale(-scale);
 		mover->scale(-scale);
 	}
 	}
+#endif
 #if 0
 #if 0
 	if(in.getKey(KeyCode::P) == 1)
 	if(in.getKey(KeyCode::P) == 1)
 	{
 	{