finished cleaning up sky

actorid
scrawl 13 years ago
parent b8384162b6
commit 7731e9a6fa

@ -19,6 +19,8 @@
#include <components/nifogre/ogre_nif_loader.hpp> #include <components/nifogre/ogre_nif_loader.hpp>
#include <extern/shiny/Platforms/Ogre/OgreMaterial.hpp>
#include "../mwbase/environment.hpp" #include "../mwbase/environment.hpp"
#include "../mwbase/world.hpp" #include "../mwbase/world.hpp"
@ -31,9 +33,33 @@ using namespace Ogre;
BillboardObject::BillboardObject( const String& textureName, BillboardObject::BillboardObject( const String& textureName,
const float initialSize, const float initialSize,
const Vector3& position, const Vector3& position,
SceneNode* rootNode) SceneNode* rootNode,
const std::string& material)
{ {
init(textureName, initialSize, position, rootNode); SceneManager* sceneMgr = rootNode->getCreator();
Vector3 finalPosition = position.normalisedCopy() * 1000.f;
static unsigned int bodyCount=0;
/// \todo These billboards are not 100% correct, might want to revisit them later
mBBSet = sceneMgr->createBillboardSet("SkyBillboardSet"+StringConverter::toString(bodyCount), 1);
mBBSet->setDefaultDimensions(550.f*initialSize, 550.f*initialSize);
mBBSet->setBillboardType(BBT_PERPENDICULAR_COMMON);
mBBSet->setCommonDirection( -position.normalisedCopy() );
mBBSet->setVisibilityFlags(RV_Sky);
mNode = rootNode->createChildSceneNode();
mNode->setPosition(finalPosition);
mNode->attachObject(mBBSet);
mBBSet->createBillboard(0,0,0);
mBBSet->setCastShadows(false);
mMaterial = sh::Factory::getInstance().createMaterialInstance ("BillboardMaterial"+StringConverter::toString(bodyCount), material);
mMaterial->setProperty("texture", sh::makeProperty<sh::StringValue>(new sh::StringValue(textureName)));
mBBSet->setMaterialName("BillboardMaterial"+StringConverter::toString(bodyCount));
bodyCount++;
} }
BillboardObject::BillboardObject() BillboardObject::BillboardObject()
@ -52,7 +78,13 @@ void BillboardObject::setSize(const float size)
void BillboardObject::setVisibility(const float visibility) void BillboardObject::setVisibility(const float visibility)
{ {
//mMaterial->getTechnique(0)->getPass(0)->setDiffuse(0.0, 0.0, 0.0, visibility); Ogre::MaterialPtr m = static_cast<sh::OgreMaterial*>(mMaterial->getMaterial ())->getOgreMaterial ();
for (int i=0; i<m->getNumTechniques(); ++i)
{
Ogre::Technique* t = m->getTechnique(i);
if (t->getNumPasses ())
t->getPass(0)->setDiffuse (0,0,0, visibility);
}
} }
void BillboardObject::setPosition(const Vector3& pPosition) void BillboardObject::setPosition(const Vector3& pPosition)
@ -78,6 +110,13 @@ void BillboardObject::setVisibilityFlags(int flags)
void BillboardObject::setColour(const ColourValue& pColour) void BillboardObject::setColour(const ColourValue& pColour)
{ {
Ogre::MaterialPtr m = static_cast<sh::OgreMaterial*>(mMaterial->getMaterial ())->getOgreMaterial ();
for (int i=0; i<m->getNumTechniques(); ++i)
{
Ogre::Technique* t = m->getTechnique(i);
if (t->getNumPasses ())
t->getPass(0)->setSelfIllumination (pColour);
}
//mMaterial->getTechnique(0)->getPass(0)->setSelfIllumination(pColour); //mMaterial->getTechnique(0)->getPass(0)->setSelfIllumination(pColour);
} }
@ -91,187 +130,13 @@ SceneNode* BillboardObject::getNode()
return mNode; return mNode;
} }
void BillboardObject::init(const String& textureName,
const float initialSize,
const Vector3& position,
SceneNode* rootNode)
{
SceneManager* sceneMgr = rootNode->getCreator();
Vector3 finalPosition = position.normalisedCopy() * 1000.f;
static unsigned int bodyCount=0;
/// \todo These billboards are not 100% correct, might want to revisit them later
mBBSet = sceneMgr->createBillboardSet("SkyBillboardSet"+StringConverter::toString(bodyCount), 1);
mBBSet->setDefaultDimensions(550.f*initialSize, 550.f*initialSize);
mBBSet->setBillboardType(BBT_PERPENDICULAR_COMMON);
mBBSet->setCommonDirection( -position.normalisedCopy() );
mBBSet->setVisibilityFlags(RV_Sky);
mNode = rootNode->createChildSceneNode();
mNode->setPosition(finalPosition);
mNode->attachObject(mBBSet);
mBBSet->createBillboard(0,0,0);
mBBSet->setCastShadows(false);
sh::MaterialInstance* m = sh::Factory::getInstance().createMaterialInstance ("BillboardMaterial"+StringConverter::toString(bodyCount), "openmw_sun");
m->setProperty("texture", sh::makeProperty<sh::StringValue>(new sh::StringValue(textureName)));
mBBSet->setMaterialName("BillboardMaterial"+StringConverter::toString(bodyCount));
/*
mMaterial = MaterialManager::getSingleton().create("BillboardMaterial"+StringConverter::toString(bodyCount), ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
mMaterial->removeAllTechniques();
Pass* p = mMaterial->createTechnique()->createPass();
p->setSceneBlending(SBT_TRANSPARENT_ALPHA);
p->setDepthCheckEnabled(false);
p->setDepthWriteEnabled(false);
p->setSelfIllumination(1.0,1.0,1.0);
p->setDiffuse(0.0,0.0,0.0,1.0);
p->setAmbient(0.0,0.0,0.0);
p->setPolygonModeOverrideable(false);
p->createTextureUnitState(textureName);
HighLevelGpuProgramManager& mgr = HighLevelGpuProgramManager::getSingleton();
HighLevelGpuProgramPtr vshader;
if (mgr.resourceExists("BBO_VP"))
vshader = mgr.getByName("BBO_VP");
else
vshader = mgr.createProgram("BBO_VP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "cg", GPT_VERTEX_PROGRAM);
vshader->setParameter("profiles", "vs_2_x arbvp1");
vshader->setParameter("entry_point", "main_vp");
StringUtil::StrStreamType outStream;
outStream <<
"void main_vp( \n"
" float4 position : POSITION, \n"
" in float2 uv : TEXCOORD0, \n"
" out float2 oUV : TEXCOORD0, \n"
" out float4 oPosition : POSITION, \n"
" uniform float4x4 worldViewProj \n"
") \n"
"{ \n"
" oUV = uv; \n"
" oPosition = mul( worldViewProj, position ); \n"
"}";
vshader->setSource(outStream.str());
vshader->load();
vshader->getDefaultParameters()->setNamedAutoConstant("worldViewProj", GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX);
mMaterial->getTechnique(0)->getPass(0)->setVertexProgram(vshader->getName());
HighLevelGpuProgramPtr fshader;
if (mgr.resourceExists("BBO_FP"))
fshader = mgr.getByName("BBO_FP");
else
fshader = mgr.createProgram("BBO_FP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "cg", GPT_FRAGMENT_PROGRAM);
fshader->setParameter("profiles", "ps_2_x arbfp1");
fshader->setParameter("entry_point", "main_fp");
StringUtil::StrStreamType outStream2;
outStream2 <<
"void main_fp( \n"
" in float2 uv : TEXCOORD0, \n"
" out float4 oColor : COLOR, \n";
if (RenderingManager::useMRT()) outStream2 <<
" out float4 oColor1 : COLOR1, \n";
outStream2 <<
" uniform sampler2D texture : TEXUNIT0, \n"
" uniform float4 diffuse, \n"
" uniform float4 emissive \n"
") \n"
"{ \n"
" float4 tex = tex2D(texture, uv); \n"
" oColor = float4(emissive.xyz,1) * tex * float4(1,1,1,diffuse.a); \n";
if (RenderingManager::useMRT()) outStream2 <<
" oColor1 = float4(1, 0, 0, 1); \n";
outStream2 <<
"}";
fshader->setSource(outStream2.str());
fshader->load();
fshader->getDefaultParameters()->setNamedAutoConstant("diffuse", GpuProgramParameters::ACT_SURFACE_DIFFUSE_COLOUR);
fshader->getDefaultParameters()->setNamedAutoConstant("emissive", GpuProgramParameters::ACT_SURFACE_EMISSIVE_COLOUR);
mMaterial->getTechnique(0)->getPass(0)->setFragmentProgram(fshader->getName());
*/
bodyCount++;
}
Moon::Moon( const String& textureName, Moon::Moon( const String& textureName,
const float initialSize, const float initialSize,
const Vector3& position, const Vector3& position,
SceneNode* rootNode) SceneNode* rootNode,
const std::string& material)
: BillboardObject(textureName, initialSize, position, rootNode, material)
{ {
init(textureName, initialSize, position, rootNode);
/*
HighLevelGpuProgramManager& mgr = HighLevelGpuProgramManager::getSingleton();
HighLevelGpuProgramPtr vshader;
if (mgr.resourceExists("Moon_VP"))
vshader = mgr.getByName("Moon_VP");
else
vshader = mgr.createProgram("Moon_VP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "cg", GPT_VERTEX_PROGRAM);
vshader->setParameter("profiles", "vs_2_x arbvp1");
vshader->setParameter("entry_point", "main_vp");
StringUtil::StrStreamType outStream;
outStream <<
"void main_vp( \n"
" float4 position : POSITION, \n"
" in float2 uv : TEXCOORD0, \n"
" out float2 oUV : TEXCOORD0, \n"
" out float4 oPosition : POSITION, \n"
" uniform float4x4 worldViewProj \n"
") \n"
"{ \n"
" oUV = uv; \n"
" oPosition = mul( worldViewProj, position ); \n"
"}";
vshader->setSource(outStream.str());
vshader->load();
vshader->getDefaultParameters()->setNamedAutoConstant("worldViewProj", GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX);
mMaterial->getTechnique(0)->getPass(0)->setVertexProgram(vshader->getName());
HighLevelGpuProgramPtr fshader;
if (mgr.resourceExists("Moon_FP"))
fshader = mgr.getByName("Moon_FP");
else
fshader = mgr.createProgram("Moon_FP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, "cg", GPT_FRAGMENT_PROGRAM);
fshader->setParameter("profiles", "ps_2_x arbfp1");
fshader->setParameter("entry_point", "main_fp");
StringUtil::StrStreamType outStream2;
outStream2 <<
"void main_fp( \n"
" in float2 uv : TEXCOORD0, \n"
" out float4 oColor : COLOR, \n";
if (RenderingManager::useMRT()) outStream2 <<
" out float4 oColor1 : COLOR1, \n";
outStream2 <<
" uniform sampler2D texture : TEXUNIT0, \n"
" uniform float4 skyColour, \n"
" uniform float4 diffuse, \n"
" uniform float4 emissive \n"
") \n"
"{ \n"
" float4 tex = tex2D(texture, uv); \n"
" oColor = float4(emissive.xyz,1) * tex; \n";
if (RenderingManager::useMRT()) outStream2 <<
" oColor1 = float4(1, 0, 0, 1); \n";
outStream2 <<
// use a circle for the alpha (compute UV distance to center)
// looks a bit bad because its not filtered on the edges,
// but it's cheaper than a seperate alpha texture.
" float sqrUVdist = pow(uv.x-0.5,2) + pow(uv.y-0.5, 2); \n"
" oColor.a = diffuse.a * (sqrUVdist >= 0.24 ? 0 : 1); \n"
" oColor.rgb += (1-tex.a) * oColor.a * skyColour.rgb; \n"//fill dark side of moon with skycolour
" oColor.rgb += (1-diffuse.a) * skyColour.rgb; \n"//fade bump
"}";
fshader->setSource(outStream2.str());
fshader->load();
fshader->getDefaultParameters()->setNamedAutoConstant("diffuse", GpuProgramParameters::ACT_SURFACE_DIFFUSE_COLOUR);
fshader->getDefaultParameters()->setNamedAutoConstant("emissive", GpuProgramParameters::ACT_SURFACE_EMISSIVE_COLOUR);
mMaterial->getTechnique(0)->getPass(0)->setFragmentProgram(fshader->getName());
*/
setVisibility(1.0); setVisibility(1.0);
mPhase = Moon::Phase_Full; mPhase = Moon::Phase_Full;
@ -282,11 +147,6 @@ void Moon::setType(const Moon::Type& type)
mType = type; mType = type;
} }
void Moon::setSkyColour(const Ogre::ColourValue& colour)
{
//mMaterial->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("skyColour", colour);
}
void Moon::setPhase(const Moon::Phase& phase) void Moon::setPhase(const Moon::Phase& phase)
{ {
// Colour texture // Colour texture
@ -306,7 +166,10 @@ void Moon::setPhase(const Moon::Phase& phase)
textureName += ".dds"; textureName += ".dds";
//mMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName(textureName); if (mType == Moon::Type_Secunda)
sh::Factory::getInstance ().setTextureAlias ("secunda_texture", textureName);
else
sh::Factory::getInstance ().setTextureAlias ("masser_texture", textureName);
mPhase = phase; mPhase = phase;
} }
@ -355,25 +218,12 @@ void SkyManager::ModVertexAlpha(Entity* ent, unsigned int meshType)
else if (i>= 33 && i <= 48) alpha = 64; // second bottom-most row else if (i>= 33 && i <= 48) alpha = 64; // second bottom-most row
else alpha = 255; else alpha = 255;
} }
// NB we would have to swap R and B depending on rendersystem specific VertexElementType, but doesn't matter since they are both 1
uint8 tmpR = static_cast<uint8>(255); uint8 tmpR = static_cast<uint8>(255);
uint8 tmpG = static_cast<uint8>(255); uint8 tmpG = static_cast<uint8>(255);
uint8 tmpB = static_cast<uint8>(255); uint8 tmpB = static_cast<uint8>(255);
uint8 tmpA = static_cast<uint8>(alpha); uint8 tmpA = static_cast<uint8>(alpha);
// This does not matter since R and B are always 1.
/*VertexElementType format = Root::getSingleton().getRenderSystem()->getColourVertexElementType();
switch (format)
{
case VET_COLOUR_ARGB:
std::swap(tmpR, tmpB);
break;
case VET_COLOUR_ABGR:
break;
default:
break;
}*/
// Modify // Modify
*((uint32*)currentVertex) = tmpR | (tmpG << 8) | (tmpB << 16) | (tmpA << 24); *((uint32*)currentVertex) = tmpR | (tmpG << 8) | (tmpB << 16) | (tmpA << 24);
@ -405,8 +255,6 @@ SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera)
, mCloudOpacity(0.0f) , mCloudOpacity(0.0f)
, mCloudSpeed(0.0f) , mCloudSpeed(0.0f)
, mStarsOpacity(0.0f) , mStarsOpacity(0.0f)
, mThunderOverlay(NULL)
, mThunderTextureUnit(NULL)
, mRemainingTransitionTime(0.0f) , mRemainingTransitionTime(0.0f)
, mGlareFade(0.0f) , mGlareFade(0.0f)
, mGlare(0.0f) , mGlare(0.0f)
@ -416,6 +264,7 @@ SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera)
, mSecundaEnabled(true) , mSecundaEnabled(true)
, mCreated(false) , mCreated(false)
, mCloudAnimationTimer(0.f) , mCloudAnimationTimer(0.f)
, mMoonRed(false)
{ {
mSceneMgr = pMwRoot->getCreator(); mSceneMgr = pMwRoot->getCreator();
mRootNode = mCamera->getParentSceneNode()->createChildSceneNode(); mRootNode = mCamera->getParentSceneNode()->createChildSceneNode();
@ -440,34 +289,23 @@ void SkyManager::create()
sh::Factory::getInstance().setTextureAlias ("cloud_texture_2", ""); sh::Factory::getInstance().setTextureAlias ("cloud_texture_2", "");
// Create overlay used for thunderstorm // Create overlay used for thunderstorm
MaterialPtr material = MaterialManager::getSingleton().create( "ThunderMaterial", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME ); mLightning = mSceneMgr->createLight();
Pass* pass = material->getTechnique(0)->getPass(0); mLightning->setType (Ogre::Light::LT_DIRECTIONAL);
pass->setSceneBlending(SBT_TRANSPARENT_ALPHA); mLightning->setDirection (Ogre::Vector3(0.3, -0.7, 0.3));
mThunderTextureUnit = pass->createTextureUnitState(); mLightning->setVisible (false);
mThunderTextureUnit->setColourOperationEx(LBX_SOURCE1, LBS_MANUAL, LBS_CURRENT, ColourValue(1.f, 1.f, 1.f)); mLightning->setDiffuseColour (ColourValue(3,3,3));
mThunderTextureUnit->setAlphaOperation(LBX_SOURCE1, LBS_MANUAL, LBS_CURRENT, 0.5f);
OverlayManager& ovm = OverlayManager::getSingleton(); mSecunda = new Moon("secunda_texture", 0.5, Vector3(-0.4, 0.4, 0.5), mRootNode, "openmw_moon");
mThunderOverlay = ovm.create( "ThunderOverlay" );
OverlayContainer* overlay_panel;
overlay_panel = (OverlayContainer*)ovm.createOverlayElement("Panel", "ThunderPanel");
overlay_panel->_setPosition(0, 0);
overlay_panel->_setDimensions(1, 1);
overlay_panel->setMaterialName( "ThunderMaterial" );
overlay_panel->show();
mThunderOverlay->add2D(overlay_panel);
mThunderOverlay->hide();
mSecunda = new Moon("textures\\tx_secunda_full.dds", 0.5, Vector3(-0.4, 0.4, 0.5), mRootNode);
mSecunda->setType(Moon::Type_Secunda); mSecunda->setType(Moon::Type_Secunda);
mSecunda->setRenderQueue(RQG_SkiesEarly+4); mSecunda->setRenderQueue(RQG_SkiesEarly+4);
mMasser = new Moon("textures\\tx_masser_full.dds", 0.75, Vector3(-0.4, 0.4, 0.5), mRootNode); mMasser = new Moon("masser_texture", 0.75, Vector3(-0.4, 0.4, 0.5), mRootNode, "openmw_moon");
mMasser->setRenderQueue(RQG_SkiesEarly+3); mMasser->setRenderQueue(RQG_SkiesEarly+3);
mMasser->setType(Moon::Type_Masser); mMasser->setType(Moon::Type_Masser);
mSun = new BillboardObject("textures\\tx_sun_05.dds", 1, Vector3(0.4, 0.4, 0.4), mRootNode); mSun = new BillboardObject("textures\\tx_sun_05.dds", 1, Vector3(0.4, 0.4, 0.4), mRootNode, "openmw_sun");
mSun->setRenderQueue(RQG_SkiesEarly+4); mSun->setRenderQueue(RQG_SkiesEarly+4);
mSunGlare = new BillboardObject("textures\\tx_sun_flash_grey_05.dds", 3, Vector3(0.4, 0.4, 0.4), mRootNode); mSunGlare = new BillboardObject("textures\\tx_sun_flash_grey_05.dds", 3, Vector3(0.4, 0.4, 0.4), mRootNode, "openmw_sun");
mSunGlare->setRenderQueue(RQG_SkiesLate); mSunGlare->setRenderQueue(RQG_SkiesLate);
mSunGlare->setVisibilityFlags(RV_Glare); mSunGlare->setVisibilityFlags(RV_Glare);
@ -556,6 +394,8 @@ void SkyManager::update(float duration)
mMasser->setPhase( static_cast<Moon::Phase>( (int) ((mDay % 32)/4.f)) ); mMasser->setPhase( static_cast<Moon::Phase>( (int) ((mDay % 32)/4.f)) );
mSecunda->setPhase ( static_cast<Moon::Phase>( (int) ((mDay % 32)/4.f)) ); mSecunda->setPhase ( static_cast<Moon::Phase>( (int) ((mDay % 32)/4.f)) );
mSecunda->setColour ( mMoonRed ? ColourValue(1.0, 0.0784, 0.0784) : ColourValue(1,1,1,1));
mMasser->setColour (ColourValue(1,1,1,1));
if (mSunEnabled) if (mSunEnabled)
{ {
@ -609,9 +449,7 @@ void SkyManager::disable()
void SkyManager::setMoonColour (bool red) void SkyManager::setMoonColour (bool red)
{ {
if (!mCreated) return; mMoonRed = red;
mSecunda->setColour( red ? ColourValue(1.0, 0.0784, 0.0784)
: ColourValue(1.0, 1.0, 1.0));
} }
void SkyManager::setWeather(const MWWorld::WeatherResult& weather) void SkyManager::setWeather(const MWWorld::WeatherResult& weather)
@ -755,16 +593,21 @@ void SkyManager::secundaDisable()
mSecundaEnabled = false; mSecundaEnabled = false;
} }
void SkyManager::setThunder(const float factor) void SkyManager::setLightningStrength(const float factor)
{ {
if (!mCreated) return; if (!mCreated) return;
if (factor > 0.f) if (factor > 0.f)
{ {
mThunderOverlay->show(); mLightning->setDiffuseColour (ColourValue(2*factor, 2*factor, 2*factor));
mThunderTextureUnit->setAlphaOperation(LBX_SOURCE1, LBS_MANUAL, LBS_CURRENT, factor*0.6); mLightning->setVisible(true);
} }
else else
mThunderOverlay->hide(); mLightning->setVisible(false);
}
void SkyManager::setLightningDirection(const Ogre::Vector3& dir)
{
mLightning->setDirection (dir);
} }
void SkyManager::setMasserFade(const float fade) void SkyManager::setMasserFade(const float fade)

@ -33,7 +33,8 @@ namespace MWRender
BillboardObject( const Ogre::String& textureName, BillboardObject( const Ogre::String& textureName,
const float size, const float size,
const Ogre::Vector3& position, const Ogre::Vector3& position,
Ogre::SceneNode* rootNode Ogre::SceneNode* rootNode,
const std::string& material
); );
BillboardObject(); BillboardObject();
@ -52,13 +53,9 @@ namespace MWRender
Ogre::SceneNode* getNode(); Ogre::SceneNode* getNode();
protected: protected:
virtual void init(const Ogre::String& textureName,
const float size,
const Ogre::Vector3& position,
Ogre::SceneNode* rootNode);
Ogre::SceneNode* mNode; Ogre::SceneNode* mNode;
Ogre::MaterialPtr mMaterial; sh::MaterialInstance* mMaterial;
Ogre::BillboardSet* mBBSet; Ogre::BillboardSet* mBBSet;
}; };
@ -72,7 +69,8 @@ namespace MWRender
Moon( const Ogre::String& textureName, Moon( const Ogre::String& textureName,
const float size, const float size,
const Ogre::Vector3& position, const Ogre::Vector3& position,
Ogre::SceneNode* rootNode Ogre::SceneNode* rootNode,
const std::string& material
); );
virtual ~Moon() {} virtual ~Moon() {}
@ -97,7 +95,6 @@ namespace MWRender
void setPhase(const Phase& phase); void setPhase(const Phase& phase);
void setType(const Type& type); void setType(const Type& type);
void setSkyColour(const Ogre::ColourValue& colour);
Phase getPhase() const; Phase getPhase() const;
unsigned int getPhaseInt() const; unsigned int getPhaseInt() const;
@ -163,7 +160,8 @@ namespace MWRender
void secundaEnable(); void secundaEnable();
void secundaDisable(); void secundaDisable();
void setThunder(const float factor); void setLightningStrength(const float factor);
void setLightningDirection(const Ogre::Vector3& dir);
void setGlare(const float glare); void setGlare(const float glare);
Ogre::Vector3 getRealSunPos(); Ogre::Vector3 getRealSunPos();
@ -175,6 +173,8 @@ namespace MWRender
private: private:
bool mCreated; bool mCreated;
bool mMoonRed;
float mHour; float mHour;
int mDay; int mDay;
int mMonth; int mMonth;
@ -205,8 +205,7 @@ namespace MWRender
Ogre::ColourValue mCloudColour; Ogre::ColourValue mCloudColour;
Ogre::ColourValue mSkyColour; Ogre::ColourValue mSkyColour;
Ogre::Overlay* mThunderOverlay; Ogre::Light* mLightning;
Ogre::TextureUnitState* mThunderTextureUnit;
float mRemainingTransitionTime; float mRemainingTransitionTime;

