forked from mirror/openmw-tes3mp
Mask out water in global map overlay
This commit is contained in:
parent
7b5f3e3cdc
commit
48a23d61b2
2 changed files with 33 additions and 0 deletions
|
@ -7,6 +7,7 @@
|
||||||
#include <osg/Group>
|
#include <osg/Group>
|
||||||
#include <osg/Geometry>
|
#include <osg/Geometry>
|
||||||
#include <osg/Depth>
|
#include <osg/Depth>
|
||||||
|
#include <osg/TexEnvCombine>
|
||||||
|
|
||||||
#include <osgDB/WriteFile>
|
#include <osgDB/WriteFile>
|
||||||
|
|
||||||
|
@ -144,6 +145,10 @@ namespace MWRender
|
||||||
image->allocateImage(mWidth, mHeight, 1, GL_RGB, GL_UNSIGNED_BYTE);
|
image->allocateImage(mWidth, mHeight, 1, GL_RGB, GL_UNSIGNED_BYTE);
|
||||||
unsigned char* data = image->data();
|
unsigned char* data = image->data();
|
||||||
|
|
||||||
|
osg::ref_ptr<osg::Image> alphaImage = new osg::Image;
|
||||||
|
alphaImage->allocateImage(mWidth, mHeight, 1, GL_ALPHA, GL_UNSIGNED_BYTE);
|
||||||
|
unsigned char* alphaData = alphaImage->data();
|
||||||
|
|
||||||
for (int x = mMinX; x <= mMaxX; ++x)
|
for (int x = mMinX; x <= mMaxX; ++x)
|
||||||
{
|
{
|
||||||
for (int y = mMinY; y <= mMaxY; ++y)
|
for (int y = mMinY; y <= mMaxY; ++y)
|
||||||
|
@ -208,6 +213,8 @@ namespace MWRender
|
||||||
data[texelY * mWidth * 3 + texelX * 3] = r;
|
data[texelY * mWidth * 3 + texelX * 3] = r;
|
||||||
data[texelY * mWidth * 3 + texelX * 3+1] = g;
|
data[texelY * mWidth * 3 + texelX * 3+1] = g;
|
||||||
data[texelY * mWidth * 3 + texelX * 3+2] = b;
|
data[texelY * mWidth * 3 + texelX * 3+2] = b;
|
||||||
|
|
||||||
|
alphaData[texelY * mWidth+ texelX] = (y2 < 0) ? static_cast<unsigned char>(0) : static_cast<unsigned char>(255);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
loadingListener->increaseProgress();
|
loadingListener->increaseProgress();
|
||||||
|
@ -224,6 +231,14 @@ namespace MWRender
|
||||||
mBaseTexture->setImage(image);
|
mBaseTexture->setImage(image);
|
||||||
mBaseTexture->setResizeNonPowerOfTwoHint(false);
|
mBaseTexture->setResizeNonPowerOfTwoHint(false);
|
||||||
|
|
||||||
|
mAlphaTexture = new osg::Texture2D;
|
||||||
|
mAlphaTexture->setWrap(osg::Texture::WRAP_S, osg::Texture::CLAMP_TO_EDGE);
|
||||||
|
mAlphaTexture->setWrap(osg::Texture::WRAP_T, osg::Texture::CLAMP_TO_EDGE);
|
||||||
|
mAlphaTexture->setFilter(osg::Texture::MIN_FILTER, osg::Texture::LINEAR);
|
||||||
|
mAlphaTexture->setFilter(osg::Texture::MAG_FILTER, osg::Texture::LINEAR);
|
||||||
|
mAlphaTexture->setImage(alphaImage);
|
||||||
|
mAlphaTexture->setResizeNonPowerOfTwoHint(false);
|
||||||
|
|
||||||
clear();
|
clear();
|
||||||
|
|
||||||
loadingListener->loadingOff();
|
loadingListener->loadingOff();
|
||||||
|
@ -299,6 +314,23 @@ namespace MWRender
|
||||||
stateset->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);
|
stateset->setTextureAttributeAndModes(0, texture, osg::StateAttribute::ON);
|
||||||
stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
|
stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);
|
||||||
stateset->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
|
stateset->setMode(GL_DEPTH_TEST, osg::StateAttribute::OFF);
|
||||||
|
|
||||||
|
if (mAlphaTexture)
|
||||||
|
{
|
||||||
|
osg::ref_ptr<osg::Vec2Array> texcoords = new osg::Vec2Array;
|
||||||
|
texcoords->push_back(osg::Vec2f(0.f, 0.f));
|
||||||
|
texcoords->push_back(osg::Vec2f(0.f, 1.f));
|
||||||
|
texcoords->push_back(osg::Vec2f(1.f, 1.f));
|
||||||
|
texcoords->push_back(osg::Vec2f(1.f, 0.f));
|
||||||
|
geom->setTexCoordArray(1, texcoords, osg::Array::BIND_PER_VERTEX);
|
||||||
|
|
||||||
|
stateset->setTextureAttributeAndModes(1, mAlphaTexture, osg::StateAttribute::ON);
|
||||||
|
osg::ref_ptr<osg::TexEnvCombine> texEnvCombine = new osg::TexEnvCombine;
|
||||||
|
texEnvCombine->setCombine_RGB(osg::TexEnvCombine::REPLACE);
|
||||||
|
texEnvCombine->setSource0_RGB(osg::TexEnvCombine::PREVIOUS);
|
||||||
|
stateset->setTextureAttributeAndModes(1, texEnvCombine);
|
||||||
|
}
|
||||||
|
|
||||||
camera->addChild(geom);
|
camera->addChild(geom);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -107,6 +107,7 @@ namespace MWRender
|
||||||
std::vector< std::pair<int,int> > mExploredCells;
|
std::vector< std::pair<int,int> > mExploredCells;
|
||||||
|
|
||||||
osg::ref_ptr<osg::Texture2D> mBaseTexture;
|
osg::ref_ptr<osg::Texture2D> mBaseTexture;
|
||||||
|
osg::ref_ptr<osg::Texture2D> mAlphaTexture;
|
||||||
|
|
||||||
// GPU copy of overlay
|
// GPU copy of overlay
|
||||||
// Note, uploads are pushed through a Camera, instead of through mOverlayImage
|
// Note, uploads are pushed through a Camera, instead of through mOverlayImage
|
||||||
|
|
Loading…
Reference in a new issue