mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-10-31 17:26:38 +00:00 
			
		
		
		
	Merge branch 'next' of https://github.com/zinnschlag/openmw into terrain_next
This commit is contained in:
		
						commit
						e04ef38a5c
					
				
					 2 changed files with 79 additions and 74 deletions
				
			
		|  | @ -318,7 +318,10 @@ void RenderingManager::sunDisable() | |||
| 
 | ||||
| void RenderingManager::setSunDirection(const Ogre::Vector3& direction) | ||||
| { | ||||
|     if (mSun) mSun->setDirection(Vector3(direction.x, -direction.z, direction.y)); | ||||
|     // direction * -1 (because 'direction' is camera to sun vector and not sun to camera), 
 | ||||
|     // then convert from MW to ogre coordinates (swap y,z and make y negative)
 | ||||
|     if (mSun) mSun->setDirection(Vector3(-direction.x, -direction.z, direction.y)); | ||||
|      | ||||
|     mSkyManager->setSunDirection(direction); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -51,7 +51,7 @@ void BillboardObject::setPosition(const Vector3& pPosition) | |||
| { | ||||
|     Vector3 normalised = pPosition.normalisedCopy(); | ||||
|     Vector3 finalPosition = normalised * CELESTIAL_BODY_DISTANCE; | ||||
|      | ||||
| 
 | ||||
|     mBBSet->setCommonDirection( -normalised ); | ||||
| 
 | ||||
|     mNode->setPosition(finalPosition); | ||||
|  | @ -83,11 +83,11 @@ void BillboardObject::init(const String& textureName, | |||
|                     SceneNode* rootNode) | ||||
| { | ||||
|     SceneManager* sceneMgr = rootNode->getCreator(); | ||||
|          | ||||
| 
 | ||||
|     Vector3 finalPosition = position.normalisedCopy() * CELESTIAL_BODY_DISTANCE; | ||||
|      | ||||
| 
 | ||||
|     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); | ||||
|  | @ -98,7 +98,7 @@ void BillboardObject::init(const String& textureName, | |||
|     mNode->setPosition(finalPosition); | ||||
|     mNode->attachObject(mBBSet); | ||||
|     mBBSet->createBillboard(0,0,0); | ||||
|      | ||||
| 
 | ||||
|     mMaterial = MaterialManager::getSingleton().create("BillboardMaterial"+StringConverter::toString(bodyCount), ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME); | ||||
|     mMaterial->removeAllTechniques(); | ||||
|     Pass* p = mMaterial->createTechnique()->createPass(); | ||||
|  | @ -110,7 +110,7 @@ void BillboardObject::init(const String& textureName, | |||
|     p->setAmbient(0.0,0.0,0.0); | ||||
|     p->createTextureUnitState(textureName); | ||||
|     mBBSet->setMaterialName("BillboardMaterial"+StringConverter::toString(bodyCount)); | ||||
|      | ||||
| 
 | ||||
|     bodyCount++; | ||||
| } | ||||
| 
 | ||||
|  | @ -146,7 +146,7 @@ Moon::Moon( const String& textureName, | |||
|     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"); | ||||
|  | @ -167,15 +167,17 @@ Moon::Moon( const String& textureName, | |||
|     "{	\n" | ||||
|     "   float4 tex = tex2D(texture, uv); \n" | ||||
|     "   oColor = float4(emissive.xyz,1) * tex2D(texture, uv) * float4(1,1,1,diffuse.a); \n" | ||||
|     "   float bump = pow((1-diffuse.a),4); \n" | ||||
|     "   oColor.rgb += float3(bump, bump, bump)*0.5; \n" | ||||
|     "}"; | ||||
|     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); | ||||
|      | ||||
| 
 | ||||
|     mPhase = Moon::Phase_Full; | ||||
| } | ||||
| 
 | ||||
|  | @ -189,10 +191,10 @@ void Moon::setType(const Moon::Type& type) | |||
| void Moon::setPhase(const Moon::Phase& phase) | ||||
| { | ||||
|     Ogre::String textureName = "textures\\tx_"; | ||||
|      | ||||
| 
 | ||||
|     if (mType == Moon::Type_Secunda) textureName += "secunda_"; | ||||
|     else textureName += "masser_"; | ||||
|      | ||||
| 
 | ||||
|     if      (phase == Moon::Phase_New)              textureName += "new"; | ||||
|     else if (phase == Moon::Phase_WaxingCrescent)   textureName += "one_wax"; | ||||
|     else if (phase == Moon::Phase_WaxingHalf)       textureName += "half_wax"; | ||||
|  | @ -203,9 +205,9 @@ void Moon::setPhase(const Moon::Phase& phase) | |||
|     else if (phase == Moon::Phase_Full)             textureName += "full"; | ||||
| 
 | ||||
|     textureName += ".dds"; | ||||
|      | ||||
| 
 | ||||
|     mMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName(textureName); | ||||
|      | ||||
| 
 | ||||
|     mPhase = phase; | ||||
| } | ||||
| 
 | ||||
|  | @ -224,19 +226,19 @@ unsigned int Moon::getPhaseInt() const | |||
|     else if (mPhase == Moon::Phase_WaxingGibbous)    return 3; | ||||
|     else if (mPhase == Moon::Phase_WaningGibbous)    return 3; | ||||
|     else if (mPhase == Moon::Phase_Full)             return 4; | ||||
|      | ||||
| 
 | ||||
|     return 0; | ||||
| } | ||||
| 
 | ||||
| void SkyManager::ModVertexAlpha(Entity* ent, unsigned int meshType) | ||||
| {     | ||||
| { | ||||
|     // Get the vertex colour buffer of this mesh
 | ||||
|     const Ogre::VertexElement* ves_diffuse = ent->getMesh()->getSubMesh(0)->vertexData->vertexDeclaration->findElementBySemantic( Ogre::VES_DIFFUSE ); | ||||
|     HardwareVertexBufferSharedPtr colourBuffer = ent->getMesh()->getSubMesh(0)->vertexData->vertexBufferBinding->getBuffer(ves_diffuse->getSource()); | ||||
|      | ||||
| 
 | ||||
|     // Lock
 | ||||
|     void* pData = colourBuffer->lock(HardwareBuffer::HBL_NORMAL); | ||||
|      | ||||
| 
 | ||||
|     // Iterate over all vertices
 | ||||
|     int vertex_size = colourBuffer->getVertexSize(); | ||||
|     float * currentVertex = NULL; | ||||
|  | @ -244,7 +246,7 @@ void SkyManager::ModVertexAlpha(Entity* ent, unsigned int meshType) | |||
|     { | ||||
|         // Get a pointer to the vertex colour
 | ||||
|         ves_diffuse->baseVertexPointerToElement( pData, ¤tVertex ); | ||||
|          | ||||
| 
 | ||||
|         unsigned char alpha; | ||||
|         if (meshType == 0) alpha = i%2 ? 0 : 255; // this is a cylinder, so every second vertex belongs to the bottom-most row
 | ||||
|         else if (meshType == 1) | ||||
|  | @ -253,12 +255,12 @@ void SkyManager::ModVertexAlpha(Entity* ent, unsigned int meshType) | |||
|             else if (i>= 33 && i <= 48) alpha = 64; // second bottom-most row
 | ||||
|             else alpha = 255; | ||||
|         } | ||||
|          | ||||
| 
 | ||||
|         uint8 tmpR = static_cast<uint8>(255); | ||||
|         uint8 tmpG = static_cast<uint8>(255); | ||||
|         uint8 tmpB = static_cast<uint8>(255); | ||||
|         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) | ||||
|  | @ -271,14 +273,14 @@ void SkyManager::ModVertexAlpha(Entity* ent, unsigned int meshType) | |||
|         default: | ||||
|             break; | ||||
|         }*/ | ||||
|           | ||||
| 
 | ||||
|         // Modify
 | ||||
|         *((uint32*)currentVertex) = tmpR | (tmpG << 8) | (tmpB << 16) | (tmpA << 24); | ||||
|          | ||||
| 
 | ||||
|         // Move to the next vertex
 | ||||
|         pData+=vertex_size; | ||||
|         pData = static_cast<unsigned char *> (pData) + vertex_size; | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     // Unlock
 | ||||
|     ent->getMesh()->getSubMesh(0)->vertexData->vertexBufferBinding->getBuffer(ves_diffuse->getSource())->unlock(); | ||||
| } | ||||
|  | @ -291,15 +293,15 @@ SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera) : | |||
|     mRootNode = pCamera->getParentSceneNode()->createChildSceneNode(); | ||||
|     mRootNode->pitch(Degree(-90)); // convert MW to ogre coordinates
 | ||||
