#include #include #include #include #include #include #include #include namespace hgl { namespace graph { float CameraLengthComp(Camera *cam,SceneNode *obj_one,SceneNode *obj_two) { if(!cam||!obj_one||!obj_two) return(0); return( length_squared(obj_one->GetCenter(),cam->eye)- length_squared(obj_two->GetCenter(),cam->eye)); } //bool FrustumClipFilter(const SceneNode *node,void *fc) //{ // if(!node||!fc)return(false); // return (((Frustum *)fc)->BoxIn(node->GetWorldBoundingBox())!=Frustum::OUTSIDE); //} void RenderList::Render(SceneNode *node,RenderableInstance *ri) { if(last_pipeline!=ri->GetPipeline()) { last_pipeline=ri->GetPipeline(); cmd_buf->BindPipeline(last_pipeline); last_mat_inst=nullptr; } if(last_mat_inst!=ri->GetMaterialInstance()) { last_mat_inst=ri->GetMaterialInstance(); cmd_buf->BindDescriptorSets(last_mat_inst->GetDescriptorSets()); } if(last_pc!=node->GetPushConstant()) { last_pc=node->GetPushConstant(); cmd_buf->PushConstants(last_pc,sizeof(PushConstant)); } //更新fin_mvp if(ri!=last_ri) { cmd_buf->BindVAB(ri); last_ri=ri; } const IndexBuffer *ib=ri->GetIndexBuffer(); if(ib) { cmd_buf->DrawIndexed(ib->GetCount()); } else { cmd_buf->Draw(ri->GetDrawCount()); } } void RenderList::Render(SceneNode *node,List &ri_list) { const int count=ri_list.GetCount(); RenderableInstance **ri=ri_list.GetData(); for(int i=0;irenderable_instances); ++node; } return(true); } }//namespace graph }//namespace hgl