fixed incorrect camera ratio, added coumpound shape for sword throwing

This commit is contained in:
Anselme 2016-12-18 14:38:31 +01:00
parent 4d5c352f4c
commit 9c62efeb67
4 changed files with 64 additions and 10 deletions

View File

@ -34,7 +34,7 @@ class GibGeneratorNode : public ContainerNode
public: public:
void createGib(GraphicalNode* graphicalPart, void createGib(GraphicalNode* graphicalPart,
btCollisionShape *physicsShape, btCollisionShape *physicsShape,
float mass, float masses,
const glm::vec3 &pos = glm::vec3(0), const glm::vec3 &pos = glm::vec3(0),
const glm::vec3 &velocity = glm::vec3(0), const glm::vec3 &velocity = glm::vec3(0),
unsigned int lifeSpan = 5000); unsigned int lifeSpan = 5000);

View File

@ -3,6 +3,7 @@
#include <pipeline.h> #include <pipeline.h>
#include <deferredpipeline.h> #include <deferredpipeline.h>
#include <algorithm> #include <algorithm>
#include <SFML/Window.hpp>
// Scene // Scene
#include <mesh.h> #include <mesh.h>
#include <iostream> #include <iostream>
@ -28,6 +29,8 @@ SceneTree::~SceneTree()
void SceneTree::setMainCamera(CameraNode *camNode) void SceneTree::setMainCamera(CameraNode *camNode)
{ {
((DeferredPipeline*)m_pipeline)->setCamera(camNode->getCamera()); ((DeferredPipeline*)m_pipeline)->setCamera(camNode->getCamera());
sf::Vector2u size = getEngine().getWindow()->getSize();
camNode->getCamera()->resize(size.x, size.y);
} }
SceneIterator<Light*>* SceneTree::getLights() SceneIterator<Light*>* SceneTree::getLights()

View File