|     mRootNode->setInheritOrientation(false); | ||||
|      | ||||
| 
 | ||||
|     /// \todo preload all the textures and meshes that are used for sky rendering
 | ||||
|      | ||||
| 
 | ||||
|     // Create overlay used for thunderstorm
 | ||||
|     MaterialPtr material = MaterialManager::getSingleton().create( "ThunderMaterial", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME ); | ||||
|     Pass* pass = material->getTechnique(0)->getPass(0); | ||||
|     pass->setSceneBlending(SBT_TRANSPARENT_ALPHA); | ||||
|     mThunderTextureUnit = pass->createTextureUnitState(); | ||||
|     mThunderTextureUnit->setColourOperationEx(LBX_SOURCE1, LBS_MANUAL, LBS_CURRENT, ColourValue(1.f, 1.f, 1.f)); // always black colour    
 | ||||
|     mThunderTextureUnit->setColourOperationEx(LBX_SOURCE1, LBS_MANUAL, LBS_CURRENT, ColourValue(1.f, 1.f, 1.f)); // always black colour
 | ||||
|     mThunderTextureUnit->setAlphaOperation(LBX_SOURCE1, LBS_MANUAL, LBS_CURRENT, 0.5f); | ||||
|     OverlayManager& ovm = OverlayManager::getSingleton(); | ||||
|     mThunderOverlay = ovm.create( "ThunderOverlay" ); | ||||
|  | @ -311,31 +313,31 @@ SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera) : | |||
|     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->setRenderQueue(RENDER_QUEUE_SKIES_EARLY+4); | ||||
|      | ||||
| 
 | ||||
