|
|
@@ -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);
|
|
|
}
|
|
|
|
|
|
@@ -247,10 +264,14 @@ Background2D::OnResize()
|
|
|
{
|
|
|
vertex_buffer = m_AlphaVertexBuffer;
|
|
|
}
|
|
|
- else if(m_Tiles[i].blending == QGears::B_ADD )
|
|
|
+ else if(m_Tiles[i].blending == QGears::B_ADD)
|
|
|
{
|
|
|
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;
|
|
|
}
|
|
|
|
|
|
|