#ifndef COMPONENTS_TERRAIN_MATERIAL_H #define COMPONENTS_TERRAIN_MATERIAL_H #include #include #include "defs.hpp" namespace osg { class Texture2D; } namespace Shader { class ShaderManager; } namespace Terrain { struct TextureLayer { osg::ref_ptr mDiffuseMap; osg::ref_ptr mNormalMap; // optional bool mParallax; bool mSpecular; }; class FixedFunctionTechnique : public osgFX::Technique { public: FixedFunctionTechnique( const std::vector& layers, const std::vector >& blendmaps, int blendmapScale, float layerTileSize); protected: virtual void define_passes() {} }; class ShaderTechnique : public osgFX::Technique { public: ShaderTechnique(Shader::ShaderManager& shaderManager, bool forcePerPixelLighting, bool clampLighting, const std::vector& layers, const std::vector >& blendmaps, int blendmapScale, float layerTileSize); protected: virtual void define_passes() {} }; class Effect : public osgFX::Effect { public: Effect(bool useShaders, bool forcePerPixelLighting, bool clampLighting, Shader::ShaderManager* shaderManager, const std::vector& layers, const std::vector >& blendmaps, int blendmapScale, float layerTileSize); virtual bool define_techniques(); virtual const char *effectName() const { return NULL; } virtual const char *effectDescription() const { return NULL; } virtual const char *effectAuthor() const { return NULL; } private: Shader::ShaderManager* mShaderManager; bool mUseShaders; bool mForcePerPixelLighting; bool mClampLighting; std::vector mLayers; std::vector > mBlendmaps; int mBlendmapScale; float mLayerTileSize; }; } #endif