Revision: 2380
          http://rigsofrods.svn.sourceforge.net/rigsofrods/?rev=2380&view=rev
Author:   rorthomas
Date:     2012-01-29 15:08:43 +0000 (Sun, 29 Jan 2012)
Log Message:
-----------
3d dashboards working

Modified Paths:
--------------
    trunk/bin/resources/mygui.zip
    trunk/source/main/gui/DashBoardManager.cpp
    trunk/source/main/gui/DashBoardManager.h
    trunk/source/main/gui/gui_manager.cpp
    trunk/source/main/physics/Beam.cpp
    trunk/source/main/physics/BeamData.h
    trunk/source/main/physics/input_output/SerializedRig.cpp

Added Paths:
-----------
    trunk/source/main/gui/RTTLayer.cpp
    trunk/source/main/gui/RTTLayer.h

Modified: trunk/bin/resources/mygui.zip
===================================================================
(Binary files differ)

Modified: trunk/source/main/gui/DashBoardManager.cpp
===================================================================
--- trunk/source/main/gui/DashBoardManager.cpp  2012-01-28 20:48:12 UTC (rev 
2379)
+++ trunk/source/main/gui/DashBoardManager.cpp  2012-01-29 15:08:43 UTC (rev 
2380)
@@ -136,15 +136,15 @@
        return -1;
 }
 
