Преглед изворни кода

Merge branch 'feature/background-special-blending'

Conflicts:
	QGearsMain/src/core/Background2D.cpp
	QGearsMain/src/core/XmlBackground2DFile.cpp
myst6re пре 11 година
родитељ
комит
40282a8194

+ 6 - 0
QGearsMain/include/core/Background2D.h

@@ -122,6 +122,12 @@ private:
     unsigned int                          m_AddMaxVertexCount;
     Ogre::MaterialPtr                     m_AddMaterial;
 
+    // subtract blended
+    Ogre::RenderOperation                 m_SubtractRenderOp;
+    Ogre::HardwareVertexBufferSharedPtr   m_SubtractVertexBuffer;
+    unsigned int                          m_SubtractMaxVertexCount;
+    Ogre::MaterialPtr                     m_SubtractMaterial;
+
     Entity*                               m_ScrollEntity;
     Ogre::Vector2                         m_ScrollPositionStart;
     Ogre::Vector2                         m_ScrollPositionEnd;

+ 1 - 0
QGearsMain/include/map/QGearsBackground2DFileXMLSerializer.h

@@ -52,6 +52,7 @@ namespace QGears
 
         static const String BLENDING_ALPHA;
         static const String BLENDING_ADD;
+        static const String BLENDING_SUBTRACT;
 
         template<typename ValueType> void
         readVector( TiXmlNode &node, const String &tag, std::vector<ValueType> &pDest )

+ 1 - 0
QGearsMain/include/map/QGearsTile.h

@@ -12,6 +12,7 @@ namespace QGears
     {
         B_ALPHA
        ,B_ADD
+       ,B_SUBTRACT
     };
 
     struct KeyFrame

+ 66 - 0
QGearsMain/src/core/Background2D.cpp

@@ -19,6 +19,7 @@ ConfigVar cv_background2d_manual("background2d_manual", "Manual scrolling for 2d
 Background2D::Background2D():
     m_AlphaMaxVertexCount(0),
     m_AddMaxVertexCount(0),
+    m_SubtractMaxVertexCount(0),
 
     m_ScrollEntity(nullptr),
     m_ScrollPositionStart(Ogre::Vector2::ZERO),
@@ -67,6 +68,22 @@ Background2D::Background2D():
     tex->setNumMipmaps(-1);
     tex->setTextureFiltering(Ogre::TFO_NONE);
 
+    m_SubtractMaterial = Ogre::MaterialManager::getSingleton().create("Background2DSubtract", "General");
+    pass = m_SubtractMaterial->getTechnique(0)->getPass(0);
+    pass->setVertexColourTracking(Ogre::TVC_AMBIENT);
+    pass->setCullingMode(Ogre::CULL_NONE);
+    pass->setDepthCheckEnabled(true);
+    pass->setDepthWriteEnabled(true);
+    pass->setLightingEnabled(false);
+    pass->setSceneBlending(Ogre::SBT_ADD);
+    pass->setSceneBlendingOperation(Ogre::SBO_SUBTRACT);
+    pass->setAlphaRejectFunction(Ogre::CMPF_LESS);
+    pass->setAlphaRejectValue(0);
+    tex = pass->createTextureUnitState();
+    tex->setTextureName("system/blank.png");
+    tex->setNumMipmaps(-1);
+    tex->setTextureFiltering(Ogre::TFO_NONE);
+
     m_SceneManager->addRenderQueueListener(this);
 }
 
@@ -251,6 +268,10 @@ Background2D::OnResize()
         {
             vertex_buffer = m_AddVertexBuffer;
         }
+        else if( m_Tiles[ i ].blending == QGears::B_SUBTRACT )
+        {
+            vertex_buffer = m_SubtractVertexBuffer;
+        }
 
         float* writeIterator = (float*)vertex_buffer->lock(Ogre::HardwareBuffer::HBL_NORMAL);
 
@@ -489,6 +510,9 @@ Background2D::SetImage(const Ogre::String& image)
     pass = m_AddMaterial->getTechnique(0)->getPass(0);
     tex = pass->getTextureUnitState(0);
     tex->setTextureName(image);
+    pass = m_SubtractMaterial->getTechnique(0)->getPass(0);
+    tex = pass->getTextureUnitState(0);
+    tex->setTextureName(image);
 }
 
 
@@ -579,6 +603,12 @@ Background2D::AddTile(const int x, const int y, const int width, const int heigh
         vertex_buffer = m_AddVertexBuffer;
         max_vertex_count = m_AddMaxVertexCount;
     }
+    else if( blending == QGears::B_SUBTRACT )
+    {
+        render_op = m_SubtractRenderOp;
+        vertex_buffer = m_SubtractVertexBuffer;
+        max_vertex_count = m_SubtractMaxVertexCount;
+    }
     else
     {
         LOG_ERROR("Unknown blending type.");
@@ -712,6 +742,10 @@ Background2D::UpdateTileUV(const unsigned int tile_id, const float u1, const flo
     {
         vertex_buffer = m_AddVertexBuffer;
     }
+    else if( m_Tiles[ tile_id ].blending == QGears::B_SUBTRACT )
+    {
+        vertex_buffer = m_SubtractVertexBuffer;
+    }
 
     float* writeIterator = (float*)vertex_buffer->lock(Ogre::HardwareBuffer::HBL_NORMAL);
 
@@ -847,6 +881,12 @@ Background2D::renderQueueEnded(Ogre::uint8 queueGroupId, const Ogre::String& inv
             m_SceneManager->_setPass(m_AddMaterial->getTechnique(0)->getPass(0), true, false);
             m_RenderSystem->_render(m_AddRenderOp);
         }
+
+        if( m_SubtractRenderOp.vertexData->vertexCount != 0 )
+        {
+            m_SceneManager->_setPass( m_SubtractMaterial->getTechnique( 0 )->getPass( 0 ), true, false );
+            m_RenderSystem->_render( m_SubtractRenderOp );
+        }
     }
 }
 
