فهرست منبع

Merge pull request #76 from myst6re/master

Implementing depth=2 backgrounds
paulsapps 11 سال پیش
والد
کامیت
5efb1dc63a

+ 4 - 3
QGearsMain/include/data/QGearsBackgroundFile.h

@@ -93,8 +93,10 @@ namespace QGears
             SpriteList sprites;
         };
 
+        typedef PaletteFile::Color Color;
 
-        typedef std::vector<uint8>  Buffer;
+        typedef std::vector<uint8> Buffer;
+        typedef std::vector<Color> Colors;
 
         struct Page
         {
@@ -104,10 +106,9 @@ namespace QGears
             // uint8 if value_size == 1, uint16 if value_size == 2
             //uint8 data[PAGE_DATA_WIDTH][PAGE_DATA_HEIGHT];
             Buffer data;
+            Colors colors;
         };
 
-        typedef PaletteFile::Color Color;
-
         virtual Layer* getLayers ( void ) { return m_layers;  }
         virtual uint8* getPalette( void ) { return m_palette; }
         virtual Page*  getPages  ( void ) { return m_pages;   }

+ 10 - 0
QGearsMain/include/data/QGearsBackgroundFileSerializer.h

@@ -41,6 +41,14 @@ namespace QGears
 
         virtual void    importBackgroundFile( Ogre::DataStreamPtr &stream, BackgroundFile *pDest );
 
+        enum {
+            BIT_MASK_RED    = 0xF800
+           ,BIT_MASK_GREEN  = 0x07C0
+           ,BIT_MASK_BLUE   = 0x001F
+           ,BIT_SIZE        = 0x001F
+           ,BIT_MASK_RGB    = BIT_MASK_BLUE | BIT_MASK_GREEN | BIT_MASK_RED
+        };
+
         struct Header
         {
             uint16 unused;
@@ -51,6 +59,7 @@ namespace QGears
         typedef BackgroundFile::SpriteData  SpriteData;
         typedef BackgroundFile::SpriteList  SpriteList;
         typedef BackgroundFile::Page        Page;
+        typedef BackgroundFile::Color       Color;
 
     protected:
         virtual void 	readFileHeader( Ogre::DataStreamPtr &stream );
@@ -64,6 +73,7 @@ namespace QGears
         virtual void    readLayer( Ogre::DataStreamPtr &stream, Layer *pDest, size_t layer_index  );
 
         virtual void    readObject( Ogre::DataStreamPtr &stream, SpriteData &pDest  );
+        virtual void    readObject( Ogre::DataStreamPtr &stream, Color &pDest  );
         virtual void    readObject( Ogre::DataStreamPtr &stream, Page &pDest  );
         using Serializer::readObject;
 

+ 36 - 18
QGearsMain/src/data/QGearsBackgroundFile.cpp

@@ -158,22 +158,40 @@ namespace QGears
             ;++it)
         {
             const Page& data_page( m_pages[it->data_page] );
-            if (data_page.value_size == 2)
+            const Pixel& src(it->src);
+            if (!data_page.enabled)
             {
-                // TODO FIX ME
                 Ogre::LogManager::getSingleton().stream()
-                    << "Error: value_size(RGB16) not implemented";
-                break;
+                    << "Error: referencing an disabled data page";
             }
-            else if (data_page.value_size == 1)
+            if (data_page.value_size == 2)
             {
-                const PaletteFile::Page& palette_page(palette->getPage(it->palette_page));
-                const Pixel& src(it->src);
-                if (!data_page.enabled)
+                for (uint16 y(SPRITE_HEIGHT); y--;)
                 {
-                    Ogre::LogManager::getSingleton().stream()
-                        << "Error: referencing an disabled data page";
+                    for (uint16 x(SPRITE_WIDTH); x--;)
+                    {
+                        size_t data_index((src.y + y) * PAGE_DATA_WIDTH + src.x + x);
+                        if (data_index >= data_page.colors.size())
+                        {
+                            Ogre::LogManager::getSingleton().stream()
+                                << "Error: data page Index out of Bounds " << data_index;
+                        }
+
+                        Color colour(data_page.colors.at(data_index));
+                        data_index = (dst_y + y) * row_pitch + dst_x + x;
+                        if (data_index >= pixel_count)
+                        {
+                            Ogre::LogManager::getSingleton().stream()
+                                << "Error: writing Pixel out of Bounds " << data_index
+                                << " " << (dst_x + x) << " x " << dst_y + y;
+                        }
+                        color[data_index] = colour.getAsARGB();
+                    }
                 }
+            }
+            else if (data_page.value_size == 1)
+            {
+                const PaletteFile::Page& palette_page(palette->getPage(it->palette_page));
                 for (uint16 y(SPRITE_HEIGHT); y--;)
                 {
                     for (uint16 x(SPRITE_WIDTH); x--;)
@@ -198,8 +216,8 @@ namespace QGears
                                 << "Error: writing Pixel out of Bounds " << data_index
                                 << " " << (dst_x + x) << " x " << dst_y + y;
                         }
-                        Ogre::ColourValue colour(palette_page[index]);
-                        if (index == 0 && colour != Ogre::ColourValue::Black)
+                        Color colour(palette_page[index]);
+                        if (index == 0 && colour != Color::Black)
                         {
                             colour.a = 0;
                         }
@@ -210,13 +228,13 @@ namespace QGears
                         color[data_index] = colour.getAsARGB();
                     }
                 }
