u32 wsScene::addPrimitive(wsPrimitive* myPrimitive) {
  wsAssert(numPrimitives < WS_MAX_PRIMITIVES, "Cannot add another primitive to the scene. Maximum already reached.");
  primitives[numPrimitives] = myPrimitive;
  #if WS_PHYSICS_BACKEND == WS_BACKEND_BULLET
    switch (myPrimitive->getType()) {
      case WS_PRIM_TYPE_PLANE:
        {
          wsPlane* plane = (wsPlane*)myPrimitive;
          vec4 data = plane->getPosData();
          btCollisionShape* planeShape = wsNew(btStaticPlaneShape, btStaticPlaneShape(btVector3(data.x, data.y, data.z), data.w));
          btDefaultMotionState* planeState = wsNew(btDefaultMotionState, btDefaultMotionState(btTransform(btQuaternion(0.0f, 0.0f, 0.0f, 1.0f), btVector3(0.0f, 0.0f, 0.0f))));
          btRigidBody::btRigidBodyConstructionInfo planeRigidBodyCI(0, planeState, planeShape, btVector3(0,0,0));
          btRigidBody* groundRigidBody = wsNew(btRigidBody, btRigidBody(planeRigidBodyCI));
          physicsWorld->addRigidBody(groundRigidBody, myPrimitive->getCollisionClass(),
            collisionClasses[(u32)wsLog2(myPrimitive->getCollisionClass())]);
        }
        break;
      case WS_PRIM_TYPE_CUBE:
        {
          wsCube* cube = (wsCube*)myPrimitive;
          vec4 dimensions = cube->getDimensions();
          vec4 pos = cube->getPos();
          quat rot = cube->getRot();
          btCollisionShape* cubeShape = wsNew(btBoxShape, btBoxShape(btVector3(dimensions.x/2.0f, dimensions.y/2.0f, dimensions.z/2.0f)));
          btDefaultMotionState* cubeState = wsNew(btDefaultMotionState, btDefaultMotionState(btTransform(btQuaternion(rot.x, rot.y, rot.z, rot.w), btVector3(pos.x, pos.y, pos.z))));
          btRigidBody::btRigidBodyConstructionInfo cubeRigidBodyCI(0, cubeState, cubeShape, btVector3(0, 0, 0));
          btRigidBody* cubeRigidBody = wsNew(btRigidBody, btRigidBody(cubeRigidBodyCI));
          physicsWorld->addRigidBody(cubeRigidBody, myPrimitive->getCollisionClass(),
            collisionClasses[(u32)wsLog2(myPrimitive->getCollisionClass())]);
        }
        break;
      default:
        break;
    }
  #endif
  return numPrimitives++;
}
Example #2
0
    EventBox::EventBox(vec3f size, CameraLogic* logic, PlayerLogic* playerLogic) :m_Event((std::string("Event Box") + std::to_string(s_Count)).c_str()),
        m_Handler(logic, playerLogic),
        m_Box(0, New btDefaultMotionState(), New btBoxShape(btVector3(size.x, size.y, size.z) * 0.5f / Config::s_PPM)),
        m_Model("")
    {
        s_Count++;

        m_Event.AddComponent(&m_Handler);
        m_Event.AddComponent(&m_Box);
        m_Event.AddComponent(&m_Model);

        m_Node = New WE::Node(&m_Event);
        m_Event.AddComponent(m_Node);
        m_Box.GetBody()->setCollisionFlags(m_Box.GetBody()->getCollisionFlags() |
           btCollisionObject::CF_NO_CONTACT_RESPONSE);
    }
Example #3
0
    Enemy::Enemy(std::string path, vec3f size,vec3f modelSize, vec3f tunnelSize, unsigned int count, unsigned int current, Player* player, EnemyPool* enemies, CameraLogic* camera) : m_Enemy("Enemy"),
        m_Model(path.c_str(),modelSize),
        m_Body(1, New btDefaultMotionState(), New btBoxShape(btVector3(size.x, size.y, size.z) / 2.0f)),
        m_Node(nullptr),
        m_Logic(&m_Body),
        m_Handler(player, enemies,camera)
        
    {
        m_Enemy.AddComponent(&m_Model);
        m_Enemy.AddComponent(&m_Body);

        m_Node = New Node(&m_Enemy);
        m_Enemy.AddComponent(m_Node);

        InitialisePosition(tunnelSize,size,count, current);
		m_Body.GetRigidBody().setLinearFactor(btVector3(1.0f, 0.0f, 1.0f));
		m_Body.GetRigidBody().setCollisionFlags(m_Body.GetRigidBody().getCollisionFlags() | btCollisionObject::CF_NO_CONTACT_RESPONSE);

        m_Enemy.AddComponent(&m_Logic);
        m_Enemy.AddComponent(&m_Handler);
    }