コード例 #1
0
ファイル: Overlay.cpp プロジェクト: FloodProject/flood
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;
}
コード例 #2
0
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);
    }

}
コード例 #3
0
ファイル: StaticMeshNode.cpp プロジェクト: ill/illEngine
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;
        }
    }
}
コード例 #4
0
ファイル: SE_NewGeometry.cpp プロジェクト: 3DHome/3DHomeHD
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);
    }
}
コード例 #5
0
ファイル: SE_Geometry.cpp プロジェクト: AiAndroid/3DHomeHD
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
}