1 /*!
2 	@file
3 	@author		Albert Semenov
4 	@date		08/2012
5 */
6 
7 #include "MyGUI_ExportRenderManager.h"
8 #include "MyGUI_ExportDiagnostic.h"
9 #include "MyGUI_Gui.h"
10 #include "MyGUI_Timer.h"
11 #include "MyGUI_FactoryManager.h"
12 
13 namespace MyGUI
14 {
15 
getInstance()16 	ExportRenderManager& ExportRenderManager::getInstance()
17 	{
18 		return *getInstancePtr();
19 	}
20 
getInstancePtr()21 	ExportRenderManager* ExportRenderManager::getInstancePtr()
22 	{
23 		return static_cast<ExportRenderManager*>(RenderManager::getInstancePtr());
24 	}
25 
ExportRenderManager()26 	ExportRenderManager::ExportRenderManager() :
27 		mUpdate(false),
28 		mCurrentLayer(nullptr)
29 	{
30 	}
31 
initialise()32 	void ExportRenderManager::initialise()
33 	{
34 		MYGUI_PLATFORM_LOG(Info, "* Initialise: " << getClassTypeName());
35 
36 		mUpdate = false;
37 
38 		MYGUI_PLATFORM_LOG(Info, getClassTypeName() << " successfully initialized");
39 	}
40 
shutdown()41 	void ExportRenderManager::shutdown()
42 	{
43 		MYGUI_PLATFORM_LOG(Info, "* Shutdown: " << getClassTypeName());
44 
45 		destroyAllTextures();
46 		mBatchInfo.clear();
47 		mExportVertexBuffer.clear();
48 
49 		MYGUI_PLATFORM_LOG(Info, getClassTypeName() << " successfully shutdown");
50 	}
51 
createVertexBuffer()52 	IVertexBuffer* ExportRenderManager::createVertexBuffer()
53 	{
54 		ExportVertexBuffer* buffer = new ExportVertexBuffer();
55 		mExportVertexBuffer.push_back(buffer);
56 
57 		return buffer;
58 	}
59 
destroyVertexBuffer(IVertexBuffer * _buffer)60 	void ExportRenderManager::destroyVertexBuffer(IVertexBuffer* _buffer)
61 	{
62 		VectorExportVertexBuffer::iterator item = std::find(mExportVertexBuffer.begin(), mExportVertexBuffer.end(), _buffer);
63 		mExportVertexBuffer.erase(item);
64 
65 		delete _buffer;
66 	}
67 
doRender(IVertexBuffer * _buffer,ITexture * _texture,size_t _count)68 	void ExportRenderManager::doRender(IVertexBuffer* _buffer, ITexture* _texture, size_t _count)
69 	{
70 		if (_texture == nullptr || _buffer == nullptr || _count == 0)
71 			return;
72 
73 		ExportTexture* texture = static_cast<ExportTexture*>(_texture);
74 		ExportVertexBuffer* vertexes = static_cast<ExportVertexBuffer*>(_buffer);
75 
76 		mBatchInfo.push_back(RenderBatchInfo(vertexes, texture, _count, mCurrentLayer));
77 	}
78 
drawOneFrame()79 	void ExportRenderManager::drawOneFrame()
80 	{
81 		Gui* gui = Gui::getInstancePtr();
82 		if (gui == nullptr)
83 			return;
84 
85 		static Timer timer;
86 		static unsigned long last_time = timer.getMilliseconds();
87 		unsigned long now_time = timer.getMilliseconds();
88 		unsigned long time = now_time - last_time;
89 
90 		onFrameEvent((float)((double)(time) / (double)1000));
91 
92 		last_time = now_time;
93 
94 		begin();
95 		onRenderToTarget(this, mUpdate);
96 		end();
97 
98 		mUpdate = false;
99 	}
100 
begin()101 	void ExportRenderManager::begin()
102 	{
103 		mBatchInfo.clear();
104 
105 		for (VectorExportVertexBuffer::iterator item = mExportVertexBuffer.begin(); item != mExportVertexBuffer.end(); item ++)
106 			(*item)->setChange(false);
107 	}
108 
end()109 	void ExportRenderManager::end()
110 	{
111 	}
112 
createTexture(const std::string & _name)113 	ITexture* ExportRenderManager::createTexture(const std::string& _name)
114 	{
115 		return nullptr;
116 	}
117 
destroyTexture(ITexture * _texture)118 	void ExportRenderManager::destroyTexture(ITexture* _texture)
119 	{
120 		for (MapTexture::iterator textureIter = mTextures.begin(); textureIter != mTextures.end(); textureIter ++)
121 		{
122 			if ((*textureIter).second == _texture)
123 			{
124 				delete (*textureIter).second;
125 				mTextures.erase(textureIter);
126 				break;
127 			}
128 		}
129 	}
130 
getTexture(const std::string & _name)131 	ITexture* ExportRenderManager::getTexture(const std::string& _name)
132 	{
133 		MapTexture::iterator textureIter = mTextures.find(_name);
134 		if (textureIter != mTextures.end())
135 			return (*textureIter).second;
136 
137 		return nullptr;
138 	}
139 
isFormatSupported(PixelFormat _format,TextureUsage _usage)140 	bool ExportRenderManager::isFormatSupported(PixelFormat _format, TextureUsage _usage)
141 	{
142 		return _format == PixelFormat::R8G8B8A8;
143 	}
144 
setViewSize(int _width,int _height)145 	void ExportRenderManager::setViewSize(int _width, int _height)
146 	{
147 		if (_height == 0)
148 			_height = 1;
149 		if (_width == 0)
150 			_width = 1;
151 
152 		mViewSize.set(_width, _height);
153 
154 		mInfo.maximumDepth = 0.0f;
155 		mInfo.hOffset = -0.5f / float(mViewSize.width);
156 		mInfo.vOffset = -0.5f / float(mViewSize.height);
157 		mInfo.aspectCoef = float(mViewSize.height) / float(mViewSize.width);
158 		mInfo.pixScaleX = 1.0f / float(mViewSize.width);
159 		mInfo.pixScaleY = 1.0f / float(mViewSize.height);
160 
161 		onResizeView(mViewSize);
162 
163 		mUpdate = true;
164 	}
165 
destroyAllTextures()166 	void ExportRenderManager::destroyAllTextures()
167 	{
168 		for (MapTexture::iterator textureIter = mTextures.begin(); textureIter != mTextures.end(); textureIter ++)
169 			delete (*textureIter).second;
170 		mTextures.clear();
171 	}
172 
getInfo()173 	const RenderTargetInfo& ExportRenderManager::getInfo()
174 	{
175 		return mInfo;
176 	}
177 
getViewSize() const178 	const IntSize& ExportRenderManager::getViewSize() const
179 	{
180 		return mViewSize;
181 	}
182 
getVertexFormat()183 	VertexColourType ExportRenderManager::getVertexFormat()
184 	{
185 		return VertexColourType::ColourARGB;
186 	}
187 
getBatchInfo(size_t _index)188 	RenderBatchInfo* ExportRenderManager::getBatchInfo(size_t _index)
189 	{
190 		if (_index < mBatchInfo.size())
191 			return &mBatchInfo[_index];
192 		return nullptr;
193 	}
194 
addTexture(const std::string & _name,size_t _id,int _width,int _height)195 	void ExportRenderManager::addTexture(const std::string& _name, size_t _id, int _width, int _height)
196 	{
197 		ExportTexture* texture = new ExportTexture(_name);
198 		texture->setId(_id);
199 		texture->setWidth(_width);
200 		texture->setHeight(_height);
201 
202 		mTextures[_name] = texture;
203 	}
204 
doRenderLayer(ILayer * _layer)205 	void ExportRenderManager::doRenderLayer(ILayer* _layer)
206 	{
207 		mCurrentLayer = _layer;
208 	}
209 
210 }
211