void CSceletalAnimationView::OnTimer(UINT_PTR nIDEvent) { CEngine *Engine = ((CSceletalAnimationApp*)AfxGetApp())->m_Engine; Ogre::Root *Root = Engine->GetRoot(); Ogre::SceneManager *SceneManager = Root->getSceneManager("Animation"); Ogre::Entity *Entity = SceneManager->getEntity("Animation"); Ogre::Skeleton *Skeleton = Entity->getSkeleton(); m_AnimationState->addTime(0.1); Root->renderOneFrame(); CView::OnTimer(nIDEvent); }
void EC_OgreEnvironment::UpdateVisualEffects(f64 frametime) { if (renderer_.expired()) return; RendererPtr renderer = renderer_.lock(); Ogre::Camera *camera = renderer->GetCurrentCamera(); Ogre::Viewport *viewport = renderer->GetViewport(); Ogre::SceneManager *sceneManager = renderer->GetSceneManager(); #ifdef CAELUM // Set sunlight attenuation using diffuse multiplier. // Seems to be working ok, but feel free to fix if you find better logic and/or values. Ogre::ColourValue diffuseMultiplier(sunColorMultiplier_, sunColorMultiplier_, sunColorMultiplier_, 1); caelumSystem_->getSun()->setDiffuseMultiplier(diffuseMultiplier); Ogre::Light* sun = caelumSystem_->getSun()->getMainLight(); Ogre::Light* moon = caelumSystem_->getMoon()->getMainLight(); float sunDirZaxis = caelumSystem_->getSun()->getMainLight()->getDirection().z; if (sunDirZaxis > 0) { sunColorMultiplier_ -= 0.005f; if (sunColorMultiplier_ <= 0.05f) sunColorMultiplier_ = 0.05f; } else if(sunDirZaxis < 0) { sunColorMultiplier_ += 0.010f; if (sunColorMultiplier_ >= MAX_SUNLIGHT_MULTIPLIER) sunColorMultiplier_ = MAX_SUNLIGHT_MULTIPLIER; } if ( !fog_color_override_) fogColor_ = caelumSystem_->getGroundFog()->getColour(); #endif #ifdef CAELUM // Update Caelum system. caelumSystem_->notifyCameraChanged(camera); caelumSystem_->updateSubcomponents(frametime); // Disable specular from the sun & moon for now, because it easily leads to too strong results sun->setSpecularColour(0.0f, 0.0f, 0.0f); moon->setSpecularColour(0.0f, 0.0f, 0.0f); #endif #ifdef HYDRAX // Update Hydrax system. hydraxSystem_->update(frametime); sunPos = camera->getPosition(); sunPos -= caelumSystem_->getSun()->getLightDirection() * 80000; hydraxSystem_->setSunPosition(sunPos); #endif Ogre::Entity* water = 0; cameraFarClip_ = renderer->GetViewDistance(); if ( sceneManager->hasEntity("WaterEntity") ) water = sceneManager->getEntity("WaterEntity"); if (!water) { // No water entity, set fog value. Real fogStart = fogStart_; Real fogEnd = fogEnd_; ClampFog(fogStart, fogEnd, cameraFarClip_); sceneManager->setFog(Ogre::FOG_LINEAR, fogColor_, 0.001, fogStart, fogEnd); viewport->setBackgroundColour(fogColor_); camera->setFarClipDistance(cameraFarClip_); } else { if(camera->getDerivedPosition().z >= water->getParentNode()->getPosition().z) { // We're above the water. Real fogStart = fogStart_; Real fogEnd = fogEnd_; ClampFog(fogStart, fogEnd, cameraFarClip_); #ifdef CAELUM caelumSystem_->forceSubcomponentVisibilityFlags(caelumComponents_); #endif sceneManager->setFog(Ogre::FOG_LINEAR, fogColor_, 0.001, fogStart, fogEnd); viewport->setBackgroundColour(fogColor_); camera->setFarClipDistance(cameraFarClip_); cameraUnderWater_ = false; } else { // We're below the water. Real fogStart = waterFogStart_; Real fogEnd = waterFogEnd_; Real farClip = waterFogEnd_ + 10.f; if (farClip > cameraFarClip_) farClip = cameraFarClip_; ClampFog(fogStart, fogEnd, farClip); #ifdef CAELUM // Hide the Caelum subsystems. caelumSystem_->forceSubcomponentVisibilityFlags(Caelum::CaelumSystem::CAELUM_COMPONENTS_NONE); #endif sceneManager->setFog(Ogre::FOG_LINEAR, fogColor_ * waterFogColor_, 0.001, fogStart, fogEnd); viewport->setBackgroundColour(fogColor_ * waterFogColor_); camera->setFarClipDistance(farClip); cameraUnderWater_ = true; } } #ifdef CAELUM // If sun color and direction are controlled by user then their value are needed to override here. // internally caelum calculates new values for those so they are needed to set again in each update loop. if ( override_flags_.testFlag(None) ) return; if ( override_flags_.testFlag(AmbientLight)) { // Override ambient light. sceneManager->setAmbientLight(userAmbientLight_); } if ( override_flags_.testFlag(SunDirection) ) { // Override sun direction. if ( sun != 0 ) sun->setDirection(userSunDirection_); } if ( override_flags_.testFlag(SunColor) ) { // Override sun color. if ( sun != 0 ) sun->setDiffuseColour(userSunColor_); } #endif }