@ -193,7 +193,7 @@ namespace MWRender
//this is a hack to get around the fact that Ogre seems to //this is a hack to get around the fact that Ogre seems to
//corrupt the global colour map leading to rendering errors //corrupt the global colour map leading to rendering errors
MaterialPtr mat = terrain->getMaterial(); //MaterialPtr mat = terrain->getMaterial();
/// \todo /// \todo
//mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( vertex->getName() ); //mat->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName( vertex->getName() );

@ -47,12 +47,30 @@ namespace MWRender
Ogre::MaterialManager::getSingleton().remove(matName); Ogre::MaterialManager::getSingleton().remove(matName);
sh::MaterialInstance* m = sh::Factory::getInstance().createMaterialInstance (matName); mMaterial = sh::Factory::getInstance().createMaterialInstance (matName);
mMaterial->setProperty ("allow_fixed_function", sh::makeProperty<sh::BooleanValue>(new sh::BooleanValue(false)));
createPass();
return Ogre::MaterialManager::getSingleton().getByName(matName); return Ogre::MaterialManager::getSingleton().getByName(matName);
} }
int TerrainMaterial::Profile::getLayersPerPass () const
{
return 10;
}
void TerrainMaterial::Profile::createPass (int index)
{
int layerOffset = index * getLayersPerPass();
sh::MaterialInstancePass* p = mMaterial->createPass ();
p->setProperty ("vertex_program", sh::makeProperty<sh::StringValue>(new sh::StringValue("terrain_vertex")));
p->setProperty ("fragment_program", sh::makeProperty<sh::StringValue>(new sh::StringValue("terrain_fragment")));
}
Ogre::MaterialPtr TerrainMaterial::Profile::generateForCompositeMap(const Ogre::Terrain* terrain) Ogre::MaterialPtr TerrainMaterial::Profile::generateForCompositeMap(const Ogre::Terrain* terrain)
{ {
throw std::runtime_error ("composite map not supported"); throw std::runtime_error ("composite map not supported");

@ -33,6 +33,11 @@ THE SOFTWARE.
#include "OgreTerrainMaterialGenerator.h" #include "OgreTerrainMaterialGenerator.h"
#include "OgreGpuProgramParams.h" #include "OgreGpuProgramParams.h"
namespace sh
{
class MaterialInstance;
}
namespace MWRender namespace MWRender
{ {
@ -64,6 +69,13 @@ namespace MWRender
virtual void requestOptions(Ogre::Terrain* terrain); virtual void requestOptions(Ogre::Terrain* terrain);
private:
sh::MaterialInstance* mMaterial;
void createPass (int index=0);
int getLayersPerPass () const;
}; };
TerrainMaterial(); TerrainMaterial();

@ -476,8 +476,7 @@ WeatherResult WeatherManager::transition(float factor)
result.mSunDiscColor = lerp(current.mSunDiscColor, other.mSunDiscColor); result.mSunDiscColor = lerp(current.mSunDiscColor, other.mSunDiscColor);
result.mFogDepth = lerp(current.mFogDepth, other.mFogDepth); result.mFogDepth = lerp(current.mFogDepth, other.mFogDepth);
result.mWindSpeed = lerp(current.mWindSpeed, other.mWindSpeed); result.mWindSpeed = lerp(current.mWindSpeed, other.mWindSpeed);
//result.mCloudSpeed = lerp(current.mCloudSpeed, other.mCloudSpeed); result.mCloudSpeed = lerp(current.mCloudSpeed, other.mCloudSpeed);
result.mCloudSpeed = current.mCloudSpeed;
result.mCloudOpacity = lerp(current.mCloudOpacity, other.mCloudOpacity); result.mCloudOpacity = lerp(current.mCloudOpacity, other.mCloudOpacity);
result.mGlareView = lerp(current.mGlareView, other.mGlareView); result.mGlareView = lerp(current.mGlareView, other.mGlareView);
result.mNightFade = lerp(current.mNightFade, other.mNightFade); result.mNightFade = lerp(current.mNightFade, other.mNightFade);
@ -689,13 +688,13 @@ void WeatherManager::update(float duration)
mThunderFlash -= duration; mThunderFlash -= duration;
if (mThunderFlash > 0) if (mThunderFlash > 0)
mRendering->getSkyManager()->setThunder( mThunderFlash / WeatherGlobals::mThunderThreshold ); mRendering->getSkyManager()->setLightningStrength( mThunderFlash / WeatherGlobals::mThunderThreshold );
else else
{ {
srand(time(NULL)); srand(time(NULL));
mThunderChanceNeeded = rand() % 100; mThunderChanceNeeded = rand() % 100;
mThunderChance = 0; mThunderChance = 0;
mRendering->getSkyManager()->setThunder( 0.f ); mRendering->getSkyManager()->setLightningStrength( 0.f );
} }
} }
else else
@ -706,14 +705,14 @@ void WeatherManager::update(float duration)
{ {
mThunderFlash = WeatherGlobals::mThunderThreshold; mThunderFlash = WeatherGlobals::mThunderThreshold;
mRendering->getSkyManager()->setThunder( mThunderFlash / WeatherGlobals::mThunderThreshold ); mRendering->getSkyManager()->setLightningStrength( mThunderFlash / WeatherGlobals::mThunderThreshold );
mThunderSoundDelay = WeatherGlobals::mThunderSoundDelay; mThunderSoundDelay = WeatherGlobals::mThunderSoundDelay;
} }
} }
} }
else else
mRendering->getSkyManager()->setThunder(0.f); mRendering->getSkyManager()->setLightningStrength(0.f);
mRendering->setAmbientColour(result.mAmbientColor); mRendering->setAmbientColour(result.mAmbientColor);
mRendering->sunEnable(); mRendering->sunEnable();
@ -725,7 +724,7 @@ void WeatherManager::update(float duration)
{ {
mRendering->sunDisable(); mRendering->sunDisable();
mRendering->skyDisable(); mRendering->skyDisable();
mRendering->getSkyManager()->setThunder(0.f); mRendering->getSkyManager()->setLightningStrength(0.f);
} }
// play sounds // play sounds

