|
|
@@ -21,6 +21,8 @@ ConfigVar cv_background2d_manual( "background2d_manual", "Manual scrolling for 2
|
|
|
Background2D::Background2D():
|
|
|
m_AlphaMaxVertexCount( 0 ),
|
|
|
m_AddMaxVertexCount( 0 ),
|
|
|
+ m_SubtractMaxVertexCount( 0 ),
|
|
|
+ m_MultiplyMaxVertexCount( 0 ),
|
|
|
|
|
|
m_ScrollEntity( NULL ),
|
|
|
m_ScrollPositionStart( Ogre::Vector2::ZERO ),
|
|
|
@@ -70,6 +72,36 @@ 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::SBF_ONE, Ogre::SBF_ONE_MINUS_SOURCE_COLOUR ); // FIXME: 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_MultiplyMaterial = Ogre::MaterialManager::getSingleton().create( "Background2DMultiply", "General" );
|
|
|
+ pass = m_MultiplyMaterial->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 ); // FIXME: MULTIPLY
|
|
|
+ pass->setAlphaRejectFunction( Ogre::CMPF_GREATER );
|
|
|
+ pass->setAlphaRejectValue( 0 );
|
|
|
+ tex = pass->createTextureUnitState();
|
|
|
+ tex->setTextureName( "system/blank.png" );
|
|
|
+ tex->setNumMipmaps( -1 );
|
|
|
+ tex->setTextureFiltering( Ogre::TFO_NONE );
|
|
|
+
|
|
|
m_SceneManager->addRenderQueueListener( this );
|
|
|
}
|
|
|
|
|
|
@@ -256,6 +288,14 @@ Background2D::OnResize()
|
|
|
{
|
|
|
vertex_buffer = m_AddVertexBuffer;
|
|
|
}
|
|
|
+ else if( m_Tiles[ i ].blending == QGears::B_SUBTRACT )
|
|
|
+ {
|
|
|
+ vertex_buffer = m_SubtractVertexBuffer;
|
|
|
+ }
|
|
|
+ else if( m_Tiles[ i ].blending == QGears::B_MULTIPLY )
|
|
|
+ {
|
|
|
+ vertex_buffer = m_MultiplyVertexBuffer;
|
|
|
+ }
|
|
|
|
|
|
float* writeIterator = ( float* )vertex_buffer->lock( Ogre::HardwareBuffer::HBL_NORMAL );
|
|
|
|
|
|
@@ -494,6 +534,12 @@ 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 );
|
|
|
+ pass = m_MultiplyMaterial->getTechnique( 0 )->getPass( 0 );
|
|
|
+ tex = pass->getTextureUnitState( 0 );
|
|
|
+ tex->setTextureName( image );
|
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
@@ -584,6 +630,18 @@ Background2D::AddTile( const int x, const int y, const int width, const int heig
|
|
|
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 if( blending == QGears::B_MULTIPLY )
|
|
|
+ {
|
|
|
+ render_op = m_MultiplyRenderOp;
|
|
|
+ vertex_buffer = m_MultiplyVertexBuffer;
|
|
|
+ max_vertex_count = m_MultiplyMaxVertexCount;
|
|
|
+ }
|
|
|
else
|
|
|
{
|
|
|
LOG_ERROR( "Unknown blending type." );
|
|
|
@@ -716,6 +774,14 @@ Background2D::UpdateTileUV( const unsigned int tile_id, const float u1, const fl
|
|
|
{
|
|
|
vertex_buffer = m_AddVertexBuffer;
|
|
|
}
|
|
|
+ else if( m_Tiles[ tile_id ].blending == QGears::B_SUBTRACT )
|
|
|
+ {
|
|
|
+ vertex_buffer = m_SubtractVertexBuffer;
|
|
|
+ }
|
|
|
+ else if( m_Tiles[ tile_id ].blending == QGears::B_MULTIPLY )
|
|
|
+ {
|
|
|
+ vertex_buffer = m_MultiplyVertexBuffer;
|
|
|
+ }
|
|
|
|
|
|
float* writeIterator = ( float* )vertex_buffer->lock( Ogre::HardwareBuffer::HBL_NORMAL );
|
|
|
|
|
|
@@ -852,6 +918,18 @@ Background2D::renderQueueEnded( Ogre::uint8 queueGroupId, const Ogre::String& in
|
|
|
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 );
|
|
|
+ }
|
|
|
+
|
|
|
+ if( m_MultiplyRenderOp.vertexData->vertexCount != 0 )
|
|
|
+ {
|
|
|
+ m_SceneManager->_setPass( m_MultiplyMaterial->getTechnique( 0 )->getPass( 0 ), true, false );
|
|
|
+ m_RenderSystem->_render( m_MultiplyRenderOp );
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -898,6 +976,48 @@ 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;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ m_MultiplyMaxVertexCount = 256 * TILE_VERTEX_COUNT; // FIXME: 256?
|
|
|
+ m_MultiplyRenderOp.vertexData = new Ogre::VertexData;
|
|
|
+ m_MultiplyRenderOp.vertexData->vertexStart = 0;
|
|
|
+
|
|
|
+ vDecl = m_MultiplyRenderOp.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_MultiplyVertexBuffer = Ogre::HardwareBufferManager::getSingletonPtr()->createVertexBuffer( vDecl->getVertexSize( 0 ), m_MultiplyMaxVertexCount, Ogre::HardwareBuffer::HBU_DYNAMIC_WRITE_ONLY, false );
|
|
|
+
|
|
|
+ m_MultiplyRenderOp.vertexData->vertexBufferBinding->setBinding( 0, m_AMultiplyVertexBuffer );
|
|
|
+ m_MultiplyRenderOp.operationType = Ogre::RenderOperation::OT_TRIANGLE_LIST;
|
|
|
+ m_MultiplyRenderOp.useIndexes = false;
|
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|
|
|
@@ -913,6 +1033,16 @@ 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;
|
|
|
+
|
|
|
+ delete m_MultiplyRenderOp.vertexData;
|
|
|
+ m_MultiplyRenderOp.vertexData = 0;
|
|
|
+ m_MultiplyVertexBuffer.setNull();
|
|
|
+ m_MultiplyMaxVertexCount = 0;
|
|
|
}
|
|
|
|
|
|
//------------------------------------------------------------------------------
|