|     mMasser = new Moon("textures\\tx_masser_full.dds", 0.75, Vector3(-0.4, 0.4, 0.5), mRootNode); | ||||
|     mMasser->setRenderQueue(RENDER_QUEUE_SKIES_EARLY+3); | ||||
|     mMasser->setType(Moon::Type_Masser); | ||||
|      | ||||
| 
 | ||||
|     mSun = new BillboardObject("textures\\tx_sun_05.dds", 1, 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); | ||||
|     mSunGlare->setRenderQueue(RENDER_QUEUE_SKIES_LATE); | ||||
| 
 | ||||
|                  | ||||
| 
 | ||||
|     HighLevelGpuProgramManager& mgr = HighLevelGpuProgramManager::getSingleton(); | ||||
| 
 | ||||
|     // Stars
 | ||||
|     /// \todo sky_night_02.nif (available in Bloodmoon)
 | ||||
|     MeshPtr mesh = NifOgre::NIFLoader::load("meshes\\sky_night_01.nif");         | ||||
|     MeshPtr mesh = NifOgre::NIFLoader::load("meshes\\sky_night_01.nif"); | ||||
|     Entity* night1_ent = mSceneMgr->createEntity("meshes\\sky_night_01.nif"); | ||||
|     night1_ent->setRenderQueueGroup(RENDER_QUEUE_SKIES_EARLY+1); | ||||
|          | ||||
| 
 | ||||
|     mAtmosphereNight = mRootNode->createChildSceneNode(); | ||||
|     mAtmosphereNight->attachObject(night1_ent); | ||||
|      | ||||
| 
 | ||||
|     for (unsigned int i=0; i<night1_ent->getNumSubEntities(); ++i) | ||||
|     { | ||||
|         MaterialPtr mp = night1_ent->getSubEntity(i)->getMaterial(); | ||||
|  | @ -345,12 +347,12 @@ SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera) : | |||
|         mp->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false); | ||||
|         mp->getTechnique(0)->getPass(0)->setDepthCheckEnabled(false); | ||||
|         mp->getTechnique(0)->getPass(0)->setSceneBlending(SBT_TRANSPARENT_ALPHA); | ||||
|          | ||||
| 
 | ||||
|         mStarsMaterials[i] = mp; | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     // Stars vertex shader
 | ||||
