@@ -334,6 +334,13 @@ bool RobotModelRenderer::updateCameraInfo(const robot_model_renderer::PinholeCam
334334
335335 CRAS_DEBUG_NAMED (" camera_info" , " Updating new camera info" );
336336
337+ // Invalidate cache if camera geometry changes and static rendering is enabled
338+ if (this ->config .renderedImageIsStatic && this ->cached_image_ .total () > 0 )
339+ {
340+ this ->cached_image_ = cv::Mat ();
341+ CRAS_DEBUG_NAMED (" camera_info" , " Invalidating cached image due to camera geometry change" );
342+ }
343+
337344 const auto prevOrigCamMsg = this ->origCameraModel .cameraInfo ();
338345 this ->origCameraModel = model;
339346
@@ -488,33 +495,47 @@ bool RobotModelRenderer::updateCameraInfo(const robot_model_renderer::PinholeCam
488495
489496cras::expected<cv::Mat, std::string> RobotModelRenderer::render (const ros::Time& time, RenderErrors& errors)
490497{
498+ // Check if we can use cached rendering for static images
499+ if (this ->config .renderedImageIsStatic && this ->cached_image_ .total () > 0 )
500+ return this ->cached_image_ .clone ();
501+
491502 auto renderResult = this ->renderInner (time, errors);
492503 if (!renderResult.has_value ())
493504 return renderResult;
494505
495- if (!this ->hasOverlays ())
496- return *renderResult;
506+ cv::Mat finalImage;
497507
498- cv::Mat overlaidImg (renderResult->rows , renderResult->cols , this ->cvImageType );
508+ if (!this ->hasOverlays ())
509+ {
510+ finalImage = *renderResult;
511+ }
512+ else
499513 {
500- auto renderedImg = renderResult->isContinuous () ? *renderResult : renderResult->clone ();
514+ finalImage = cv::Mat (renderResult->rows , renderResult->cols , this ->cvImageType );
515+ {
516+ auto renderedImg = renderResult->isContinuous () ? *renderResult : renderResult->clone ();
501517
502- auto renderLock {render_system_.lock ()};
518+ auto renderLock {render_system_.lock ()};
503519
504- // Draw the previously rendered scene onto overlay_scene_tex_ .
505- {
506- const Ogre::PixelBox renderPb (renderedImg.cols , renderedImg.rows , 1 , this ->config .pixelFormat , renderedImg.data );
507- overlay_scene_tex_->getBuffer ()->blitFromMemory (renderPb);
508- }
520+ // Draw the previously rendered scene onto overlay_scene_tex_ .
521+ {
522+ const Ogre::PixelBox renderPb (renderedImg.cols , renderedImg.rows , 1 , this ->config .pixelFormat ,
523+ renderedImg.data );
524+ overlay_scene_tex_->getBuffer ()->blitFromMemory (renderPb);
525+ }
509526
510- overlay_rt_->update ();
527+ overlay_rt_->update ();
511528
512- const Ogre::PixelBox pb (overlay_tex_->getWidth (), overlay_tex_->getHeight (), 1 , this ->config .pixelFormat ,
513- overlaidImg.data );
514- overlay_rt_->copyContentsToMemory (pb);
529+ const Ogre::PixelBox pb (overlay_tex_->getWidth (), overlay_tex_->getHeight (), 1 , this ->config .pixelFormat ,
530+ finalImage.data );
531+ overlay_rt_->copyContentsToMemory (pb);
532+ }
515533 }
516534
517- return overlaidImg;
535+ if (this ->config .renderedImageIsStatic )
536+ this ->cached_image_ = finalImage.clone ();
537+
538+ return finalImage;
518539}
519540
520541cras::expected<cv::Mat, std::string> RobotModelRenderer::renderInner (const ros::Time& time, RenderErrors& errors)
@@ -662,6 +683,8 @@ void RobotModelRenderer::reset()
662683 {
663684 Ogre::MaterialManager::getSingleton ().remove (overlay_material_->getName ());
664685 }
686+
687+ cached_image_ = cv::Mat ();
665688}
666689
667690}
0 commit comments