|
@@ -338,18 +338,38 @@ bool ElementUtilities::ApplyTransform(Element &element)
|
|
|
if (!render_interface)
|
|
if (!render_interface)
|
|
|
return false;
|
|
return false;
|
|
|
|
|
|
|
|
- static SmallUnorderedMap<RenderInterface*, const Matrix4f*> previous_matrix;
|
|
|
|
|
|
|
+ struct PreviousMatrix {
|
|
|
|
|
+ const Matrix4f* pointer; // This may be expired, dereferencing not allowed!
|
|
|
|
|
+ Matrix4f value;
|
|
|
|
|
+ };
|
|
|
|
|
+ static SmallUnorderedMap<RenderInterface*, PreviousMatrix> previous_matrix;
|
|
|
|
|
|
|
|
- const Matrix4f*& old_transform = previous_matrix.emplace(render_interface, nullptr).first->second;
|
|
|
|
|
|
|
+ auto it = previous_matrix.find(render_interface);
|
|
|
|
|
+ if (it == previous_matrix.end())
|
|
|
|
|
+ it = previous_matrix.emplace(render_interface, PreviousMatrix{ nullptr, Matrix4f::Identity() }).first;
|
|
|
|
|
+
|
|
|
|
|
+ RMLUI_ASSERT(it != previous_matrix.end());
|
|
|
|
|
+
|
|
|
|
|
+ const Matrix4f*& old_transform = it->second.pointer;
|
|
|
const Matrix4f* new_transform = nullptr;
|
|
const Matrix4f* new_transform = nullptr;
|
|
|
|
|
|
|
|
- if (auto state = element.GetTransformState())
|
|
|
|
|
|
|
+ if (const TransformState* state = element.GetTransformState())
|
|
|
new_transform = state->GetTransform();
|
|
new_transform = state->GetTransform();
|
|
|
|
|
|
|
|
// Only changed transforms are submitted.
|
|
// Only changed transforms are submitted.
|
|
|
if (old_transform != new_transform)
|
|
if (old_transform != new_transform)
|
|
|
{
|
|
{
|
|
|
- render_interface->SetTransform(new_transform);
|
|
|
|
|
|
|
+ Matrix4f& old_transform_value = it->second.value;
|
|
|
|
|
+
|
|
|
|
|
+ // Do a deep comparison as well to avoid submitting a new transform which is equal.
|
|
|
|
|
+ if(!old_transform || !new_transform || (old_transform_value != *new_transform))
|
|
|
|
|
+ {
|
|
|
|
|
+ render_interface->SetTransform(new_transform);
|
|
|
|
|
+
|
|
|
|
|
+ if(new_transform)
|
|
|
|
|
+ old_transform_value = *new_transform;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
old_transform = new_transform;
|
|
old_transform = new_transform;
|
|
|
}
|
|
}
|
|
|
|
|
|