|     HighLevelGpuProgramPtr vshader3 = mgr.createProgram("Stars_VP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,  | ||||
|     HighLevelGpuProgramPtr vshader3 = mgr.createProgram("Stars_VP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, | ||||
|         "cg", GPT_VERTEX_PROGRAM); | ||||
|     vshader3->setParameter("profiles", "vs_2_x arbvp1"); | ||||
|     vshader3->setParameter("entry_point", "main_vp"); | ||||
|  | @ -373,9 +375,9 @@ SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera) : | |||
|     vshader3->load(); | ||||
|     vshader3->getDefaultParameters()->setNamedAutoConstant("worldViewProj", GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX); | ||||
|     night1_ent->getSubEntity(3)->getMaterial()->getTechnique(0)->getPass(0)->setVertexProgram(vshader3->getName()); | ||||
|      | ||||
| 
 | ||||
|     // Stars fragment shader
 | ||||
|     HighLevelGpuProgramPtr stars_fp = mgr.createProgram("Stars_FP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,  | ||||
|     HighLevelGpuProgramPtr stars_fp = mgr.createProgram("Stars_FP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, | ||||
|         "cg", GPT_FRAGMENT_PROGRAM); | ||||
|     stars_fp->setParameter("profiles", "ps_2_x arbfp1"); | ||||
|     stars_fp->setParameter("entry_point", "main_fp"); | ||||
|  | @ -398,25 +400,25 @@ SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera) : | |||
|     stars_fp->getDefaultParameters()->setNamedAutoConstant("emissive", GpuProgramParameters::ACT_SURFACE_EMISSIVE_COLOUR); | ||||
|     stars_fp->getDefaultParameters()->setNamedAutoConstant("diffuse", GpuProgramParameters::ACT_SURFACE_DIFFUSE_COLOUR); | ||||
|     night1_ent->getSubEntity(3)->getMaterial()->getTechnique(0)->getPass(0)->setFragmentProgram(stars_fp->getName()); | ||||
|      | ||||
| 
 | ||||
|     // Atmosphere (day)
 | ||||
|     mesh = NifOgre::NIFLoader::load("meshes\\sky_atmosphere.nif");         | ||||
|     mesh = NifOgre::NIFLoader::load("meshes\\sky_atmosphere.nif"); | ||||
|     Entity* atmosphere_ent = mSceneMgr->createEntity("meshes\\sky_atmosphere.nif"); | ||||
|      | ||||
| 
 | ||||
|     ModVertexAlpha(atmosphere_ent, 0); | ||||
|      | ||||
| 
 | ||||
|     atmosphere_ent->setRenderQueueGroup(RENDER_QUEUE_SKIES_EARLY); | ||||
|     mAtmosphereDay = mRootNode->createChildSceneNode(); | ||||
|     mAtmosphereDay->attachObject(atmosphere_ent); | ||||
|     mAtmosphereMaterial = atmosphere_ent->getSubEntity(0)->getMaterial(); | ||||
|      | ||||
| 
 | ||||
|     // Atmosphere shader
 | ||||
|     HighLevelGpuProgramPtr vshader = mgr.createProgram("Atmosphere_VP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,  | ||||
|     HighLevelGpuProgramPtr vshader = mgr.createProgram("Atmosphere_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" | ||||
|  | @ -433,7 +435,7 @@ SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera) : | |||
|     "}"; | ||||
|     vshader->setSource(outStream.str()); | ||||
|     vshader->load(); | ||||
|      | ||||
| 
 | ||||
|     vshader->getDefaultParameters()->setNamedAutoConstant("worldViewProj", GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX); | ||||
|     vshader->getDefaultParameters()->setNamedAutoConstant("emissive", GpuProgramParameters::ACT_SURFACE_EMISSIVE_COLOUR); | ||||
|     mAtmosphereMaterial->getTechnique(0)->getPass(0)->setVertexProgram(vshader->getName()); | ||||
|  | @ -445,9 +447,9 @@ SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera) : | |||
|     SceneNode* clouds_node = mRootNode->createChildSceneNode(); | ||||
|     clouds_node->attachObject(clouds_ent); | ||||
|     mCloudMaterial = clouds_ent->getSubEntity(0)->getMaterial(); | ||||
|      | ||||
| 
 | ||||
|     // Clouds vertex shader
 | ||||
