// Ryzom - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#include "stdpch.h"
#include "water_env_map_rdr.h"
#include "sky.h"
#include "global.h"
#include "view.h"
#include "continent_manager.h"
#include "light_cycle_manager.h"
#include "weather.h"
#include "nel/3d/viewport.h"
#include "nel/3d/u_driver.h"
#include "nel/misc/matrix.h"
#include "nel/misc/vectord.h"
using namespace NL3D;
using namespace NLMISC;
extern CContinentManager ContinentMngr;
extern CFogState RootFogState;
H_AUTO_DECL(RZ_WaterEnvMapRDR)
static void renderEnvMapScene(UScene *scene, UCamera &cam, const CMatrix &camMatrix, float znear, float zfar)
{
H_AUTO_USE(RZ_WaterEnvMapRDR)
if (!scene) return;
if (!cam.empty())
{
UCamera oldCam = scene->getCam();
scene->setCam(cam);
cam.setTransformMode(UTransformable::DirectMatrix);
cam.setFrustum(-znear, znear, -znear, znear, znear, zfar);
cam.setMatrix(camMatrix);
CViewport old = scene->getViewport();
scene->setViewport(CViewport());
scene->beginPartRender();
scene->renderPart((UScene::TRenderPart) (UScene::RenderOpaque | UScene::RenderTransparent));
scene->endPartRender();
scene->setViewport(old);
scene->setCam(oldCam);
}
}
void CWaterEnvMapRdr::doRender(const CMatrix &camMatrix, TGlobalAnimationTime time, UDriver &drv)
{
H_AUTO_USE(RZ_WaterEnvMapRDR)
drv.clearZBuffer();
if (time != _LastRenderStartTime) // begin a new rendering of the cube
{
_DateForRender = CurrDate;
_AnimationDateForRender = AnimationDate;
_WeatherForRender = CurrWeather;
_FogColorForRender = CurrFogColor;
_LastRenderStartTime = time;
_CurrCanopyCamPos = View.currentViewPos();
}
if (Sky)
{
Sky->setup(_DateForRender, _AnimationDateForRender, _WeatherForRender, _FogColorForRender, CVector(0.5f, 0.f, -0.85f).normed(), true);
if (CurrTime != -1)
{
if (Sky->getScene()) Sky->getScene()->animate(CurrTime); // this will force the elapsed time to be set to so that fx won't be animated twice
}
}
drv.setCullMode(drv.getCullMode() == UDriver::CCW ? UDriver::CW : UDriver::CCW);
// render canopy
ContinentMngr.getFogState(CanopyFog, LightCycleManager.getLightLevel(), LightCycleManager.getLightDesc().DuskRatio, LightCycleManager.getState(), CVectorD(View.viewPos()), RootFogState);
RootFogState.setupInDriver(drv);
CMatrix mat = camMatrix;
drv.setDepthRange(0.f, 0.5f);
mat.setPos(_CurrCanopyCamPos);
renderEnvMapScene(SceneRoot, WaterEnvMapCanopyCam, mat, SceneRootCameraZNear, SceneRootCameraZFar);
Driver->enableFog(false);
// render sky
if (Sky)
{
drv.setDepthRange(0.5f, 1.f); // force sky scene to appear behind canopy scene
mat.setPos(CVector(0.f, 0.f, Sky->getWaterEnvMapCameraHeight()));
renderEnvMapScene(Sky->getScene(), WaterEnvMapSkyCam, mat, 0.1f, 1000.f);
}
drv.setCullMode(drv.getCullMode() == UDriver::CCW ? UDriver::CW : UDriver::CCW);
drv.setDepthRange(0.f, 1.f);
}