-int DashBoardManager::loadDashBoard( Ogre::String filename )
+int DashBoardManager::loadDashBoard( Ogre::String filename, bool textureLayer )
 {
        if(free_dashboard >= MAX_DASH)
        {
-               LOG("maximum amount of dashboards ber truck reached, discarding 
the rest: " + TOSTRING(MAX_DASH));
+               LOG("maximum amount of dashboards per truck reached, discarding 
the rest: " + TOSTRING(MAX_DASH));
                return 1;
        }
 
-       DashBoard *d = new DashBoard(this, filename);
+       DashBoard *d = new DashBoard(this, filename, textureLayer);
        d->setVisible(true);
 
        dashboards[free_dashboard] = d;
@@ -195,7 +195,7 @@
 
 // DASHBOARD class below
 
-DashBoard::DashBoard(DashBoardManager *manager, Ogre::String filename) : 
manager(manager), filename(filename), free_controls(0), visible(false), 
mainWidget(0)
+DashBoard::DashBoard(DashBoardManager *manager, Ogre::String filename, bool 
_textureLayer) : manager(manager), filename(filename), free_controls(0), 
visible(false), mainWidget(0), textureLayer(_textureLayer)
 {
        // use 'this' class pointer to make layout unique
        prefix = MyGUI::utility::toString(this, "_");
@@ -617,6 +617,9 @@
                loadLayoutRecursive(*iter);
        }
 
+       // if this thing should be rendered to texture, relocate the main 
window to the RTT layer
+       if(textureLayer && mainWidget)
+               mainWidget->detachFromWidget("RTTLayer1");
 }
 
 void DashBoard::setVisible(bool v)

Modified: trunk/source/main/gui/DashBoardManager.h
===================================================================
--- trunk/source/main/gui/DashBoardManager.h    2012-01-28 20:48:12 UTC (rev 
2379)
+++ trunk/source/main/gui/DashBoardManager.h    2012-01-29 15:08:43 UTC (rev 
2380)
@@ -183,7 +183,7 @@
 
        int getLinkIDForName(Ogre::String &str);
 
-       int loadDashBoard(Ogre::String filename);
+       int loadDashBoard(Ogre::String filename, bool textureLayer);
 
        void update(float &dt);
 
@@ -204,7 +204,7 @@
 {
        //friend class DashBoardManager;
 public:
-       DashBoard(DashBoardManager *manager, Ogre::String filename);
+       DashBoard(DashBoardManager *manager, Ogre::String filename, bool 
textureLayer);
        ~DashBoard();
 
        void setVisible(bool visible);
@@ -219,7 +219,7 @@
        Ogre::String filename;
        MyGUI::VectorWidgetPtr widgets;
        MyGUI::WidgetPtr mainWidget;
-       bool visible;
+       bool visible, textureLayer;
        std::string prefix;
 
        enum {ANIM_NONE,      ANIM_ROTATE, ANIM_SCALE, ANIM_TEXT, ANIM_TEXT2, 
ANIM_LAMP, ANIM_SERIES, ANIM_TRANSLATE };
@@ -255,7 +255,7 @@
                bool lastState;
        } layoutLink_t;
 
-       void loadLayout(Ogre::String filename);
+       void loadLayout(Ogre::String filename );
        void loadLayoutRecursive(MyGUI::WidgetPtr ptr);
        layoutLink_t controls[MAX_CONTROLS];
        int free_controls;

Added: trunk/source/main/gui/RTTLayer.cpp
===================================================================
--- trunk/source/main/gui/RTTLayer.cpp                          (rev 0)
+++ trunk/source/main/gui/RTTLayer.cpp  2012-01-29 15:08:43 UTC (rev 2380)
@@ -0,0 +1,100 @@
+// based on the MyGUI UnitTests
+
+#include "MyGUI_LayerItem.h"
+#include "RTTLayer.h"
+#include "MyGUI_Enumerator.h"
+#include "MyGUI_FactoryManager.h"
+#include "MyGUI_RenderManager.h"
+#include "MyGUI_Gui.h"
+#include "MyGUI_LayerNode.h"
+
+namespace MyGUI
+{
+
+       RTTLayer::RTTLayer() :
+               mTexture(nullptr),
+               mOutOfDate(false)
+       {
+       }
+
+       RTTLayer::~RTTLayer()
+       {
+               if (mTexture)
+               {
+                       
MyGUI::RenderManager::getInstance().destroyTexture(mTexture);
+                       mTexture = nullptr;
+               }
+       }
+
+       void RTTLayer::deserialization(xml::ElementPtr _node, Version _version)
+       {
+               Base::deserialization(_node, _version);
+
+               MyGUI::xml::ElementEnumerator propert = 
_node->getElementEnumerator();
+               while (propert.next("Property"))
+               {
+                       const std::string& key = propert->findAttribute("key");
+                       const std::string& value = 
propert->findAttribute("value");
+                       if (key == "TextureSize")
+                               
setTextureSize(utility::parseValue<IntSize>(value));
+                       if (key == "TextureName")
+                               setTextureName(value);
+               }
+       }
+
+       void RTTLayer::renderToTarget(IRenderTarget* _target, bool _update)
+       {
+               bool outOfDate = mOutOfDate || isOutOfDate();
+
+               if (outOfDate || _update)
+               {
+                       MyGUI::IRenderTarget* target = 
mTexture->getRenderTarget();
+                       if (target != nullptr)
+                       {
+                               target->begin();
+
+                               for (VectorILayerNode::iterator iter = 
mChildItems.begin(); iter != mChildItems.end(); ++iter)
+                                       (*iter)->renderToTarget(target, 
_update);
+
+                               target->end();
+                       }
+               }
+
+               mOutOfDate = false;
+       }
+
+       void RTTLayer::setTextureSize(const IntSize& _size)
+       {
+               if (mTextureSize == _size)
+                       return;
+
+               mTextureSize = _size;
+               if (mTexture)
+               {
+                       
MyGUI::RenderManager::getInstance().destroyTexture(mTexture);
+                       mTexture = nullptr;
+               }
+
+               MYGUI_ASSERT(mTextureSize.width * mTextureSize.height, 
"RTTLayer texture size must have non-zero width and height");
+               std::string name = mTextureName.empty() ? 
MyGUI::utility::toString((size_t)this, getClassTypeName()) : mTextureName;
+               mTexture = 
MyGUI::RenderManager::getInstance().createTexture(name);
+               mTexture->createManual(mTextureSize.width, mTextureSize.height, 
MyGUI::TextureUsage::RenderTarget, MyGUI::PixelFormat::R8G8B8A8);
+
+               mOutOfDate = true;
+       }
+
+       void RTTLayer::setTextureName(const std::string& _name)
+       {
+               mTextureName = _name;
+
+               if (mTexture != nullptr)
+               {
+                       IntSize size = mTextureSize;
+                       mTextureSize.clear();
+                       setTextureSize(size);
+               }
+
+               mOutOfDate = true;
+       }
+
+} // namespace MyGUI

Added: trunk/source/main/gui/RTTLayer.h
===================================================================
--- trunk/source/main/gui/RTTLayer.h                            (rev 0)
+++ trunk/source/main/gui/RTTLayer.h    2012-01-29 15:08:43 UTC (rev 2380)
@@ -0,0 +1,37 @@
+// based on the MyGUI UnitTests
+
+#ifndef __MYGUI_RTT_LAYER_H__
+#define __MYGUI_RTT_LAYER_H__
+
+#include "MyGUI_Prerequest.h"
+#include "MyGUI_Types.h"
+#include "MyGUI_OverlappedLayer.h"
+
+namespace MyGUI
+{
+
+       class RTTLayer :
+               public OverlappedLayer
+       {
+               MYGUI_RTTI_DERIVED( RTTLayer )
+
+       public:
+               RTTLayer();
+               virtual ~RTTLayer();
+
+               virtual void deserialization(xml::ElementPtr _node, Version 
_version);
+               virtual void renderToTarget(IRenderTarget* _target, bool 
_update);
+
+               void setTextureSize(const IntSize& _size);
+               void setTextureName(const std::string& _name);
+
+       private:
+               MyGUI::ITexture* mTexture;
+               IntSize mTextureSize;
+               std::string mTextureName;
+               bool mOutOfDate;
+       };
+
+} // namespace MyGUI
+
+#endif // __MYGUI_RTT_LAYER_H__

Modified: trunk/source/main/gui/gui_manager.cpp
===================================================================
--- trunk/source/main/gui/gui_manager.cpp       2012-01-28 20:48:12 UTC (rev 
2379)
+++ trunk/source/main/gui/gui_manager.cpp       2012-01-29 15:08:43 UTC (rev 
2380)
@@ -26,6 +26,7 @@
 #include "RoRWindowEventUtilities.h"
 #include <MyGUI_OgrePlatform.h>
 #include <MyGUI_LanguageManager.h>
+#include "RTTLayer.h"
 
 #include "Console.h"
 #include "BeamFactory.h"
@@ -93,8 +94,16 @@
        mPlatform = new MyGUI::OgrePlatform();
        mPlatform->initialise(mWindow, mSceneManager, 
Ogre::ResourceGroupManager::AUTODETECT_RESOURCE_GROUP_NAME, gui_logfilename); 
// use cache resource group so preview images are working
        mGUI = new MyGUI::Gui();
-       mGUI->initialise(mResourceFileName);
+
+       // empty init
+       mGUI->initialise("");
+
+       // add layer factory
+       
MyGUI::FactoryManager::getInstance().registerFactory<MyGUI::RTTLayer>("Layer");
        
+       // then load the actual config
+       MyGUI::ResourceManager::getInstance().load(mResourceFileName);
+
        
MyGUI::ResourceManager::getInstance().load(LanguageEngine::Instance().getMyGUIFontConfigFilename());
 
        // move the mouse into the middle of the screen, assuming we start at 
the top left corner (0,0)
@@ -201,4 +210,4 @@
        return files->at(num).filename;
 }
 
-#endif //MYGUI
\ No newline at end of file
+#endif //MYGUI

Modified: trunk/source/main/physics/Beam.cpp
===================================================================
--- trunk/source/main/physics/Beam.cpp  2012-01-28 20:48:12 UTC (rev 2379)
+++ trunk/source/main/physics/Beam.cpp  2012-01-29 15:08:43 UTC (rev 2380)
@@ -1208,6 +1208,12 @@
                ssm->trigStop(trucknum, SS_TRIG_REVERSE_GEAR);
 #endif //OPENAL
 
+#ifdef USE_MYGUI
+       updateDashBoards(tratio);
+       if(dash)
+               dash->update(tratio);
+#endif // USE_MYGUI
+
        BES_GFX_STOP(BES_GFX_calcNetwork);
 }
 