|     HighLevelGpuProgramPtr vshader2 = mgr.createProgram("Clouds_VP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,  | ||||
|     HighLevelGpuProgramPtr vshader2 = mgr.createProgram("Clouds_VP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, | ||||
|         "cg", GPT_VERTEX_PROGRAM); | ||||
|     vshader2->setParameter("profiles", "vs_2_x arbvp1"); | ||||
|     vshader2->setParameter("entry_point", "main_vp"); | ||||
|  | @ -471,9 +473,9 @@ SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera) : | |||
|     vshader2->load(); | ||||
|     vshader2->getDefaultParameters()->setNamedAutoConstant("worldViewProj", GpuProgramParameters::ACT_WORLDVIEWPROJ_MATRIX); | ||||
|     mCloudMaterial->getTechnique(0)->getPass(0)->setVertexProgram(vshader2->getName()); | ||||
|      | ||||
| 
 | ||||
|     // Clouds fragment shader
 | ||||
|     mCloudFragmentShader = mgr.createProgram("Clouds_FP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME,  | ||||
|     mCloudFragmentShader = mgr.createProgram("Clouds_FP", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, | ||||
|         "cg", GPT_FRAGMENT_PROGRAM); | ||||
|     mCloudFragmentShader->setParameter("profiles", "ps_2_x arbfp1"); | ||||
|     mCloudFragmentShader->setParameter("entry_point", "main_fp"); | ||||
|  | @ -501,16 +503,16 @@ SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera) : | |||
|     mCloudFragmentShader->getDefaultParameters()->setNamedAutoConstant("emissive", GpuProgramParameters::ACT_SURFACE_EMISSIVE_COLOUR); | ||||
|     mCloudMaterial->getTechnique(0)->getPass(0)->setFragmentProgram(mCloudFragmentShader->getName()); | ||||
|     setCloudsOpacity(0.75); | ||||
|      | ||||
| 
 | ||||
|     ModVertexAlpha(clouds_ent, 1); | ||||
|      | ||||
| 
 | ||||
|     // I'm not sure if the materials are being used by any other objects
 | ||||
|     // Make a unique "modifiable" copy of the materials to be sure
 | ||||
|     mCloudMaterial = mCloudMaterial->clone("Clouds"); | ||||
|     clouds_ent->getSubEntity(0)->setMaterial(mCloudMaterial); | ||||
|     mAtmosphereMaterial = mAtmosphereMaterial->clone("Atmosphere"); | ||||
|     atmosphere_ent->getSubEntity(0)->setMaterial(mAtmosphereMaterial); | ||||
|      | ||||
| 
 | ||||
|     mAtmosphereMaterial->getTechnique(0)->getPass(0)->setSelfIllumination(1.0, 1.0, 1.0); | ||||
|     mAtmosphereMaterial->getTechnique(0)->getPass(0)->setDiffuse(0.0, 0.0, 0.0, 0.0); | ||||
|     mAtmosphereMaterial->getTechnique(0)->getPass(0)->setAmbient(0.0, 0.0, 0.0); | ||||
|  | @ -519,7 +521,7 @@ SkyManager::SkyManager (SceneNode* pMwRoot, Camera* pCamera) : | |||
|     mAtmosphereMaterial->getTechnique(0)->getPass(0)->setDepthWriteEnabled(false); | ||||
|     mAtmosphereMaterial->getTechnique(0)->getPass(0)->setSceneBlending(SBT_TRANSPARENT_ALPHA); | ||||
|     mCloudMaterial->getTechnique(0)->getPass(0)->setSceneBlending(SBT_TRANSPARENT_ALPHA); | ||||
|      | ||||
| 
 | ||||
|     mCloudMaterial->getTechnique(0)->getPass(0)->createTextureUnitState(""); | ||||
| } | ||||
| 
 | ||||
