void ClientGameObjectManagerAddon::createSpaceShip(int &threadOwnershipMask)
{

	//create hierarchy:
	//scene root
	//  scene node // tracks position/orientation
	//    SpaceShip

	//game object manager
	//  SpaceShipController
	//    scene node

	PE::Handle hMeshInstance("MeshInstance", sizeof(MeshInstance));
	MeshInstance *pMeshInstance = new(hMeshInstance) MeshInstance(*m_pContext, m_arena, hMeshInstance);

	pMeshInstance->addDefaultComponents();
	pMeshInstance->initFromFile("space_frigate_6.mesha", "FregateTest", threadOwnershipMask);

	// need to create a scene node for this mesh
	PE::Handle hSN("SCENE_NODE", sizeof(SceneNode));
	SceneNode *pSN = new(hSN) SceneNode(*m_pContext, m_arena, hSN);
	pSN->addDefaultComponents();

	Vector3 spawnPos(0, 0, 0.0f);
	pSN->m_base.setPos(spawnPos);

	pSN->addComponent(hMeshInstance);

	RootSceneNode::Instance()->addComponent(hSN);

	// now add game objects

	PE::Handle hSpaceShip("ClientSpaceShip", sizeof(ClientSpaceShip));
	ClientSpaceShip *pSpaceShip = new(hSpaceShip) ClientSpaceShip(*m_pContext, m_arena, hSpaceShip, 0.05f, spawnPos,  0.05f);
	pSpaceShip->addDefaultComponents();

	addComponent(hSpaceShip);

	// add the same scene node to tank controller
	static int alllowedEventsToPropagate[] = {0}; // we will pass empty array as allowed events to propagate so that when we add
	// scene node to the square controller, the square controller doesnt try to handle scene node's events
	// because scene node handles events through scene graph, and is child of space ship just for referencing purposes
	pSpaceShip->addComponent(hSN, &alllowedEventsToPropagate[0]);

	pSpaceShip->activate();
}
void ClientGameObjectManagerAddon::createTank(int index, int &threadOwnershipMask)
{

	//create hierarchy:
	//scene root
	//  scene node // tracks position/orientation
	//    Tank

	//game object manager
	//  TankController
	//    scene node
	
	PE::Handle hMeshInstance("MeshInstance", sizeof(MeshInstance));
	MeshInstance *pMeshInstance = new(hMeshInstance) MeshInstance(*m_pContext, m_arena, hMeshInstance);

	pMeshInstance->addDefaultComponents();
	pMeshInstance->initFromFile("kingtiger.x_main_mesh.mesha", "Default", threadOwnershipMask);

	// need to create a scene node for this mesh
	PE::Handle hSN("SCENE_NODE", sizeof(SceneNode));
	SceneNode *pSN = new(hSN) SceneNode(*m_pContext, m_arena, hSN);
	pSN->addDefaultComponents();

	Vector3 spawnPos(-36.0f + 6.0f * index, 0 , 21.0f);
	pSN->m_base.setPos(spawnPos);
	
	pSN->addComponent(hMeshInstance);

	RootSceneNode::Instance()->addComponent(hSN);

	// now add game objects

	PE::Handle hTankController("TankController", sizeof(TankController));
	TankController *pTankController = new(hTankController) TankController(*m_pContext, m_arena, hTankController, 0.05f, spawnPos,  0.05f);
	pTankController->addDefaultComponents();

	addComponent(hTankController);

	// add the same scene node to tank controller
	static int alllowedEventsToPropagate[] = {0}; // we will pass empty array as allowed events to propagate so that when we add
	// scene node to the square controller, the square controller doesnt try to handle scene node's events
	// because scene node handles events through scene graph, and is child of square controller just for referencing purposes
	pTankController->addComponent(hSN, &alllowedEventsToPropagate[0]);
}
Пример #3
0
ConeTracePass::ConeTracePass(VCTscene* vctScene){
  using namespace kore;

  _name = std::string("ConeTrace");
  _useGPUProfiling = vctScene->getUseGPUprofiling();

    _vctScene = vctScene;
    _renderMgr = RenderManager::getInstance();
    _sceneMgr = SceneManager::getInstance();
    _resMgr = ResourceManager::getInstance();

    _coneTraceShader.loadShader("./assets/shader/VoxelConeTracing/raycastVert.shader",
      GL_VERTEX_SHADER);

    _coneTraceShader.loadShader("./assets/shader/ConeTraceFrag.shader",
      GL_FRAGMENT_SHADER, std::string("#define LEAF_NODE_RESOLUTION ")
                          + std::to_string(vctScene->getNodePool()->getLeafNodeResolution())
                          + std::string("\n\n") );
    _coneTraceShader.setName("cone trace shader");
    _coneTraceShader.init();

    _coneTraceShader.startUniformBindingCheck();
    
    this->setShaderProgram(&_coneTraceShader);

    TexSamplerProperties samplerProps;
    samplerProps.minfilter = GL_LINEAR;
    samplerProps.magfilter = GL_LINEAR;
    samplerProps.wrapping = glm::uvec3(GL_REPEAT, GL_REPEAT, GL_REPEAT);
    _coneTraceShader.setSamplerProperties(0, samplerProps);

    SceneNode* fsquadnode = new SceneNode();
    SceneManager::getInstance()->getRootNode()->addChild(fsquadnode);

    MeshComponent* fsqMeshComponent = new MeshComponent();
    fsqMeshComponent->setMesh(FullscreenQuad::getInstance());
    fsquadnode->addComponent(fsqMeshComponent);

    kore::Camera* cam = vctScene->getCamera();

    NodePass* nodePass = new NodePass(fsquadnode);
    this->addNodePass(nodePass);

    glm::ivec4 vp(0, 0, RenderManager::getInstance()->getScreenResolution().x,
      RenderManager::getInstance()->getScreenResolution().y);
    nodePass->addOperation(new ViewportOp(vp));

    nodePass
      ->addOperation(new ColorMaskOp(glm::bvec4(true, true, true, true)));


    nodePass->addOperation(OperationFactory::create(OP_BINDATTRIBUTE, 
      "v_position",
      fsqMeshComponent, 
      "v_position",
      &_coneTraceShader));


    nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM, 
      "ratio",
      cam, 
      "fRatio",
      &_coneTraceShader));

    nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM, 
      "FOV degree",
      cam,
      "fYfovDeg",
      &_coneTraceShader));

    nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM, 
      "far Plane",
      cam, 
      "fFar",
      &_coneTraceShader));

    nodePass->addOperation(new BindUniform(_renderMgr->getShdScreenRes(),
      _coneTraceShader.getUniform("screenRes")));  

    addStartupOperation(new BindImageTexture(
      vctScene->getNodePool()->getShdNodePool(NEXT),
      _coneTraceShader.getUniform("nodePool_next"), GL_READ_ONLY));
    addStartupOperation(new BindImageTexture(
      vctScene->getNodePool()->getShdNodePool(COLOR),
      _coneTraceShader.getUniform("nodePool_color"), GL_READ_ONLY));

    addStartupOperation(new BindTexture(vctScene->getBrickPool()->getShdBrickPoolTexture(BRICKPOOL_COLOR),
                                        _coneTraceShader.getUniform("brickPool_color")));
    addStartupOperation(new BindTexture(vctScene->getBrickPool()->getShdBrickPoolTexture(BRICKPOOL_IRRADIANCE),
                                        _coneTraceShader.getUniform("brickPool_irradiance")));
    addStartupOperation(new BindTexture(vctScene->getBrickPool()->getShdBrickPoolTexture(BRICKPOOL_NORMAL),
                                        _coneTraceShader.getUniform("brickPool_normal")));
    
    nodePass->addOperation(new BindUniform(
      vctScene->getShdVoxelGridResolution(),
      _coneTraceShader.getUniform("voxelGridResolution")));

    nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM,
      "inverse view Matrix",
      cam,
      "viewI",
      &_coneTraceShader));

    nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM,
      "inverse model Matrix", vctScene->getVoxelGridNode()->getTransform(),
      "voxelGridTransformI", &_coneTraceShader));

    nodePass->addOperation(new BindUniform(vctScene->getNodePool()->getShdNumLevels(),
      _coneTraceShader.getUniform("numLevels"))); 

    nodePass->addOperation(new BindUniform(vctScene->getNodePool()->getShdLeafNodeResolution(),
      _coneTraceShader.getUniform("leafNodeResolution")));

    nodePass->addOperation(new BindUniform(&vctScene->_shdConeDiameter, _coneTraceShader.getUniform("coneAngle")));


    //////////////////////////////////////////////////////////////////////////
    // Tweak-Parameters
    nodePass->addOperation(new BindUniform(vctScene->getShdUseLighting(),
      _coneTraceShader.getUniform("useLighting")));
    //nodePass->addOperation(new BindUniform(&vctScene->_shdUseAlphaCorrection, _coneTraceShader.getUniform("useAlphaCorrection")));
    //////////////////////////////////////////////////////////////////////////

    nodePass->addOperation(new RenderMesh(fsqMeshComponent));

    _coneTraceShader.finishUniformBindingCheck();
}
RayCastingPass::RayCastingPass(VCTscene* vctScene) {
  using namespace kore;

  _name = std::string("Raycasting Pass");
  _useGPUProfiling = vctScene->getUseGPUprofiling();
  
  _raycastShader
     .loadShader("./assets/shader/VoxelConeTracing/raycastVert.shader",
                 GL_VERTEX_SHADER);
  
  _raycastShader.
    loadShader("./assets/shader/VoxelConeTracing/raycastFrag.shader",
               GL_FRAGMENT_SHADER);

  _raycastShader.setName("raycastShader");
  _raycastShader.init();
  
  this->setShaderProgram(&_raycastShader);
  
  SceneNode* fsquadnode = new SceneNode();
  SceneManager::getInstance()->getRootNode()->addChild(fsquadnode);

  MeshComponent* fsqMeshComponent = new MeshComponent();
  fsqMeshComponent->setMesh(FullscreenQuad::getInstance());
  fsquadnode->addComponent(fsqMeshComponent);

  kore::Camera* cam = vctScene->getCamera();

  NodePass* nodePass = new NodePass(fsquadnode);
  this->addNodePass(nodePass);

  glm::ivec4 vp(0, 0, RenderManager::getInstance()->getScreenResolution().x,
                     RenderManager::getInstance()->getScreenResolution().y);
  nodePass->addOperation(new ViewportOp(vp));

  nodePass
    ->addOperation(new EnableDisableOp(GL_DEPTH_TEST,
    EnableDisableOp::DISABLE));

  nodePass
    ->addOperation(new ColorMaskOp(glm::bvec4(true, true, true, true)));

  nodePass->addOperation(OperationFactory::create(OP_BINDATTRIBUTE, 
    "v_position",
    fsqMeshComponent, 
    "v_position",
    &_raycastShader));

  nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM, 
    "ratio",
    cam, 
    "fRatio",
    &_raycastShader));

  nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM, 
    "FOV degree",
    cam, 
    "fYfovDeg",
    &_raycastShader));

  nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM, 
    "far Plane",
    cam, 
    "fFar",
    &_raycastShader));

  nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM,
    "inverse view Matrix",
    cam,
    "viewI",
    &_raycastShader));

  nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM,
    "model Matrix", vctScene->getVoxelGridNode()->getTransform(),
    "voxelGridTransform", &_raycastShader));

  nodePass->addOperation(OperationFactory::create(OP_BINDUNIFORM,
    "inverse model Matrix", vctScene->getVoxelGridNode()->getTransform(),
    "voxelGridTransformI", &_raycastShader));

  nodePass->addOperation(new RenderMesh(fsqMeshComponent));
}