@@ -891,6 +931,27 @@ Background2D::CreateVertexBuffers()
     m_AddRenderOp.vertexData->vertexBufferBinding->setBinding(0, m_AddVertexBuffer);
     m_AddRenderOp.operationType = Ogre::RenderOperation::OT_TRIANGLE_LIST;
     m_AddRenderOp.useIndexes = false;
+
+
+
+    m_SubtractMaxVertexCount = 256 * TILE_VERTEX_COUNT; // FIXME: 256?
+    m_SubtractRenderOp.vertexData = new Ogre::VertexData;
+    m_SubtractRenderOp.vertexData->vertexStart = 0;
+
+    vDecl = m_SubtractRenderOp.vertexData->vertexDeclaration;
+
+    offset = 0;
+    vDecl->addElement( 0, 0, Ogre::VET_FLOAT3, Ogre::VES_POSITION );
+    offset += Ogre::VertexElement::getTypeSize( Ogre::VET_FLOAT3 );
+    vDecl->addElement( 0, offset, Ogre::VET_FLOAT4, Ogre::VES_DIFFUSE );
+    offset += Ogre::VertexElement::getTypeSize( Ogre::VET_FLOAT4 );
+    vDecl->addElement( 0, offset, Ogre::VET_FLOAT2, Ogre::VES_TEXTURE_COORDINATES );
+
+    m_SubtractVertexBuffer = Ogre::HardwareBufferManager::getSingletonPtr()->createVertexBuffer( vDecl->getVertexSize( 0 ), m_SubtractMaxVertexCount, Ogre::HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY, false );
+
+    m_SubtractRenderOp.vertexData->vertexBufferBinding->setBinding( 0, m_SubtractVertexBuffer );
+    m_SubtractRenderOp.operationType = Ogre::RenderOperation::OT_TRIANGLE_LIST;
+    m_SubtractRenderOp.useIndexes = false;
 }
 
 
@@ -906,6 +967,11 @@ Background2D::DestroyVertexBuffers()
     m_AddRenderOp.vertexData = 0;
     m_AddVertexBuffer.setNull();
     m_AddMaxVertexCount = 0;
+
+    delete m_SubtractRenderOp.vertexData;
+    m_SubtractRenderOp.vertexData = 0;
+    m_SubtractVertexBuffer.setNull();
+    m_SubtractMaxVertexCount = 0;
 }
 
 

+ 13 - 1
QGearsMain/src/core/XmlBackground2DFile.cpp

@@ -58,7 +58,19 @@ XmlBackground2DFile::Load()
                 float depth = GetFloat(node, "depth", 0);
                 Ogre::String blending_str = GetString(node, "blending", "alpha");
 
-                QGears::Blending blending = (blending_str == "add") ? QGears::B_ADD : QGears::B_ALPHA;
+                QGears::Blending blending;
+                if (blending_str == "add")
+                {
+                    blending = QGears::B_ADD;
+                }
+                else if (blending_str == "subtract")
+                {
+                    blending = QGears::B_SUBTRACT;
+                }
+                else
+                {
+                    blending = QGears::B_ALPHA;
+                }
 
                 Ogre::Vector4 distance = Ogre::Vector4(0, 0, -depth, 1);
                 Ogre::Vector4 res = CameraManager::getSingleton().GetCurrentCamera()->getProjectionMatrixWithRSDepth() * distance;

+ 8 - 2
QGearsMain/src/map/QGearsBackground2DFileXMLSerializer.cpp

@@ -31,8 +31,9 @@ THE SOFTWARE.
 namespace QGears
 {
     //---------------------------------------------------------------------
-    const String Background2DFileXMLSerializer::BLENDING_ALPHA( "alpha" );
-    const String Background2DFileXMLSerializer::BLENDING_ADD  ( "add"   );
+    const String Background2DFileXMLSerializer::BLENDING_ALPHA   ( "alpha"    );
+    const String Background2DFileXMLSerializer::BLENDING_ADD     ( "add"      );
+    const String Background2DFileXMLSerializer::BLENDING_SUBTRACT( "subtract" );
 
     //---------------------------------------------------------------------
     Background2DFileXMLSerializer::Background2DFileXMLSerializer() :
@@ -77,6 +78,11 @@ namespace QGears
             pDest = B_ALPHA;
             return true;
         }
+        if( *value == BLENDING_SUBTRACT )
+        {
+            pDest = B_SUBTRACT;
+            return true;
+        }
         pDest = pDefault;
         return false;
     }

+ 8 - 0
utilities/ffvii_field_dat_dumper/src/DatFile.cpp

@@ -3338,6 +3338,14 @@ DatFile::AddTile( const Tile& tile, MimFile& mim, Logger* export_text )
     {
         blending_str = "add";
     }
+    else if( tile.blending == 2 )
+    {
+        blending_str = "subtract";
+    }
+    // else if( tile.blending == 3 )
+    // {
+    //     blending_str = "add"; // source + 0.25 * destination
+    // }
     else
     {
         LOGGER->Log( "Tile blending with type \"" + Ogre::StringConverter::toString( tile.blending ) + "\" not supported." );