2
extern/shiny vendored

@ -1 +1 @@
Subproject commit ca0549ae6db7aa9efb125335942c61fb3f583a8d Subproject commit 1c25aca082214beddd05fa9b8adf481c7299cf0e

@ -0,0 +1,52 @@
#include "core.h"
#define MRT @shGlobalSettingBool(mrt_output)
#ifdef SH_VERTEX_SHADER
SH_BEGIN_PROGRAM
shUniform(float4x4, wvp) @shAutoConstant(wvp, worldviewproj_matrix)
shInput(float2, uv0)
shOutput(float2, UV)
SH_START_PROGRAM
{
shOutputPosition = shMatrixMult(wvp, shInputPosition);
UV = uv0;
}
#else
SH_BEGIN_PROGRAM
shSampler2D(diffuseMap)
shInput(float2, UV)
#if MRT
shDeclareMrtOutput(1)
#endif
shUniform(float4, materialDiffuse) @shAutoConstant(materialDiffuse, surface_diffuse_colour)
shUniform(float4, materialEmissive) @shAutoConstant(materialEmissive, surface_emissive_colour)
shUniform(float4, atmosphereColour) @shSharedParameter(atmosphereColour)
SH_START_PROGRAM
{
float4 tex = shSample(diffuseMap, UV);
shOutputColour(0) = float4(materialEmissive.xyz, 1) * tex;
// use a circle for the alpha (compute UV distance to center)
// looks a bit bad because it's not filtered on the edges,
// but cheaper than a seperate alpha texture.
float sqrUVdist = pow(UV.x-0.5,2) + pow(UV.y-0.5, 2);
shOutputColour(0).a = materialDiffuse.a * (sqrUVdist >= 0.24 ? 0 : 1);
shOutputColour(0).rgb += (1-tex.a) * shOutputColour(0).a * atmosphereColour.rgb; //fill dark side of moon with atmosphereColour
shOutputColour(0).rgb += (1-materialDiffuse.a) * atmosphereColour.rgb; //fade bump
#if MRT
shOutputColour(1) = float4(1,1,1,1);
#endif
}
#endif

