Terrain: make the blendmapSize and layerTileSize in FixedFunctionTechnique configurable

pull/798/head
scrawl 9 years ago
parent e081eb2c34
commit 95cf13e3f2

@ -11,7 +11,7 @@ namespace Terrain
{ {
FixedFunctionTechnique::FixedFunctionTechnique(const std::vector<osg::ref_ptr<osg::Texture2D> >& layers, FixedFunctionTechnique::FixedFunctionTechnique(const std::vector<osg::ref_ptr<osg::Texture2D> >& layers,
const std::vector<osg::ref_ptr<osg::Texture2D> >& blendmaps) const std::vector<osg::ref_ptr<osg::Texture2D> >& blendmaps, int blendmapSize, float layerTileSize)
{ {
bool firstLayer = true; bool firstLayer = true;
int i=0; int i=0;
@ -36,7 +36,7 @@ namespace Terrain
// This is to map corner vertices directly to the center of a blendmap texel. // This is to map corner vertices directly to the center of a blendmap texel.
osg::Matrixf texMat; osg::Matrixf texMat;
float scale = (16/(16.f+1.f)); float scale = (blendmapSize/(static_cast<float>(blendmapSize)+1.f));
texMat.preMultTranslate(osg::Vec3f(0.5f, 0.5f, 0.f)); texMat.preMultTranslate(osg::Vec3f(0.5f, 0.5f, 0.f));
texMat.preMultScale(osg::Vec3f(scale, scale, 1.f)); texMat.preMultScale(osg::Vec3f(scale, scale, 1.f));
texMat.preMultTranslate(osg::Vec3f(-0.5f, -0.5f, 0.f)); texMat.preMultTranslate(osg::Vec3f(-0.5f, -0.5f, 0.f));
@ -57,8 +57,7 @@ namespace Terrain
stateset->setTextureAttributeAndModes(texunit, tex.get()); stateset->setTextureAttributeAndModes(texunit, tex.get());
osg::ref_ptr<osg::TexMat> texMat (new osg::TexMat); osg::ref_ptr<osg::TexMat> texMat (new osg::TexMat);
float scale = 16.f; texMat->setMatrix(osg::Matrix::scale(osg::Vec3f(layerTileSize,layerTileSize,1.f)));
texMat->setMatrix(osg::Matrix::scale(osg::Vec3f(scale,scale,1.f)));
stateset->setTextureAttributeAndModes(texunit, texMat, osg::StateAttribute::ON); stateset->setTextureAttributeAndModes(texunit, texMat, osg::StateAttribute::ON);
firstLayer = false; firstLayer = false;
@ -67,9 +66,12 @@ namespace Terrain
} }
} }
Effect::Effect(const std::vector<osg::ref_ptr<osg::Texture2D> > &layers, const std::vector<osg::ref_ptr<osg::Texture2D> > &blendmaps) Effect::Effect(const std::vector<osg::ref_ptr<osg::Texture2D> > &layers, const std::vector<osg::ref_ptr<osg::Texture2D> > &blendmaps,
int blendmapSize, float layerTileSize)
: mLayers(layers) : mLayers(layers)
, mBlendmaps(blendmaps) , mBlendmaps(blendmaps)
, mBlendmapSize(blendmapSize)
, mLayerTileSize(layerTileSize)
{ {
osg::ref_ptr<osg::Material> material (new osg::Material); osg::ref_ptr<osg::Material> material (new osg::Material);
material->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE); material->setColorMode(osg::Material::AMBIENT_AND_DIFFUSE);
@ -80,7 +82,7 @@ namespace Terrain
bool Effect::define_techniques() bool Effect::define_techniques()
{ {
addTechnique(new FixedFunctionTechnique(mLayers, mBlendmaps)); addTechnique(new FixedFunctionTechnique(mLayers, mBlendmaps, mBlendmapSize, mLayerTileSize));
return true; return true;
} }

@ -19,7 +19,7 @@ namespace Terrain
public: public:
FixedFunctionTechnique( FixedFunctionTechnique(
const std::vector<osg::ref_ptr<osg::Texture2D> >& layers, const std::vector<osg::ref_ptr<osg::Texture2D> >& layers,
const std::vector<osg::ref_ptr<osg::Texture2D> >& blendmaps); const std::vector<osg::ref_ptr<osg::Texture2D> >& blendmaps, int blendmapSize, float layerTileSize);
protected: protected:
virtual void define_passes() {} virtual void define_passes() {}
@ -30,7 +30,7 @@ namespace Terrain
public: public:
Effect( Effect(
const std::vector<osg::ref_ptr<osg::Texture2D> >& layers, const std::vector<osg::ref_ptr<osg::Texture2D> >& layers,
const std::vector<osg::ref_ptr<osg::Texture2D> >& blendmaps); const std::vector<osg::ref_ptr<osg::Texture2D> >& blendmaps, int blendmapSize, float layerTileSize);
virtual bool define_techniques(); virtual bool define_techniques();
@ -50,6 +50,8 @@ namespace Terrain
private: private:
std::vector<osg::ref_ptr<osg::Texture2D> > mLayers; std::vector<osg::ref_ptr<osg::Texture2D> > mLayers;
std::vector<osg::ref_ptr<osg::Texture2D> > mBlendmaps; std::vector<osg::ref_ptr<osg::Texture2D> > mBlendmaps;
int mBlendmapSize;
float mLayerTileSize;
}; };
} }

@ -7,6 +7,8 @@
#include <components/sceneutil/lightmanager.hpp> #include <components/sceneutil/lightmanager.hpp>
#include <components/esm/loadland.hpp>
#include <osg/PositionAttitudeTransform> #include <osg/PositionAttitudeTransform>
#include <osg/Geometry> #include <osg/Geometry>
#include <osg/Geode> #include <osg/Geode>
@ -150,7 +152,7 @@ void TerrainGrid::loadCell(int x, int y)
for (unsigned int i=0; i<2; ++i) for (unsigned int i=0; i<2; ++i)
geometry->setTexCoordArray(i, mCache.getUVBuffer()); geometry->setTexCoordArray(i, mCache.getUVBuffer());
osg::ref_ptr<osgFX::Effect> effect (new Terrain::Effect(layerTextures, blendmapTextures)); osg::ref_ptr<osgFX::Effect> effect (new Terrain::Effect(layerTextures, blendmapTextures, ESM::Land::LAND_TEXTURE_SIZE, ESM::Land::LAND_TEXTURE_SIZE));
effect->addCullCallback(new SceneUtil::LightListCallback); effect->addCullCallback(new SceneUtil::LightListCallback);

Loading…
Cancel
Save