UwU 1 месяц назад
Родитель
Сommit
cc43675d42

+ 13 - 2
src/WallpaperEngine/Render/Objects/CImage.cpp

@@ -380,6 +380,8 @@ CImage::CImage (Wallpapers::CScene& scene, const Image& image) :
 
     this->m_modelViewProjectionScreen
 	= this->getScene ().getCamera ().getProjection () * this->getScene ().getCamera ().getLookAt ();
+    // must match m_modelViewProjectionScreen - updateScreenSpacePosition() may skip recomputing it
+    this->m_modelViewProjectionScreenInverse = glm::inverse (this->m_modelViewProjectionScreen);
 
     if (this->getImage ().model->passthrough) {
 	this->m_modelViewProjectionCopy = this->m_modelViewProjectionScreen;
@@ -1102,7 +1104,13 @@ CImage::ResolvedTransform CImage::updateGeometryBuffers () {
     }
 
     this->updateScenePosition (origin, size, scale, sceneWidth, sceneHeight);
-    this->uploadGeometryBuffers (size);
+
+    if (this->m_pos != this->m_lastUploadedPos || size != this->m_lastUploadedGeometrySize) {
+	this->uploadGeometryBuffers (size);
+	this->m_lastUploadedPos = this->m_pos;
+	this->m_lastUploadedGeometrySize = size;
+    }
+
     return transform;
 }
 
@@ -1134,8 +1142,11 @@ void CImage::updateScreenSpacePosition () {
 	mvp = glm::translate (mvp, { x, y, 0.0f });
     }
 
+    // only the inverse is expensive; skip it when mvp didn't actually change
+    if (mvp != this->m_modelViewProjectionScreen) {
+	this->m_modelViewProjectionScreenInverse = glm::inverse (mvp);
+    }
     this->m_modelViewProjectionScreen = mvp;
-    this->m_modelViewProjectionScreenInverse = glm::inverse (mvp);
     if (this->getImage ().model->passthrough) {
 	this->m_modelViewProjectionCopy = this->m_modelViewProjectionScreen;
 	this->m_modelViewProjectionCopyInverse = this->m_modelViewProjectionScreenInverse;

+ 5 - 0
src/WallpaperEngine/Render/Objects/CImage.h

@@ -11,6 +11,7 @@
 #include "WallpaperEngine/Scripting/ScriptableObject.h"
 
 #include <glm/vec3.hpp>
+#include <limits>
 #include <vector>
 
 using namespace WallpaperEngine;
@@ -128,6 +129,10 @@ private:
     glm::vec3 m_sceneCenter = {};
     glm::vec2 m_size = {};
 
+    // last m_pos/size uploaded to the GL geometry buffers; NaN forces the first upload
+    glm::vec4 m_lastUploadedPos = glm::vec4 (std::numeric_limits<float>::quiet_NaN ());
+    glm::vec2 m_lastUploadedGeometrySize = glm::vec2 (std::numeric_limits<float>::quiet_NaN ());
+
     bool m_initialized = false;
 
     struct {