@ -0,0 +1,15 @@
shader_set moon_vertex
{
source moon.shader
type vertex
profiles_cg vs_2_0 arbvp1
profiles_hlsl vs_2_0
}
shader_set moon_fragment
{
source moon.shader
type fragment
profiles_cg ps_2_x ps_2_0 ps arbfp1
profiles_hlsl ps_2_0
}

@ -7,11 +7,13 @@ material openmw_moon
fragment_program moon_fragment fragment_program moon_fragment
polygon_mode_overrideable off polygon_mode_overrideable off
depth_write off
depth_check off
scene_blend alpha_blend
texture_unit diffuseMap texture_unit diffuseMap
{ {
texture $diffuseMap texture_alias $texture
create_in_ffp true
} }
} }
} }
@ -33,7 +35,6 @@ material openmw_clouds
texture_unit diffuseMap1 texture_unit diffuseMap1
{ {
texture_alias cloud_texture_1 texture_alias cloud_texture_1
create_in_ffp true
} }
texture_unit diffuseMap2 texture_unit diffuseMap2
@ -90,6 +91,10 @@ material openmw_sun
polygon_mode_overrideable off polygon_mode_overrideable off
depth_check off
depth_write off
scene_blend alpha_blend
texture_unit diffuseMap texture_unit diffuseMap
{ {
direct_texture $texture direct_texture $texture

@ -25,13 +25,11 @@
shDeclareMrtOutput(1) shDeclareMrtOutput(1)
#endif #endif
shUniform(float4, materialDiffuse) @shAutoConstant(materialDiffuse, surface_diffuse_colour) shUniform(float4, materialDiffuse) @shAutoConstant(materialDiffuse, surface_diffuse_colour)
shUniform(float4, materialEmissive) @shAutoConstant(materialEmissive, surface_emissive_colour) //shUniform(float4, materialEmissive) @shAutoConstant(materialEmissive, surface_emissive_colour)
SH_START_PROGRAM SH_START_PROGRAM
{ {
shOutputColour(0) = float4(1,1,1,materialDiffuse.a) * float4(materialEmissive.xyz, 1) * shSample(diffuseMap, UV); shOutputColour(0) = float4(1,1,1,materialDiffuse.a) * shSample(diffuseMap, UV);
shOutputColour(0) = shSample(diffuseMap, UV);
#if MRT #if MRT
shOutputColour(1) = float4(1,1,1,1); shOutputColour(1) = float4(1,1,1,1);

@ -1,6 +1,6 @@
#include "core.h" #include "core.h"
#define FOG @shPropertyBool(fog) #define FOG @shGlobalSettingBool(fog)
#define MRT @shGlobalSettingBool(mrt_output) #define MRT @shGlobalSettingBool(mrt_output)
@ -48,6 +48,8 @@
float depth = @shPassthroughReceive(depth); float depth = @shPassthroughReceive(depth);
shOutputColour(0) = float4(1,0,0,1);
#if MRT #if MRT
//shOutputColour(1) = float4(1,1,1,1); //shOutputColour(1) = float4(1,1,1,1);

Loading…
Cancel
Save