void ScnCanvasComponent::render( class ScnViewComponent* pViewComponent, RsFrame* pFrame, RsRenderSort Sort ) { if( HaveVertexBufferLock_ == BcFalse ) { return; } BcAssertMsg( HaveVertexBufferLock_ == BcTrue, "ScnCanvasComponent: Can't render without a vertex buffer lock." ); // HUD pass. Sort.Layer_ = 0; Sort.Pass_ = RS_SORT_PASS_MAX; // NOTE: Could do this sort inside of the renderer, but I'm just gonna keep the canvas // as one solid object as to not conflict with other canvas objects when rendered // to the scene. Will not sort by transparency or anything either. std::stable_sort( PrimitiveSectionList_.begin(), PrimitiveSectionList_.end(), ScnCanvasComponentPrimitiveSectionCompare() ); // Cache last material instance. ScnMaterialComponent* pLastMaterialComponent = NULL; for( BcU32 Idx = 0; Idx < PrimitiveSectionList_.size(); ++Idx ) { ScnCanvasComponentRenderNode* pRenderNode = pFrame->newObject< ScnCanvasComponentRenderNode >(); pRenderNode->NoofSections_ = 1;//PrimitiveSectionList_.size(); pRenderNode->pPrimitiveSections_ = pFrame->alloc< ScnCanvasComponentPrimitiveSection >( 1 ); pRenderNode->pPrimitive_ = pRenderResource_->pPrimitive_; // Copy primitive sections in. BcMemCopy( pRenderNode->pPrimitiveSections_, &PrimitiveSectionList_[ Idx ], sizeof( ScnCanvasComponentPrimitiveSection ) * 1 ); // Bind material. // NOTE: We should be binding for every single draw call. We can have the material deal with redundancy internally // if need be. If using multiple canvases we could potentially lose a material bind. //if( pLastMaterialComponent != pRenderNode->pPrimitiveSections_->MaterialComponent_ ) { pLastMaterialComponent = pRenderNode->pPrimitiveSections_->MaterialComponent_; pLastMaterialComponent->bind( pFrame, Sort ); } // Add to frame. pRenderNode->Sort_ = Sort; pFrame->addRenderNode( pRenderNode ); } // Unlock vertex buffer. pRenderResource_->pVertexBuffer_->setNoofUpdateVertices( VertexIndex_ ); pRenderResource_->pVertexBuffer_->unlock(); HaveVertexBufferLock_ = BcFalse; // Flip the render resource. CurrentRenderResource_ = 1 - CurrentRenderResource_; // Reset render resource pointers to aid debugging. pRenderResource_ = NULL; pVertices_ = pVerticesEnd_ = NULL; }
void ScnCanvasComponent::render( class ScnViewComponent* pViewComponent, RsFrame* pFrame, RsRenderSort Sort ) { // Upload. size_t VertexDataSize = VertexIndex_ * sizeof( ScnCanvasComponentVertex ); if( VertexDataSize > 0 ) { UploadFence_.increment(); RsCore::pImpl()->updateBuffer( RenderResource_.pVertexBuffer_, 0, VertexDataSize, RsResourceUpdateFlags::ASYNC, [ this, VertexDataSize ] ( RsBuffer* Buffer, const RsBufferLock& BufferLock ) { BcAssert( VertexDataSize <= Buffer->getDesc().SizeBytes_ ); BcMemCopy( BufferLock.Buffer_, pWorkingVertices_, VertexDataSize ); UploadFence_.decrement(); } ); } // HUD pass. Sort.Layer_ = 0; Sort.Pass_ = RS_SORT_PASS_MAX; // NOTE: Could do this sort inside of the renderer, but I'm just gonna keep the canvas // as one solid object as to not conflict with other canvas objects when rendered // to the scene. Will not sort by transparency or anything either. //std::stable_sort( PrimitiveSectionList_.begin(), PrimitiveSectionList_.end(), ScnCanvasComponentPrimitiveSectionCompare() ); // Cache last material instance. ScnMaterialComponent* pLastMaterialComponent = NULL; for( BcU32 Idx = 0; Idx < PrimitiveSectionList_.size(); ++Idx ) { auto* PrimitiveSection = &PrimitiveSectionList_[ Idx ]; ScnCanvasComponentRenderNode* pRenderNode = pFrame->newObject< ScnCanvasComponentRenderNode >(); pRenderNode->NoofSections_ = 1;//PrimitiveSectionList_.size(); pRenderNode->pPrimitiveSections_ = pFrame->alloc< ScnCanvasComponentPrimitiveSection >( 1 ); pRenderNode->VertexBuffer_ = RenderResource_.pVertexBuffer_; pRenderNode->VertexDeclaration_ = VertexDeclaration_; // Copy primitive sections in. BcMemZero( pRenderNode->pPrimitiveSections_, sizeof( ScnCanvasComponentPrimitiveSection ) ); *pRenderNode->pPrimitiveSections_ = *PrimitiveSection; // Bind material. // NOTE: We should be binding for every single draw call. We can have the material deal with redundancy internally // if need be. If using multiple canvases we could potentially lose a material bind. //if( pLastMaterialComponent != pRenderNode->pPrimitiveSections_->MaterialComponent_ ) { pLastMaterialComponent = pRenderNode->pPrimitiveSections_->MaterialComponent_; pLastMaterialComponent->bind( pFrame, Sort ); } // Add to frame. //Sort.Layer_ = PrimitiveSection->Layer_; pRenderNode->Sort_ = Sort; pFrame->addRenderNode( pRenderNode ); } // Reset vertices. pVertices_ = pVerticesEnd_ = nullptr; }