#include "potator.h" #include "scene/playercharacternode.h" #include #include #include "scene/scenetree.h" #include "SparrowRenderer/parametricmesh.h" #include "SparrowRenderer/phongmaterial.h" #include "scene/meshnode.h" #include "tools/loader.h" #include "SparrowRenderer/texture.h" #include "scene/graphicalcontainernode.h" #define PHYSICS_OFFSET 0.01f Potator::Potator(PlayerCharacterNode * player, int cube_action, int sphere_action, int object_action) : m_player(player), m_throwCubeAction(cube_action), m_throwSphereAction(sphere_action), m_throwObjectAction(object_action) { glm::vec3 cubeDim(1); float sphereRadius = 0.5f; glm::vec3 s = cubeDim*0.5f; float density = 1.f; // creating cube m_cubeMesh = new Mesh(); m_cubeMesh->addVertex(glm::vec3(-1*s.x, -1*s.y, 1*s.z),glm::vec3(0, 0, 1),glm::vec2(0, 0)); m_cubeMesh->addVertex(glm::vec3(-1*s.x, 1*s.y, 1*s.z),glm::vec3(0, 0, 1),glm::vec2(0, 1)); m_cubeMesh->addVertex(glm::vec3( 1*s.x, -1*s.y, 1*s.z),glm::vec3(0, 0, 1),glm::vec2(1, 0)); m_cubeMesh->addVertex(glm::vec3( 1*s.x, 1*s.y, 1*s.z),glm::vec3(0, 0, 1),glm::vec2(1, 1)); m_cubeMesh->addVertex(glm::vec3(-1*s.x, -1*s.y, -1*s.z),glm::vec3(0, 0, -1),glm::vec2(1, 0)); m_cubeMesh->addVertex(glm::vec3(-1*s.x, 1*s.y, -1*s.z),glm::vec3(0, 0, -1),glm::vec2(1, 1)); m_cubeMesh->addVertex(glm::vec3( 1*s.x, -1*s.y, -1*s.z),glm::vec3(0, 0, -1),glm::vec2(0, 0)); m_cubeMesh->addVertex(glm::vec3( 1*s.x, 1*s.y, -1*s.z),glm::vec3(0, 0, -1),glm::vec2(0, 1)); m_cubeMesh->addVertex(glm::vec3(-1*s.x, 1*s.y, -1*s.z),glm::vec3(0, 1, 0),glm::vec2(0, 0)); m_cubeMesh->addVertex(glm::vec3(-1*s.x, 1*s.y, 1*s.z),glm::vec3(0, 1, 0),glm::vec2(0, 1)); m_cubeMesh->addVertex(glm::vec3( 1*s.x, 1*s.y, -1*s.z),glm::vec3(0, 1, 0),glm::vec2(1, 0)); m_cubeMesh->addVertex(glm::vec3( 1*s.x, 1*s.y, 1*s.z),glm::vec3(0, 1, 0),glm::vec2(1, 1)); m_cubeMesh->addVertex(glm::vec3(-1*s.x, -1*s.y, -1*s.z),glm::vec3(0, -1, 0),glm::vec2(1, 0)); m_cubeMesh->addVertex(glm::vec3(-1*s.x, -1*s.y, 1*s.z),glm::vec3(0, -1, 0),glm::vec2(1, 1)); m_cubeMesh->addVertex(glm::vec3( 1*s.x, -1*s.y, -1*s.z),glm::vec3(0, -1, 0),glm::vec2(0, 0)); m_cubeMesh->addVertex(glm::vec3( 1*s.x, -1*s.y, 1*s.z),glm::vec3(0, -1, 0),glm::vec2(0, 1)); m_cubeMesh->addVertex(glm::vec3( 1*s.x, -1*s.y, 1*s.z),glm::vec3( 1, 0, 0),glm::vec2(0, 0)); m_cubeMesh->addVertex(glm::vec3( 1*s.x, 1*s.y, 1*s.z),glm::vec3( 1, 0, 0),glm::vec2(0, 1)); m_cubeMesh->addVertex(glm::vec3( 1*s.x, -1*s.y, -1*s.z),glm::vec3( 1, 0, 0),glm::vec2(1, 0)); m_cubeMesh->addVertex(glm::vec3( 1*s.x, 1*s.y, -1*s.z),glm::vec3( 1, 0, 0),glm::vec2(1, 1)); m_cubeMesh->addVertex(glm::vec3(-1*s.x, -1*s.y, 1*s.z),glm::vec3(-1, 0, 0),glm::vec2(1, 0)); m_cubeMesh->addVertex(glm::vec3(-1*s.x, 1*s.y, 1*s.z),glm::vec3(-1, 0, 0),glm::vec2(1, 1)); m_cubeMesh->addVertex(glm::vec3(-1*s.x, -1*s.y, -1*s.z),glm::vec3(-1, 0, 0),glm::vec2(0, 0)); m_cubeMesh->addVertex(glm::vec3(-1*s.x, 1*s.y, -1*s.z),glm::vec3(-1, 0, 0),glm::vec2(0, 1)); for(int id=0; id<24; id+=8) { m_cubeMesh->addTriangle(id+0, id+1, id+2); m_cubeMesh->addTriangle(id+2, id+1, id+3); m_cubeMesh->addTriangle(id+6, id+5, id+4); m_cubeMesh->addTriangle(id+7, id+5, id+6); } Image* wood = Loader::loadImage("woodbox.jpg", false); PhongMaterial *mat = new PhongMaterial(); mat->setTexture(PhongMaterial::DIFFUSE_SLOT, new Texture(wood), "wood_texture"); mat->specular = glm::vec3(0.3f); mat->shininess = 5.f; mat->emission = glm::vec3(0.0f); m_cubeMesh->setMaterial(mat); m_cubeMesh->initGL(); btVector3 halfExtents(s.x+PHYSICS_OFFSET, s.y+PHYSICS_OFFSET, s.z+PHYSICS_OFFSET); m_cubeShape = new btBoxShape(halfExtents); m_cubeMass = cubeDim.x*cubeDim.y*cubeDim.z*density; // creating sphere mat = new PhongMaterial(); mat->diffuse = glm::vec3(0.1f); mat->specular = glm::vec3(0.9f); mat->shininess = 150.f; mat->emission = glm::vec3(0.0f); SphereGenerator sphereGen; m_sphereMesh = sphereGen.generateGeodesicMesh(mat, 2, sphereRadius); m_sphereMesh->computeNormals(); m_sphereMesh->mergeVertices(); m_sphereMesh->initGL(); m_sphereShape = new btSphereShape(sphereRadius+PHYSICS_OFFSET); float sphereVolume = 4.18879020479f*(sphereRadius*sphereRadius*sphereRadius); // (4*pi)/3 = 4.18879020479 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() { 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 = 5.f; createGib(new MeshNode(m_cubeMesh), m_cubeShape, m_cubeMass, pos, dir*throwForce, 30000); } void Potator::throwSphere() { 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 = 5.f; 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 = 5.f; GraphicalContainerNode *node = new GraphicalContainerNode(); for(Mesh * m : m_swordMeshes) node->addChild(new MeshNode(m)); createGib(node, m_swordShape, m_swordMass, pos, dir*throwForce, 30000); } void Potator::update() { GibGeneratorNode::update(); Input *input = getEngine().getInput(); for(Action action : input->getActions()) { if(action.action == m_throwCubeAction) throwCube(); else if(action.action == m_throwSphereAction) throwSphere(); else if(action.action == m_throwObjectAction) throwSword(); } }