void Overlay::layout(const Vector2i& screen) { if(positioning == PositionMode::Absolute) { position.x = offset.x; position.y = offset.y; return; } // Use the world bounding volume to take scale into account. const BoundingBox& box = getWorldBoundingVolume(); Vector3 bounds = box.max - box.min; switch(anchor) { case AnchorMode::TopLeft: position.x = 0; position.y = 0; break; case AnchorMode::TopCenter: position.x = screen.x / 2.0f; position.y = 0; break; case AnchorMode::TopRight: position.x = screen.x - bounds.x; position.y = 0; break; case AnchorMode::Right: position.x = 0; position.y = screen.y; break; case AnchorMode::BottomRight: position.x = 0; position.y = screen.y; break; case AnchorMode::BottomCenter: position.x = 0; position.y = screen.y; break; case AnchorMode::BottomLeft: position.x = 0; position.y = screen.y; break; case AnchorMode::Left: position.x = 0; position.y = screen.y; break; case AnchorMode::Center: position.x = 0; position.y = screen.y; break; } position.x += offset.x; position.y += offset.y; }
void SE_CommonNode::renderScene(SE_Camera* camera, SE_RenderManager* renderManager) { if(!isVisible()) return; SE_BoundingVolume* bv = getWorldBoundingVolume(); if(bv) { int culled = camera->cullBV(*bv); if(culled == SE_FULL_CULL) return; } std::vector<SE_Spatial*>::iterator it; std::vector<SE_Spatial*> children = getChildren(); for(it = children.begin() ; it != children.end() ; it++) { SE_Spatial* s = *it; s->renderScene(camera, renderManager); } }
void StaticMeshNode::render(RenderQueues& renderQueues) { assert(!m_mesh.isNull()); //place the mesh in the appropriate render queue for(uint8_t groupInd = 0; groupInd < m_primitiveGroups.size(); groupInd++) { PrimitiveGroupInfo& group = m_primitiveGroups[groupInd]; assert(!group.m_material.isNull()); switch(group.m_material->getLoadArgs().m_blendMode) { case illGraphics::MaterialLoadArgs::BlendMode::NONE: { if(m_occluderType == OccluderType::ALWAYS || (m_occluderType == OccluderType::LIMITED && renderQueues.m_depthPassObjects < renderQueues.m_depthPassLimit)) { MeshData<>::PrimitiveGroup& test = m_mesh->getMeshFrontentData()->getPrimitiveGroup(groupInd); auto& list = renderQueues.m_depthPassSolidStaticMeshes[group.m_material->getDepthPassProgram()][group.m_material.get()][m_mesh.get()]; list.emplace_back(); list.back().m_node = this; list.back().m_primitiveGroup = groupInd; ++renderQueues.m_depthPassObjects; } { auto& list = renderQueues.m_solidStaticMeshes[group.m_material->getShaderProgram()][group.m_material.get()][m_mesh.get()]; list.emplace_back(); list.back().m_meshInfo.m_node = this; list.back().m_meshInfo.m_primitiveGroup = groupInd; if(renderQueues.m_getSolidAffectingLights || group.m_material->getLoadArgs().m_forceForwardRendering) { getScene()->getLights(getWorldBoundingVolume(), list.back().m_affectingLights); } } } break; case illGraphics::MaterialLoadArgs::BlendMode::ADDITIVE: { auto& list = renderQueues.m_unsolidStaticMeshes[group.m_material->getShaderProgram()][group.m_material.get()][m_mesh.get()]; list.emplace_back(); list.back().m_meshInfo.m_node = this; list.back().m_meshInfo.m_primitiveGroup = groupInd; //TODO: when this is used, also store whether or not an occlusion query is needed for the node if(renderQueues.m_getSolidAffectingLights || group.m_material->getLoadArgs().m_forceForwardRendering) { getScene()->getLights(getWorldBoundingVolume(), list.back().m_affectingLights); } } break; case illGraphics::MaterialLoadArgs::BlendMode::ALPHA: case illGraphics::MaterialLoadArgs::BlendMode::PREMULT_ALPHA: { //TODO: handle the depth sorted stuff } break; } } }
void SE_NewGeometry::renderScene(SE_Camera* camera, SE_RenderManager* renderManager, SE_CULL_TYPE cullType) { if(!isVisible()) return; SE_BoundingVolume* bv = getWorldBoundingVolume(); SE_CULL_TYPE currCullType = SE_PART_CULL; if(bv && cullType == SE_PART_CULL) { int culled = camera->cullBV(*bv); if(culled == SE_FULL_CULL) return; else currCullType = (SE_CULL_TYPE)culled; } SE_NewGeometry::_Impl::SimObjectList::iterator it; for(it = mImpl->attachObject.begin() ; it != mImpl->attachObject.end() ; it++) { SE_SimObject* so = *it; SE_SimObject::RenderUnitVector renderUnitVector = so->createRenderUnit(); SE_SimObject::RenderUnitVector::iterator itRU; for(itRU = renderUnitVector.begin() ; itRU!= renderUnitVector.end(); itRU++) { if(*itRU) { //transparency object should be draw after normal object. const SE_ProgramDataID& spID = (*itRU)->getSurface()->getProgramDataID(); std::string spid = spID.getStr(); if(spid.compare("fadeinout_shader") == 0) { renderManager->addRenderUnit(*itRU,SE_RenderManager::RQ5); } else if((*itRU)->isDrawStencil()) { //draw stencil buffer, first renderManager->addRenderUnit(*itRU,SE_RenderManager::RQ2); } else if((*itRU)->isMirroredObject()) { //draw stencil buffer, first renderManager->addRenderUnit(*itRU,SE_RenderManager::RQ3); } else { renderManager->addRenderUnit(*itRU, SE_RenderManager::RQ4); } } } } if(isSelected()) { SE_RenderUnit* ru = createSelectedFrame(this); if(ru != NULL) renderManager->addRenderUnit(ru, SE_RenderManager::RQ7); else { SE_NewGeometry::_Impl::SimObjectList::iterator it; for(it = mImpl->attachObject.begin() ; it != mImpl->attachObject.end() ; it++) { SE_SimObject* so = *it; SE_RenderUnit* ru = so->createWireRenderUnit(); renderManager->addRenderUnit(ru, SE_RenderManager::RQ7); } } } std::list<SE_Spatial*>::iterator itchild = mImplchild->children.begin(); for(; itchild != mImplchild->children.end() ; itchild++) { SE_Spatial* s = *itchild; s->renderScene(camera, renderManager, currCullType); } }
void SE_Geometry::renderScene(SE_Camera* camera, SE_RenderManager* renderManager, SE_CULL_TYPE cullType) { if(!isSpatialStateHasAttribute(SE_SpatialAttribute::VISIBLE)) { return; } SE_BoundingVolume* bv = getWorldBoundingVolume(); if(bv && cullType == SE_PART_CULL) { int culled = camera->cullBV(*bv); if(culled == SE_FULL_CULL) { //set cull status for optimize ray detect,now ray detect would not effect this spatial setSpatialRuntimeAttribute(SE_SpatialAttribute::CAMERAFULLCULL,true); return; } } //set cull status for optimize ray detect setSpatialRuntimeAttribute(SE_SpatialAttribute::CAMERAFULLCULL,false); SE_Geometry::_Impl::SimObjectList::iterator it; for(it = mImpl->attachObject.begin() ; it != mImpl->attachObject.end() ; it++) { SE_SimObject* so = *it; if(!so->isNeedRender()) { //Do not render this object,this is a data object,like simple-model data object continue; } SE_SimObject::RenderUnitVector renderUnitVector = so->createRenderUnit(); SE_SimObject::RenderUnitVector::iterator itRU; for(itRU = renderUnitVector.begin() ; itRU!= renderUnitVector.end(); itRU++) { if(*itRU) { float f = distanceToCameraLocation(camera, so->getCenter()); (*itRU)->setDistanceToCamera(f); //transparency object should be draw after normal object. if((*itRU)->isNeedBlurVShadow()) { //fbo shadow blurV first renderManager->addRenderUnit(*itRU,SE_RenderManager::RQ1); } else if((*itRU)->isNeedBlurHShadow()) { //blurV first , then blurH renderManager->addRenderUnit(*itRU,SE_RenderManager::RQ2); } else if((*itRU)->isNeedGenerateShadow()) { //shadow,fbo first renderManager->addRenderUnit(*itRU,SE_RenderManager::RQ0); } else if((*itRU)->isNeedDofGen()) { //dof,fbo first renderManager->addRenderUnit(*itRU,SE_RenderManager::RQ0); } else if((*itRU)->isNeedColorEffect()) { renderManager->addRenderUnit(*itRU,SE_RenderManager::RQ6); } else if((*itRU)->isEnableBlend()) { //blend unit last if(isNeedBlendSortOnX()) { renderManager->addRenderUnit(*itRU,SE_RenderManager::RQ8); } else if(isNeedBlendSortOnY()) { renderManager->addRenderUnit(*itRU,SE_RenderManager::RQ9); } else { renderManager->addRenderUnit(*itRU,SE_RenderManager::RQ10); } } else { //normal render unit in rq7 renderManager->addRenderUnit(*itRU, SE_RenderManager::RQ7); } } } } #ifndef ANDROID if(isSpatialHasRuntimeAttribute(SE_SpatialAttribute::SELECTED)) { SE_RenderUnit* ru = createSelectedFrame(this); if(ru != NULL) renderManager->addRenderUnit(ru, SE_RenderManager::RQ12); else { SE_Geometry::_Impl::SimObjectList::iterator it; for(it = mImpl->attachObject.begin() ; it != mImpl->attachObject.end() ; it++) { SE_SimObject* so = *it; SE_RenderUnit* ru = so->createWireRenderUnit(); renderManager->addRenderUnit(ru, SE_RenderManager::RQ12); } } } #endif }