|  | @ -544,15 +546,15 @@ int SkyManager::getSecundaPhase() const | |||
| void SkyManager::update(float duration) | ||||
| { | ||||
|     if (!mEnabled) return; | ||||
|      | ||||
| 
 | ||||
|     // UV Scroll the clouds
 | ||||
|     mCloudMaterial->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstantFromTime("time", 1); | ||||
|      | ||||
| 
 | ||||
|     /// \todo improve this
 | ||||
|     mMasser->setPhase( static_cast<Moon::Phase>( (int) ((mDay % 32)/4.f)) ); | ||||
|     mSecunda->setPhase ( static_cast<Moon::Phase>( (int) ((mDay % 32)/4.f)) ); | ||||
|      | ||||
|     // increase the strength of the sun glare effect depending 
 | ||||
| 
 | ||||
|     // increase the strength of the sun glare effect depending
 | ||||
|     // on how directly the player is looking at the sun
 | ||||
|     if (mSunEnabled) | ||||
|     { | ||||
|  | @ -562,7 +564,7 @@ void SkyManager::update(float duration) | |||
|         const Degree angle = sun.angleBetween( cam ); | ||||
|         float val = 1- (angle.valueDegrees() / 180.f); | ||||
|         val = (val*val*val*val)*2; | ||||
|          | ||||
| 
 | ||||
|         if (mGlareEnabled) | ||||
|         { | ||||
|             mGlareFade += duration*3; | ||||
|  | @ -573,10 +575,10 @@ void SkyManager::update(float duration) | |||
|             mGlareFade -= duration*3; | ||||
|             if (mGlareFade < 0.3) mGlareFade = 0; | ||||
|         } | ||||
|          | ||||
| 
 | ||||
|         mSunGlare->setSize(val * (mGlareFade)); | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     mSunGlare->setVisible(mGlareFade>0 && mSunEnabled); | ||||
|     mSun->setVisible(mSunEnabled); | ||||
|     mMasser->setVisible(mMasserEnabled); | ||||
|  | @ -613,47 +615,47 @@ void SkyManager::setWeather(const MWWorld::WeatherResult& weather) | |||
|         mCloudMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(0)->setTextureName("textures\\"+weather.mCloudTexture); | ||||
|         mClouds = weather.mCloudTexture; | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     if (mNextClouds != weather.mNextCloudTexture) | ||||
|     { | ||||
|         mCloudMaterial->getTechnique(0)->getPass(0)->getTextureUnitState(1)->setTextureName("textures\\"+weather.mNextCloudTexture); | ||||
|         mNextClouds = weather.mNextCloudTexture; | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     if (mCloudBlendFactor != weather.mCloudBlendFactor) | ||||
|     { | ||||
|         mCloudMaterial->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("transitionFactor", Real(weather.mCloudBlendFactor)); | ||||
|         mCloudBlendFactor = weather.mCloudBlendFactor; | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     if (mCloudOpacity != weather.mCloudOpacity) | ||||
|     { | ||||
|         mCloudMaterial->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("opacity", Real(weather.mCloudOpacity)); | ||||
|         mCloudOpacity = weather.mCloudOpacity; | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     if (mCloudColour != weather.mSunColor) | ||||
|     { | ||||
|         ColourValue clr( weather.mSunColor.r*0.7 + weather.mAmbientColor.r*0.7, | ||||
|                         weather.mSunColor.g*0.7 + weather.mAmbientColor.g*0.7, | ||||
|                         weather.mSunColor.b*0.7 + weather.mAmbientColor.b*0.7); | ||||
|          | ||||
| 
 | ||||
|         mCloudMaterial->getTechnique(0)->getPass(0)->setSelfIllumination(clr); | ||||
|         mCloudColour = weather.mSunColor; | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     if (mSkyColour != weather.mSkyColor) | ||||
|     {  | ||||
|     { | ||||
|         mAtmosphereMaterial->getTechnique(0)->getPass(0)->setSelfIllumination(weather.mSkyColor); | ||||
|         mSkyColour = weather.mSkyColor; | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     if (mCloudSpeed != weather.mCloudSpeed) | ||||
|     { | ||||
|         mCloudMaterial->getTechnique(0)->getPass(0)->getFragmentProgramParameters()->setNamedConstant("speed", Real(weather.mCloudSpeed)); | ||||
|         mCloudSpeed = weather.mCloudSpeed; | ||||
|     } | ||||
|      | ||||
| 
 | ||||
|     if (weather.mNight && mStarsOpacity != weather.mNightFade) | ||||
|     { | ||||
|         for (int i=0; i<7; ++i) | ||||
|  | @ -667,9 +669,9 @@ void SkyManager::setWeather(const MWWorld::WeatherResult& weather) | |||
|         strength = timeofday_angle/0.44f; | ||||
|     else | ||||
|         strength = 1.f; | ||||
|      | ||||
| 
 | ||||
|     mSunGlare->setVisibility(weather.mGlareView * strength); | ||||
|      | ||||
| 
 | ||||
|     mAtmosphereNight->setVisible(weather.mNight && mEnabled); | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue