@@ -46,31 +46,40 @@ void RenderSystem::update(double delta) {
4646 auto frustum = extractFrustumPlanes (proj_mat * view_mat);
4747 Logger::Log (ICE::Logger::DEBUG, " Graphics" , " Render Queue Size: %d" , m_render_queue.size ());
4848 for (const auto &e : m_render_queue) {
49- auto rc = m_registry->getComponent <RenderComponent>(e);
5049 auto tc = m_registry->getComponent <TransformComponent>(e);
51- auto mesh = m_gpu_bank->getMesh (rc->mesh );
52- auto material = m_gpu_bank->getMaterial (rc->material );
53- auto shader = m_gpu_bank->getShader (material->getShader ());
54- if (!mesh || !material || !shader)
55- continue ;
50+ auto rc = m_registry->getComponent <RenderComponent>(e);
5651
5752 auto model_mat = tc->getWorldMatrix ();
58-
59- auto local_aabb = m_gpu_bank->getMeshAABB (rc->mesh );
60- Eigen::Vector3f localCenter = local_aabb.getCenter ();
61- Eigen::Vector3f localExtents = local_aabb.getExtent ();
6253
63- Eigen::Matrix3f R = model_mat.block <3 , 3 >(0 , 0 );
64- Eigen::Vector3f T = model_mat.block <3 , 1 >(0 , 3 );
54+ if (!m_culling_cache.contains (e) || m_culling_cache[e].lastTransformVersion != tc->getVersion () || m_culling_cache[e].lastMesh != rc->mesh ) {
55+ auto local_aabb = m_gpu_bank->getMeshAABB (rc->mesh );
56+ Eigen::Vector3f localCenter = local_aabb.getCenter ();
57+ Eigen::Vector3f localExtents = local_aabb.getExtent ();
58+
59+ Eigen::Matrix3f R = model_mat.block <3 , 3 >(0 , 0 );
60+ Eigen::Vector3f T = model_mat.block <3 , 1 >(0 , 3 );
6561
66- Eigen::Vector3f worldCenter = R * localCenter + T;
62+ Eigen::Vector3f worldCenter = R * localCenter + T;
6763
68- Eigen::Matrix3f absR = R.cwiseAbs ();
69- Eigen::Vector3f worldExtents = absR * localExtents;
64+ Eigen::Matrix3f absR = R.cwiseAbs ();
65+ Eigen::Vector3f worldExtents = absR * localExtents;
7066
71- if (!isAABBInFrustum (frustum, worldCenter, worldExtents))
67+ m_culling_cache[e] = CullingData{
68+ .lastTransformVersion = tc->getVersion (),
69+ .lastMesh = rc->mesh ,
70+ .worldCenter = worldCenter,
71+ .worldExtents = worldExtents,
72+ };
73+ }
74+ if (!isAABBInFrustum (frustum, m_culling_cache[e].worldCenter , m_culling_cache[e].worldExtents ))
75+ continue ;
76+
77+ auto mesh = m_gpu_bank->getMesh (rc->mesh );
78+ auto material = m_gpu_bank->getMaterial (rc->material );
79+ auto shader = m_gpu_bank->getShader (material->getShader ());
80+ if (!mesh || !material || !shader)
7281 continue ;
73-
82+
7483 std::unordered_map<int , Eigen::Matrix4f> bone_matrices;
7584 if (m_registry->entityHasComponent <SkinningComponent>(e)) {
7685 const auto &skinning = m_gpu_bank->getMeshSkinningData (rc->mesh );
0 commit comments