Esempio n. 1
0
//---------------------------------------------------------------------------
void RenderableNodeSorter::Add(RenderableNode& r, RenderFlagsEnum rf, ShadersEnum shaderId)
{
    
    assert(shaderId != Shaders::NONE);
    RenderContext* context = RenderContext::Inst();
    bool selected = ( context->selection.find( r.objectId ) != context->selection.end() );    
         
    PrimitiveTypeEnum primtype = r.mesh->primitiveType;
    GlobalRenderFlagsEnum gflags = this->GetFlags();
    bool triPrim = primtype == PrimitiveType::TriangleList || primtype == PrimitiveType::TriangleStrip;  
    
    uint32_t mask =(uint32_t) ~(RenderFlags::Textured | RenderFlags::Lit);        
    uint32_t flags = rf & (mask | gflags);
    flags |=  (gflags & GlobalRenderFlags::RenderBackFace);
    
    bool wireflagset = (gflags & GlobalRenderFlags::WireFrame) != 0;    
    if(triPrim)
    {
         if(gflags & GlobalRenderFlags::Solid) 
         {
             Bucket& bucket = GetOrMakeBucket(flags, shaderId);
             bucket.renderables.push_back( r );
             if(r.GetFlag(RenderableNode::kShadowCaster))
                 m_bounds.Extend(r.bounds);    
         }

         if(selected || wireflagset)
         {
             RenderableNode node = r;
             node.diffuse = selected ? context->State()->GetSelectionColor() : context->State()->GetWireframeColor();
             flags &= ~RenderFlags::AlphaBlend;             
             Bucket& bucket = GetOrMakeBucket(flags, Shaders::WireFrameShader );
             bucket.renderables.push_back( node );
         }         
    }
    else
    {
        flags &= ~RenderFlags::AlphaBlend;
        Bucket& bucket = GetOrMakeBucket(flags, shaderId);

        if(selected)
        {
            RenderableNode node = r;
            node.diffuse = context->State()->GetSelectionColor();
            bucket.renderables.push_back( node);
        }
        else
        {
            bucket.renderables.push_back( r );
        }               
    }
}
Esempio n. 2
0
//---------------------------------------------------------------------------
void RenderableNodeSorter::Add( const RenderNodeList::iterator& listBegin, const RenderNodeList::iterator& listEnd,
                                    RenderFlagsEnum rf, ShadersEnum shaderId )
{
    if(listBegin == listEnd) return;
    // use the first renderable to detect if parent gob is selected
    // and also if the gob is shadow caster.
    assert(shaderId != Shaders::NONE);
    ObjectGUID gobId = listBegin->objectId;
    RenderContext* context = RenderContext::Inst();
    bool selected = ( context->selection.find( gobId ) != context->selection.end() );
    //bool isShadowCaster = listBegin->GetFlag( RenderableNode::kShadowCaster );
    GlobalRenderFlagsEnum gflags = this->GetFlags();

    uint32_t mask =(uint32_t) ~(RenderFlags::Textured | RenderFlags::Lit | RenderFlags::RenderBackFace);    
    uint32_t flags = rf & (mask | gflags);
    flags |=  (gflags & GlobalRenderFlags::RenderBackFace);

    PrimitiveTypeEnum primtype = listBegin->mesh->primitiveType;
    bool triPrim = primtype == PrimitiveType::TriangleList || primtype == PrimitiveType::TriangleStrip;  
   
    bool wireflagset = (gflags & GlobalRenderFlags::WireFrame) != 0;
    if(triPrim)
    {
         if(gflags & GlobalRenderFlags::Solid)
         {
             Bucket& bucket = GetOrMakeBucket(flags, shaderId);
             bucket.renderables.insert( bucket.renderables.end(), listBegin, listEnd );
             for ( auto it = listBegin; it != listEnd; ++it )      
             {
                 if(it->GetFlag(RenderableNode::kShadowCaster))
                     m_bounds.Extend(it->bounds);  
             }
         }

         if(selected || wireflagset)
         {
             float4 color = selected ? context->State()->GetSelectionColor() : context->State()->GetWireframeColor();
             flags &= ~RenderFlags::AlphaBlend;             
             Bucket& bucket = GetOrMakeBucket(flags, Shaders::WireFrameShader );

             for ( auto it = listBegin; it != listEnd; ++it )      
             {
                 RenderableNode node = (*it);
                 node.diffuse = color;
                 bucket.renderables.push_back(node);
             }
         }
    }
    else
    {
        flags &= ~RenderFlags::AlphaBlend;
        Bucket& bucket = GetOrMakeBucket(flags, shaderId );

        if(wireflagset || selected)
        {
            float4 color = context->State()->GetSelectionColor();
             for ( auto it = listBegin; it != listEnd; ++it )      
             {
                 RenderableNode node = *it;
                 node.diffuse = color;
                 bucket.renderables.push_back(node);
             }
        }
        else
        {
            bucket.renderables.insert( bucket.renderables.end(), listBegin, listEnd );      
        }        
    }
}