@@ -2044,7 +2050,8 @@
        
 #ifdef USE_MYGUI
        updateDashBoards(dt);
-       dash->update(dt);
+       if(dash)
+               dash->update(dt);
 #endif // USE_MYGUI
 
 
@@ -3501,7 +3508,8 @@
        {
                //going outside
 #ifdef USE_MYGUI
-               dash->setVisible(false);
+               if(dash)
+                       dash->setVisible(false);
 #endif // USE_MYGUI
 
                // disable cabin light before going out
@@ -5511,16 +5519,25 @@
 
 #ifdef USE_MYGUI
        // now load any dashboards
-       if(dashBoardLayout.empty())
+       if(dash)
        {
-               // load default for a truck
-               if(driveable == TRUCK)
-                       dash->loadDashBoard("default_dashboard.layout");
-       } else
-       {
-               dash->loadDashBoard(dashBoardLayout);
+               if(dashBoardLayouts.empty())
+               {
+                       // load default for a truck
+                       if(driveable == TRUCK)
+                       {
+                               dash->loadDashBoard("default_dashboard.layout", 
false);
+                               // TODO: load texture dashboard by default as 
well
+                               dash->loadDashBoard("default_dashboard.layout", 
true);
+                       }
+               } else
+               {
+                       // load all dashs
+                       for(int i=0; i < dashBoardLayouts.size(); i++)
+                               dash->loadDashBoard(dashBoardLayouts[i].first, 
dashBoardLayouts[i].second);
+               }
+               dash->setVisible(false);
        }
-       dash->setVisible(false);
 #endif // USE_MYGUI
 
        return res;
@@ -5618,6 +5635,7 @@
 void Beam::updateDashBoards(float &dt)
 {
 #ifdef USE_MYGUI
+       if(!dash) return;
        // some temp vars
        Vector3 dir;
 

Modified: trunk/source/main/physics/BeamData.h
===================================================================
--- trunk/source/main/physics/BeamData.h        2012-01-28 20:48:12 UTC (rev 
2379)
+++ trunk/source/main/physics/BeamData.h        2012-01-29 15:08:43 UTC (rev 
2380)
@@ -1029,7 +1029,7 @@
        float odometerTotal;
        float odometerUser;
 
-       Ogre::String dashBoardLayout;
+       std::vector<std::pair<Ogre::String, bool> > dashBoardLayouts;
        Ogre::String beamHash;
 };
 

Modified: trunk/source/main/physics/input_output/SerializedRig.cpp
===================================================================
--- trunk/source/main/physics/input_output/SerializedRig.cpp    2012-01-28 
20:48:12 UTC (rev 2379)
+++ trunk/source/main/physics/input_output/SerializedRig.cpp    2012-01-29 
15:08:43 UTC (rev 2380)
@@ -225,7 +225,7 @@
 
        odometerTotal = 0;
        odometerUser  = 0;
-       dashBoardLayout = String();
+       dashBoardLayouts.clear();
 
        memset(default_node_options, 0, 49);
        memset(texname, 0, 1023);
@@ -4189,8 +4189,12 @@
                                }
                                else if(!strncmp(keyword, "dashboard", 255) && 
strnlen(value, 255) > 0)
                                {
-                                       dashBoardLayout = String(value);
+                                       
dashBoardLayouts.push_back(std::pair<Ogre::String, bool>(String(value), false));
                                }
+                               else if(!strncmp(keyword, "texturedashboard", 
255) && strnlen(value, 255) > 0)
+                               {
+                                       
dashBoardLayouts.push_back(std::pair<Ogre::String, bool>(String(value), true));
+                               }
 
                        }
                        else if (c.mode == BTS_MINIMASS)

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.


------------------------------------------------------------------------------
Try before you buy = See our experts in action!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-dev2
_______________________________________________
Rigsofrods-devel mailing list
Rigsofrods-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rigsofrods-devel

Reply via email to