bool vPlanet::Render(LPDIRECT3DDEVICE9 dev)
{
_TRACE;
if (!active) return false;
D3D9Effect::UpdateEffectCamera(hObj);
D3D9Effect::FX->SetFloat(D3D9Effect::eDistScale, 1.0f/float(dist_scale));
const Scene::SHADOWMAPPARAM *shd = scn->GetSMapData();
float s = float(shd->size);
float is = 1.0f / s;
float qw = 1.0f / float(Config->ShadowMapSize);
HR(D3D9Effect::FX->SetBool(D3D9Effect::eEnvMapEnable, false));
HR(D3D9Effect::FX->SetBool(D3D9Effect::eShadowToggle, false));
if (shd->pShadowMap && (scn->GetRenderPass() == RENDERPASS_MAINSCENE) && (Config->TerrainShadowing == 2)) {
if (scn->GetCameraAltitude() < 10e3 || IsMesh()) {
HR(D3D9Effect::FX->SetMatrix(D3D9Effect::eLVP, &shd->mViewProj));
HR(D3D9Effect::FX->SetTexture(D3D9Effect::eShadowMap, shd->pShadowMap));
HR(D3D9Effect::FX->SetVector(D3D9Effect::eSHD, &D3DXVECTOR4(s, is, qw, 0)));
HR(D3D9Effect::FX->SetBool(D3D9Effect::eShadowToggle, true));
}
}
if (!mesh) { // Skip for a mesh
PlanetRenderer::InitializeScattering(this);
PlanetRenderer::SetViewProjectionMatrix(scn->GetProjectionViewMatrix());
}
if (DebugControls::IsActive()) {
// DWORD flags = *(DWORD*)gc->GetConfigParam(CFGPRM_GETDEBUGFLAGS);
DWORD displ = *(DWORD*)gc->GetConfigParam(CFGPRM_GETDISPLAYMODE);
vObject *vSel = DebugControls::GetVisual();
if (vSel && displ>0) {
if (vSel->GetObjectA()) {
if (oapiGetObjectType(vSel->GetObjectA())==OBJTP_VESSEL) return false;
}
}
}
pCurrentVisual = this;
if (renderpix) { // render as 2x2 pixel block
RenderDot (dev);
} else { // render as sphere
DWORD amb = prm.amb0col;
//// bool ringpostrender = false;
float fogfactor;
//
// D3DCOLOR bg = scn->GetBgColour();
// prm.bFog = prm.bFogEnabled;
// prm.bTint = prm.bFogEnabled;
// prm.bAddBkg = ((bg & 0xFFFFFF) && (hObj != scn->GetCameraProxyBody()));
// prm.FogDensity = 0.0f;
// prm.SkyColor = D3DXCOLOR(bg);
// prm.AmbColor = D3DXCOLOR(0,0,0,0);
// prm.FogColor = D3DXCOLOR(0,0,0,0);
// prm.TintColor = D3DXCOLOR(0,0,0,0);
// prm.SunDir = _D3DXVECTOR3(SunDirection());
if (ringmgr) {
ringmgr->Render(dev, mWorld, false);
dev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
}
//if (hazemgr2) {
// double apr = 180.0 * scn->GetCameraAperture() / (scn->GetCameraAspect() * PI);
// hazemgr2->Render(mWorld, float(apr));
//}
if (prm.bCloud && (prm.cloudvis & 1))
RenderCloudLayer (dev, D3DCULL_NONE); // render clouds from below
if (hazemgr) hazemgr->Render(dev, mWorld); // horizon ring
if (prm.bAtm) {
if (ModLighting (amb))
prm.AmbColor = D3DXCOLOR(amb);
}
if (prm.bFog) { // set up distance fog
double h = max (1.0, cdist-size);
VECTOR3 fogcol = fog.col;
double h_ref = fog.alt_ref; // 3e3;
double fog_0 = fog.dens_0; // 5e-5;
double fog_ref = fog.dens_ref; // 3e-5;
double h_max = size*1.5; // At this altitude, fog effect drops to zero
// double scl = h_ref*fog_ref;
if (h < h_ref) {
// linear zone
fogfactor = (float)(h/h_ref * (fog_ref-fog_0) + fog_0);
} else {
// hyperbolic zone: fogfactor = a/(h+b) + c
// a, b and c are designed such that
// * fogfactor(h) is continuous at h = h_ref
// * d fogfactor / dh is continuous at h = h_ref
// * fogfactor(h_max) = 0
double b = - (fog_ref*h_max + (fog_ref-fog_0)*(h_max-h_ref)) / (fog_ref + (fog_ref-fog_0)/h_ref * (h_max-h_ref));
double a = fog_ref*(h_ref+b)*(h_max+b)/(h_max-h_ref);
double c = -a/(h_max+b);
fogfactor = (float)(a/(h+b)+c);
}
if (fogfactor < 0.0) prm.bFog = false;
else {
// day/nighttime fog lighting
VECTOR3 ppos;
oapiGetGlobalPos (hObj, &ppos);
double cosa = dotp (unit(ppos), unit(cpos));
double bright = 1.0 * max (0.0, min (1.0, cosa + 0.3));
float rfog = (float)(bright*(min(1.0,fogcol.x)+0.0)); // "whiten" the fog colour
float gfog = (float)(bright*(min(1.0,fogcol.y)+0.0));
float bfog = (float)(bright*(min(1.0,fogcol.z)+0.0));
prm.FogDensity = fogfactor;
prm.FogColor = D3DXCOLOR(rfog, gfog, bfog, 1.0f);
}
}
//if (mesh) {
// mesh->SetSunLight(scn->GetSun());
// mesh->Render(&mWorld, RENDER_ASTEROID);
//} else {
// RenderSphere (dev);
//}
if (nbase) RenderBaseStructures (dev);
//if (prm.bCloud && (prm.cloudvis & 2))
// RenderCloudLayer (dev, D3DCULL_CCW); // render clouds from above
//if (hazemgr) hazemgr->Render (dev, mWorld, true); // haze across planet disc
//if (ringmgr) {
// ringmgr->Render (dev, mWorld, true);
// dev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
//}
}
// Shutdown shadows to prevent from causing problems
HR(D3D9Effect::FX->SetBool(D3D9Effect::eShadowToggle, false));
return true;
}