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