Paul %!s(int64=11) %!d(string=hai) anos
pai
achega
ce1bbee37b

+ 1 - 1
CIBuild/windows/build.bat

@@ -21,7 +21,7 @@ if %errorlevel% neq 0 exit /b %errorlevel%
 cpack -C "Release"
 if %errorlevel% neq 0 exit /b %errorlevel%
 
-set path=%path%;C:\boost_1_55_0_32\lib32-msvc-12.0;C:\qt-everywhere-opensource-src-4.8.6_32\bin\release;C:\Ogre\Build\bin\relwithdebinf
+set path=%path%;C:\boost_1_55_0_32\lib32-msvc-12.0;C:\qt-everywhere-opensource-src-4.8.6_32\bin\release;C:\Ogre\Build\bin\relwithdebinfo
 ctest -C "Release" --verbose
 if %errorlevel% neq 0 exit /b %errorlevel%
 

+ 5 - 1
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,8 +106,10 @@ 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;
 
         std::array<Layer, LAYER_COUNT>& getLayers(void) { return m_layers; }

+ 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;
 

+ 39 - 16
QGearsMain/src/data/QGearsBackgroundFile.cpp

@@ -166,22 +166,45 @@ 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";
+            }
+            if (data_page.value_size == 2)
+            {
+                for (uint16 y(SPRITE_HEIGHT); y--;)
+                {
+                    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));
-                const Pixel& src(it->src);
-                if (!data_page.enabled)
+                if (it->palette_page >= palette->getPages().size())
                 {
                     Ogre::LogManager::getSingleton().stream()
-                        << "Error: referencing an disabled data page";
+                        << "Error: palette page Index out of Bounds " << it->palette_page;
                 }
+                const PaletteFile::Page& palette_page(palette->getPage(it->palette_page));
                 for (uint16 y(SPRITE_HEIGHT); y--;)
                 {
                     for (uint16 x(SPRITE_WIDTH); x--;)
@@ -206,8 +229,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;
                         }
@@ -218,13 +241,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;
             }
         }
 

+ 39 - 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>
@@ -173,6 +174,11 @@ namespace QGears
         readShort( stream, pDest.unknown_1C );
         readShort( stream, pDest.data_page );
         readShort( stream, pDest.data_page2 );
+        // when data_page2 != 0, it must be used instead of data_page
+        if ( pDest.data_page2 )
+        {
+            pDest.data_page = pDest.data_page2;
+        }
         readShort( stream, pDest.colourDepth );
         readObject( stream, pDest.unknown_24 );
         pDest.unknown_24 /= unknown_24_SCALE;
@@ -192,6 +198,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 = 1.0f;
+        if ( colour == 0 )
+        {
+            pDest.a = 0.0f;
+        }
+    }
+
     //---------------------------------------------------------------------
     void
     BackgroundFileSerializer::readObject( Ogre::DataStreamPtr &stream, Page &pDest )
@@ -208,16 +231,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 );
     }
 
     //---------------------------------------------------------------------

+ 6 - 4
utilities/q-gears-launcher/src/ff7DataInstaller.cpp

@@ -47,8 +47,7 @@ void FF7DataInstaller::Convert(std::string inputDir, std::string outputDir, cons
 {
     for (const auto& file : files)
     {
-        // TODO: Comparison will be incorrect on some platforms
-        if (file == "field\\char.lgp")
+        if (file == "field/char.lgp")
         {
 
             auto fullPath = inputDir + file;
@@ -56,7 +55,7 @@ void FF7DataInstaller::Convert(std::string inputDir, std::string outputDir, cons
             ConvertFieldModels(fullPath, outputDir);
             mApp.getRoot()->removeResourceLocation(fullPath, "FFVII");
         }
-        else if (file == "field\\flevel.lgp")
+        else if (file == "field/flevel.lgp")
         {
             auto fullPath = inputDir + file;
             mApp.getRoot()->addResourceLocation(fullPath, "LGP", "FFVIIFields");
@@ -174,7 +173,10 @@ void FF7DataInstaller::ConvertFields(std::string archive, std::string outDir)
     Ogre::StringVectorPtr resources = mApp.ResMgr()->listResourceNames("FFVIIFields", "*");
     for (auto& resourceName : *resources)
     {
-        if (!QGears::StringUtil::endsWith(resourceName, ".tex") && resourceName == "md1_2")
+        if (!QGears::StringUtil::endsWith(resourceName, ".tex")
+         && !QGears::StringUtil::endsWith(resourceName, ".tut")
+         && !QGears::StringUtil::endsWith(resourceName, ".siz")
+         && resourceName != "maplist" /*&& resourceName == "blin67_4"*/)
         {
             //try
             {

+ 2 - 2
utilities/q-gears-launcher/src/mainwindow.cpp

@@ -143,8 +143,8 @@ void MainWindow::on_btnGO_clicked()
 
 		// TODO: Enumerate files or find some better way to do this :)
 		std::vector<std::string> vec;
-		vec.push_back(QDir::toNativeSeparators("field/char.lgp").toStdString());
-		vec.push_back(QDir::toNativeSeparators("field/flevel.lgp").toStdString());
+		vec.push_back(QString("field/char.lgp").toStdString());
+		vec.push_back(QString("field/flevel.lgp").toStdString());
 
 		FF7DataInstaller conversion;
 		conversion.Convert(QDir::toNativeSeparators(input).toStdString(), QDir::toNativeSeparators(output).toStdString(), vec);