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]); }
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)); }