@ -8,15 +8,18 @@
#include "scene/meshnode.h" #include "scene/meshnode.h"
#include "tools/loader.h" #include "tools/loader.h"
#include "texture.h" #include "texture.h"
#include "scene/graphicalcontainernode.h"
#define PHYSICS_OFFSET 0.05f #define PHYSICS_OFFSET 0.01f
Potator::Potator(PlayerCharacterNode * player, Potator::Potator(PlayerCharacterNode * player,
int cube_action, int cube_action,
int sphere_action) : int sphere_action,
int object_action) :
m_player(player), m_player(player),
m_throwCubeAction(cube_action), m_throwCubeAction(cube_action),
m_throwSphereAction(sphere_action) m_throwSphereAction(sphere_action),
m_throwObjectAction(object_action)
{ {
glm::vec3 cubeDim(1); glm::vec3 cubeDim(1);
float sphereRadius = 0.5f; float sphereRadius = 0.5f;
@ -63,7 +66,10 @@ Potator::Potator(PlayerCharacterNode * player,
m_cubeMesh->addTriangle(id+7, id+5, id+6); m_cubeMesh->addTriangle(id+7, id+5, id+6);
} }
Image* wood = Loader::loadImage("../data/woodbox.jpg", false); Loader::setObjDirectory("../data/");
Loader::setMtlDirectory("../data/");
Loader::setTexDirectory("../data/");
Image* wood = Loader::loadImage("woodbox.jpg", false);
PhongMaterial *mat = new PhongMaterial(); PhongMaterial *mat = new PhongMaterial();
mat->setTexture(PhongMaterial::DIFFUSE_SLOT, new Texture(wood), "wood_texture"); mat->setTexture(PhongMaterial::DIFFUSE_SLOT, new Texture(wood), "wood_texture");
mat->specular = glm::vec3(0.3f); mat->specular = glm::vec3(0.3f);
@ -96,6 +102,23 @@ Potator::Potator(PlayerCharacterNode * player,
float sphereVolume = 4.18879020479f*(sphereRadius*sphereRadius*sphereRadius); // (4*pi)/3 = 4.18879020479 float sphereVolume = 4.18879020479f*(sphereRadius*sphereRadius*sphereRadius); // (4*pi)/3 = 4.18879020479
m_sphereMass = sphereVolume*density; m_sphereMass = sphereVolume*density;
// creating sword :
m_swordMeshes = Loader::loadMesh("sword.obj");
for(Mesh* m : m_swordMeshes)
m->initGL();
btCompoundShape* swordShape = new btCompoundShape();
btVector3 guardBox = btVector3(0.03+PHYSICS_OFFSET, 0.04+PHYSICS_OFFSET, 0.25+PHYSICS_OFFSET);
swordShape->addChildShape(btTransform::getIdentity(), new btBoxShape(guardBox));
btTransform bladeTransform = btTransform::getIdentity();
bladeTransform.setOrigin(btVector3(0.f, 0.486705f, 0.f));
swordShape->addChildShape(bladeTransform, new btConeShape(0.07+PHYSICS_OFFSET, 2.15+PHYSICS_OFFSET));
m_swordShape = swordShape;
m_swordMass = 0.5f;
} }
void Potator::throwCube() void Potator::throwCube()
@ -107,9 +130,9 @@ void Potator::throwCube()
dir = m_player->getDirection(); dir = m_player->getDirection();
pos = m_player->getEyePosition() + dir*2.f; pos = m_player->getEyePosition() + dir*2.f;
} }
float throwForce = 20.f; float throwForce = 10.f;
createGib(new MeshNode(m_cubeMesh), m_cubeShape, m_cubeMass, pos, dir*throwForce, 10000); createGib(new MeshNode(m_cubeMesh), m_cubeShape, m_cubeMass, pos, dir*throwForce, 30000);
} }
void Potator::throwSphere() void Potator::throwSphere()
@ -121,9 +144,26 @@ void Potator::throwSphere()
dir = m_player->getDirection(); dir = m_player->getDirection();
pos = m_player->getEyePosition() + dir*2.f; pos = m_player->getEyePosition() + dir*2.f;
} }
float throwForce = 20.f; float throwForce = 10.f;
createGib(new MeshNode(m_sphereMesh), m_sphereShape, m_sphereMass, pos, dir*throwForce, 10000); createGib(new MeshNode(m_sphereMesh), m_sphereShape, m_sphereMass, pos, dir*throwForce, 30000);
}
void Potator::throwSword()
{
glm::vec3 pos(0, 10, 0);
glm::vec3 dir(0, 1, 0);
if(m_player != nullptr)
{
dir = m_player->getDirection();
pos = m_player->getEyePosition() + dir*2.f;
}
float throwForce = 10.f;
GraphicalContainerNode *node = new GraphicalContainerNode();
for(Mesh * m : m_swordMeshes)
node->addChild(new MeshNode(m));
createGib(node, m_swordShape, m_swordMass, pos, dir*throwForce, 300000);
} }
void Potator::update() void Potator::update()
@ -136,5 +176,7 @@ void Potator::update()
throwCube(); throwCube();
else if(action == m_throwSphereAction) else if(action == m_throwSphereAction)
throwSphere(); throwSphere();
else if(action == m_throwObjectAction)
throwSword();
} }
} }

View File

@ -12,26 +12,35 @@ class Potator : public GibGeneratorNode
PlayerCharacterNode *m_player; PlayerCharacterNode *m_player;
int m_throwCubeAction; int m_throwCubeAction;
int m_throwSphereAction; int m_throwSphereAction;
int m_throwObjectAction;
Mesh* m_cubeMesh; Mesh* m_cubeMesh;
btCollisionShape* m_cubeShape; btCollisionShape* m_cubeShape;
float m_cubeMass; float m_cubeMass;
Mesh* m_sphereMesh; Mesh* m_sphereMesh;
btCollisionShape* m_sphereShape; btCollisionShape* m_sphereShape;
float m_sphereMass; float m_sphereMass;
std::vector<Mesh*> m_swordMeshes;
btCollisionShape* m_swordShape;
float m_swordMass;
void throwCube(); void throwCube();
void throwSphere(); void throwSphere();
void throwSword();
public: public:
Potator(PlayerCharacterNode * player = nullptr, Potator(PlayerCharacterNode * player = nullptr,
int cube_action = NO_ACTION, int cube_action = NO_ACTION,
int sphere_action = NO_ACTION); int sphere_action = NO_ACTION,
int object_action = NO_ACTION);
void setPlayer(PlayerCharacterNode *player) { m_player = player; } void setPlayer(PlayerCharacterNode *player) { m_player = player; }
void setCubeThrowingAction(int action) { m_throwCubeAction = action; } void setCubeThrowingAction(int action) { m_throwCubeAction = action; }
void setSphereThrowingAction(int action) { m_throwSphereAction = action; } void setSphereThrowingAction(int action) { m_throwSphereAction = action; }
void setObjectThrowingAction(int action) { m_throwObjectAction = action; }
virtual void update(); virtual void update();
}; };