+            }
 
-                dst_x += SPRITE_WIDTH;
-                if (dst_x >= width)
-                {
-                    dst_x = 0;
-                    dst_y += SPRITE_HEIGHT;
-                }
+            dst_x += SPRITE_WIDTH;
+            if (dst_x >= width)
+            {
+                dst_x = 0;
+                dst_y += SPRITE_HEIGHT;
             }
         }
 

+ 34 - 7
QGearsMain/src/data/QGearsBackgroundFileSerializer.cpp

@@ -24,6 +24,7 @@ THE SOFTWARE.
 -----------------------------------------------------------------------------
 */
 #include "data/QGearsBackgroundFileSerializer.h"
+#include "data/QGearsPaletteFileSerializer.h"
 
 #include <OgreException.h>
 #include <OgreLogManager.h>
@@ -193,6 +194,23 @@ namespace QGears
         }
     }
 
+    //---------------------------------------------------------------------
+    void
+    BackgroundFileSerializer::readObject( Ogre::DataStreamPtr& stream, Color& pDest )
+    {
+        uint16 colour;
+        readShort( stream, colour );
+        pDest.r = static_cast<float>(( colour & BIT_MASK_RED   ) >> 11);
+        pDest.g = static_cast<float>(( colour & BIT_MASK_GREEN ) >>  6);
+        pDest.b = static_cast<float>(colour & BIT_MASK_BLUE);
+        pDest /= BIT_SIZE;
+        pDest.a = 0.0f;
+        if ( colour == 0 )
+        {
+            pDest.a = 1.0f;
+        }
+    }
+
     //---------------------------------------------------------------------
     void
     BackgroundFileSerializer::readObject( Ogre::DataStreamPtr &stream, Page &pDest )
@@ -209,16 +227,25 @@ namespace QGears
                 ,"BackgroundFileSerializer::readObject" );
         }
 
+        size_t color_count( BackgroundFile::PAGE_DATA_SIZE );
+        pDest.colors.clear();
+        pDest.data.clear();
+
         if( pDest.value_size == 2 )
         {
-            Ogre::LogManager::getSingleton().stream()
-                << "Warning: Page value_size == 2 @" << stream->tell();
+            pDest.colors.reserve( color_count );
+            for( size_t i( color_count ); i--; )
+            {
+                Color colourDest;
+                readObject( stream, colourDest );
+                pDest.colors.push_back( colourDest );
+            }
+        }
+        else
+        {
+            pDest.data.resize( color_count );
+            stream->read( &pDest.data[0], color_count );
         }
-
-        size_t data_size( pDest.value_size * BackgroundFile::PAGE_DATA_SIZE );
-        pDest.data.clear();
-        pDest.data.resize( data_size );
-        stream->read( &pDest.data[0], data_size );
     }
 
     //---------------------------------------------------------------------