00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00035 #include "SO3BitmapWidget.h"
00036 #include "../SO3Material/SO3Material.h"
00037 #include "../SO3Renderer/SO3ViewPort.h"
00038 #include "../SO3Renderer/SO3Window.h"
00039 #include "../SO3SceneGraph/SO3Scene.h"
00040 #include "../SO3Renderer/SO3Root.h"
00041 #include "../SO3Utils/SO3ConversionTools.h"
00042
00043 #include "SO3WidgetManager.h"
00044
00045 namespace SO3
00046 {
00047
00048 SBitmapWidget::SBitmapWidget(SScene* targetScene, std::string bitmapWidgetName, int xPos, int yPos, unsigned short widgetWidth, unsigned short widgetHeight, SViewPort* targetViewport, unsigned int widgetZOrder) : SWidget(targetScene, bitmapWidgetName, xPos, yPos, widgetWidth, widgetHeight, targetViewport, widgetZOrder, SO3_BITMAP_WIDGET_TYPE)
00049 {
00050 CommonConstructorSequence();
00051 }
00052
00053 SBitmapWidget::SBitmapWidget(SScene* targetScene, std::string bitmapWidgetName, int xPos, int yPos, unsigned short widgetWidth, unsigned short widgetHeight, SViewPort* targetViewport) : SWidget(targetScene, bitmapWidgetName, xPos, yPos, widgetWidth, widgetHeight, targetViewport, SO3_BITMAP_WIDGET_TYPE)
00054 {
00055 CommonConstructorSequence();
00056 }
00057
00058 SBitmapWidget::SBitmapWidget(SScene* targetScene, std::string bitmapWidgetName, unsigned short widgetWidth, unsigned short widgetHeight, SMaterial* targetMaterial, unsigned short targetTechnique, unsigned short targetPass, unsigned short targetTextureUnit) : SWidget(targetScene, bitmapWidgetName, widgetWidth, widgetHeight, targetMaterial, targetTechnique, targetPass, targetTextureUnit, SO3_BITMAP_WIDGET_TYPE)
00059 {
00060 CommonConstructorSequence();
00061 }
00062
00063 void SBitmapWidget::CommonConstructorSequence()
00064 {
00065 iLastWidth = 0;
00066 iLastHeight = 0;
00067 pixelsData = 0;
00068 bLastAlphaState = false;
00069 }
00070
00071 SBitmapWidget::~SBitmapWidget()
00072 {
00073 if (pixelsData)
00074 free(pixelsData);
00075 }
00076
00077 void SBitmapWidget::LoadURL(const std::string& url)
00078 {
00079
00080 OGRE_EXCEPT(Ogre::Exception::ERR_NOT_IMPLEMENTED, "Cannot directly load an URL in a Bitmap widget, use \"UpdateRawData\" function!", "SBitmapWidget::LoadURL");
00081 }
00082
00083 void SBitmapWidget::LoadFile(const std::string& file)
00084 {
00085
00086 OGRE_EXCEPT(Ogre::Exception::ERR_NOT_IMPLEMENTED, "Cannot directly load a file directly in a Bitmap widget, use \"UpdateRawData\" function!", "SBitmapWidget::LoadFile");
00087 }
00088
00089 void SBitmapWidget::UpdateRawData(PtrObjBitmap scolBitmap)
00090 {
00091
00092 if((scolBitmap->TailleW > 0) && (scolBitmap->TailleH > 0))
00093 {
00094 CheckSizeAndAlloc(scolBitmap->TailleW, scolBitmap->TailleH, false);
00095
00096
00097 Ogre::HardwarePixelBufferSharedPtr pixelBuffer = renderingTexture->getBuffer();
00098 pixelBuffer->lock(Ogre::HardwareBuffer::HBL_DISCARD);
00099 const Ogre::PixelBox& pixelBox = pixelBuffer->getCurrentLock();
00100
00101
00102 ConversionTools::ScolBitmapGetRGB(scolBitmap, static_cast<unsigned char*>(pixelsData));
00103
00104
00105 const Ogre::PixelBox scolPixelBox(scolBitmap->TailleW, scolBitmap->TailleH, 1, Ogre::PF_R8G8B8, pixelsData);
00106
00107
00108 Ogre::Image::scale(scolPixelBox, pixelBox);
00109
00110
00111 pixelBuffer->unlock();
00112 }
00113 }
00114
00115 void SBitmapWidget::UpdateRawData(PtrObjBitmap scolBitmap, PtrObjBitmap scolAlphaBitmap)
00116 {
00117 if (scolAlphaBitmap == 0)
00118 {
00119 UpdateRawData(scolBitmap);
00120 return;
00121 }
00122
00123
00124 if((scolBitmap->TailleW > 0) && (scolBitmap->TailleH > 0))
00125 {
00126
00127 Ogre::HardwarePixelBufferSharedPtr pixelBuffer = renderingTexture->getBuffer();
00128 pixelBuffer->lock(Ogre::HardwareBuffer::HBL_DISCARD);
00129 const Ogre::PixelBox& pixelBox = pixelBuffer->getCurrentLock();
00130
00131 CheckSizeAndAlloc(scolBitmap->TailleW, scolBitmap->TailleH, true);
00132
00133
00134 ConversionTools::ScolBitmapGetRGBA(scolBitmap, scolAlphaBitmap, static_cast<Ogre::uint32*>(pixelsData));
00135
00136
00137 const Ogre::PixelBox finalPixelBox(scolBitmap->TailleW, scolBitmap->TailleH, 1, Ogre::PF_R8G8B8A8, pixelsData);
00138
00139
00140 Ogre::Image::scale(finalPixelBox, pixelBox);
00141
00142
00143 pixelBuffer->unlock();
00144 }
00145 }
00146
00147 void SBitmapWidget::InjectMouseMove(int xPos, int yPos, MouseButtonId button)
00148 {
00149
00150 }
00151
00152 void SBitmapWidget::InjectMouseWheel(int scrollX, int scrollY, int relativeScroll)
00153 {
00154
00155 }
00156
00157 void SBitmapWidget::InjectMouseDown(int xPos, int yPos, MouseButtonId button)
00158 {
00159
00160 }
00161
00162 void SBitmapWidget::InjectMouseUp(int xPos, int yPos, MouseButtonId button)
00163 {
00164
00165 }
00166
00167 void SBitmapWidget::InjectKeyEvent(UINT msg, WindowHandle hwnd, WPARAM wParam, LPARAM lParam)
00168 {
00169
00170 }
00171
00172 void SBitmapWidget::InjectTextEvent(std::string utf8)
00173 {
00174
00175 }
00176
00177 void SBitmapWidget::SetFocusImpl(bool focusOnWidget)
00178 {
00179
00180 }
00181
00182 void SBitmapWidget::SetTransparencyImpl(bool enableTransparency)
00183 {
00184
00185 }
00186 void SBitmapWidget::RunScriptFunction(std::string functionName, std::vector<std::string> argumentList)
00187 {
00188
00189 }
00190
00191 void SBitmapWidget::SetKeyboardEnableImpl(bool enableKeyboardOnWidget)
00192 {
00193
00194 }
00195
00196 void SBitmapWidget::SetMouseEnableImpl(bool enableMouseOnWidget)
00197 {
00198
00199 }
00200
00201 void SBitmapWidget::SetSizeImpl(unsigned short newWidth, unsigned short newHeight)
00202 {
00203
00204 }
00205
00206 int SBitmapWidget::GetPixelUnder(int posX, int posY)
00207 {
00208
00209
00210
00211
00212
00213
00214
00215 return -1;
00216 }
00217
00218 void SBitmapWidget::CheckSizeAndAlloc(unsigned int newWidth, unsigned int newHeight, bool alpha)
00219 {
00220 if ((newWidth != iLastWidth) || (newHeight != iLastHeight) || (alpha != bLastAlphaState))
00221 {
00222 if (pixelsData)
00223 free(pixelsData);
00224
00225 iLastWidth = newWidth;
00226 iLastHeight = newHeight;
00227 bLastAlphaState = alpha;
00228
00229 int nbBytes = alpha ? 4 : 3;
00230 int size = alpha ? sizeof(Ogre::uint32*) : (sizeof(unsigned char*) * nbBytes);
00231 pixelsData = (void*)malloc(newWidth * newHeight * size);
00232 }
00233 }
00234
00235 void SBitmapWidget::loadResource(Ogre::Resource* resource)
00236 {
00237 Ogre::Texture* tex = static_cast<Ogre::Texture*>(resource);
00238 tex->setTextureType(Ogre::TEX_TYPE_2D);
00239 tex->setWidth(textureWidth);
00240 tex->setHeight(textureHeight);
00241 tex->setNumMipmaps(0);
00242 tex->setFormat(Ogre::PF_BYTE_BGRA);
00243 tex->setUsage(Ogre::TU_DYNAMIC_WRITE_ONLY_DISCARDABLE);
00244 tex->createInternalResources();
00245
00246 if(pixelsData)
00247 {
00248 Ogre::HardwarePixelBufferSharedPtr pixelBuffer = renderingTexture->getBuffer();
00249 pixelBuffer->lock(Ogre::HardwareBuffer::HBL_DISCARD);
00250 const Ogre::PixelBox& pixelBox = pixelBuffer->getCurrentLock();
00251
00252
00253 const Ogre::PixelBox scolPixelBox(iLastWidth, iLastHeight, 1, bLastAlphaState ? Ogre::PF_R8G8B8A8 : Ogre::PF_R8G8B8, pixelsData);
00254
00255
00256 Ogre::Image::scale(scolPixelBox, pixelBox);
00257
00258
00259 pixelBuffer->unlock();
00260 }
00261
00262 forceRenderingUpdate = true;
00263 }
00264
00265 }