Rigs of Rods 2026.01
Soft-body Physics Simulation
Loading...
Searching...
No Matches
RTTLayer.cpp
Go to the documentation of this file.
1// based on the MyGUI UnitTests
2
3#include "MyGUI_LayerItem.h"
4#include "RTTLayer.h"
5#include "MyGUI_Enumerator.h"
6#include "MyGUI_FactoryManager.h"
7#include "MyGUI_RenderManager.h"
8#include "MyGUI_Gui.h"
9#include "MyGUI_LayerNode.h"
10
11using namespace RoR;
12
13using namespace MyGUI;
14
16 mTexture(nullptr),
17 mOutOfDate(false)
18{
19}
20
25
26void RTTLayer::deserialization(xml::ElementPtr _node, Version _version)
27{
28 Base::deserialization(_node, _version);
29
30 MyGUI::xml::ElementEnumerator propert = _node->getElementEnumerator();
31 while (propert.next("Property"))
32 {
33 const std::string& key = propert->findAttribute("key");
34 const std::string& value = propert->findAttribute("value");
35 if (key == "TextureSize")
36 setTextureSize(utility::parseValue<IntSize>(value));
37 if (key == "TextureName")
38 setTextureName(value);
39 }
40
41 this->createRttTexture();
42}
43
44void RTTLayer::renderToTarget(IRenderTarget* _target, bool _update)
45{
46 if (!mTexture)
47 return;
48
49 bool outOfDate = mOutOfDate || isOutOfDate();
50
51 if (outOfDate || _update)
52 {
53 MyGUI::IRenderTarget* target = mTexture->getRenderTarget();
54 if (target != nullptr)
55 {
56 target->begin();
57
58 for (VectorILayerNode::iterator iter = mChildItems.begin(); iter != mChildItems.end(); ++iter)
59 (*iter)->renderToTarget(target, _update);
60
61 target->end();
62 }
63 }
64
65 mOutOfDate = false;
66}
67
68void RTTLayer::setTextureSize(const IntSize& _size)
69{
70 if (mTextureSize == _size)
71 return;
72
73 mTextureSize = _size;
74
75 ROR_ASSERT(mTextureSize.width && mTextureSize.height && "RTTLayer texture size must have non-zero width and height");
76
77 mOutOfDate = true;
78}
79
80void RTTLayer::setTextureName(const std::string& _name)
81{
82 mTextureName = _name;
83
84 mOutOfDate = true;
85}
86
88{
89 if (mTexture)
90 {
91 mTexture->destroy();
92 MyGUI::RenderManager::getInstance().destroyTexture(mTexture);
93 mTexture = nullptr;
94 LOG(fmt::format("[RoR|Dashboard] Destroyed texture '{}' in RTTLayer '{}'", mTextureName, mName));
95 }
96}
97
99{
100 ROR_ASSERT(!mTexture && "RTTLayer texture already exists; destroy it first before creating a new one");
101 bool sizeIsValid = mTextureSize.width > 0 && mTextureSize.height > 0;
102 if (!mTexture && sizeIsValid)
103 {
104 std::string name = mTextureName.empty() ? MyGUI::utility::toString((size_t)this, getClassTypeName()) : mTextureName;
105 mTexture = MyGUI::RenderManager::getInstance().createTexture(name);
106 mTexture->createManual(mTextureSize.width, mTextureSize.height, MyGUI::TextureUsage::RenderTarget, MyGUI::PixelFormat::R8G8B8A8);
107 mOutOfDate = true;
108 LOG(fmt::format("[RoR|Dashboard] Created texture '{}' in RTTLayer '{}'", mTextureName, mName));
109 }
110}
111
112// ----------------------- RTTLayerManager -----------------------
113
115{
116 RTTLayer* rttLayer = nullptr;
117 if (mReusableRttLayers.size() > 0)
118 {
119 rttLayer = mReusableRttLayers.back();
120 mReusableRttLayers.pop_back();
121 LOG(fmt::format("[RoR|Dashboard] Reusing RTTLayer '{}'", rttLayer->getName()));
122 }
123 else
124 {
125 MyGUI::ILayer* layer = MyGUI::LayerManager::getInstance().createLayerAt(fmt::format("RttLayer_{}", mNextRenderdashRttNum++), "RTTLayer", 0);
126 rttLayer = dynamic_cast<RTTLayer*>(layer);
127 LOG(fmt::format("[RoR|Dashboard] Creating new RTTLayer '{}'", rttLayer->getName()));
128 }
129 return rttLayer;
130}
131
133{
134 LOG(fmt::format("[RoR|Dashboard] Recycling RTTLayer '{}'", rttLayer->getName()));
135 mReusableRttLayers.push_back(rttLayer);
136}
#define ROR_ASSERT(_EXPR)
Definition Application.h:40
void LOG(const char *msg)
Legacy alias - formerly a macro.
RTT texture 'slot' within MyGUI system; we can only create them, not destroy, so we reuse.
Definition RTTLayer.h:13
void deserialization(MyGUI::xml::ElementPtr _node, MyGUI::Version _version) override
Definition RTTLayer.cpp:26
void setTextureSize(const MyGUI::IntSize &_size)
Call before createRttTexture()
Definition RTTLayer.cpp:68
std::string mTextureName
Definition RTTLayer.h:34
bool mOutOfDate
Definition RTTLayer.h:35
void destroyRttTexture()
Definition RTTLayer.cpp:87
MyGUI::ITexture * mTexture
Definition RTTLayer.h:32
virtual ~RTTLayer()
Definition RTTLayer.cpp:21
void createRttTexture()
Definition RTTLayer.cpp:98
void setTextureName(const std::string &_name)
Call before createRttTexture()
Definition RTTLayer.cpp:80
MyGUI::IntSize mTextureSize
Definition RTTLayer.h:33
void renderToTarget(MyGUI::IRenderTarget *_target, bool _update) override
Definition RTTLayer.cpp:44
RTTLayer * CreateOrReuseRttLayer()
Definition RTTLayer.cpp:114
void RecycleRttLayer(RTTLayer *obj)
Definition RTTLayer.cpp:132
std::vector< RTTLayer * > mReusableRttLayers
MyGUI allows dynamic allocation of RTT layers, but not destruction - we reuse.
Definition RTTLayer.h:46