void GeoSphereSurfaceMaterial::SetGSUniforms() { GeoSphereProgram *p = static_cast<GeoSphereProgram*>(m_program); const GeoSphere::MaterialParameters params = *static_cast<GeoSphere::MaterialParameters*>(this->specialParameter0); const SystemBody::AtmosphereParameters ap = params.atmosphere; p->Use(); p->invLogZfarPlus1.Set(m_renderer->m_invLogZfarPlus1); p->emission.Set(this->emissive); p->sceneAmbient.Set(m_renderer->GetAmbientColor()); p->atmosColor.Set(ap.atmosCol); p->geosphereAtmosFogDensity.Set(ap.atmosDensity); p->geosphereAtmosInvScaleHeight.Set(ap.atmosInvScaleHeight); p->geosphereAtmosTopRad.Set(ap.atmosRadius); p->geosphereCenter.Set(ap.center); p->geosphereScaledRadius.Set(ap.planetRadius / ap.scale); p->geosphereScale.Set(ap.scale); // we handle up to three shadows at a time int occultedLight[3] = {-1,-1,-1}; vector3f shadowCentreX; vector3f shadowCentreY; vector3f shadowCentreZ; vector3f srad; vector3f lrad; vector3f sdivlrad; std::vector<Camera::Shadow>::const_iterator it = params.shadows.begin(), itEnd = params.shadows.end(); int j = 0; while (j<3 && it != itEnd) { occultedLight[j] = it->occultedLight; shadowCentreX[j] = it->centre[0]; shadowCentreY[j] = it->centre[1]; shadowCentreZ[j] = it->centre[2]; srad[j] = it->srad; lrad[j] = it->lrad; sdivlrad[j] = it->srad / it->lrad; ++it; ++j; } p->shadows.Set(j); p->occultedLight.Set(occultedLight); p->shadowCentreX.Set(shadowCentreX); p->shadowCentreY.Set(shadowCentreY); p->shadowCentreZ.Set(shadowCentreZ); p->srad.Set(srad); p->lrad.Set(lrad); p->sdivlrad.Set(sdivlrad); }
void GeoSphereSurfaceMaterial::SetGSUniforms() { GeoSphereProgram *p = static_cast<GeoSphereProgram*>(m_program); const SystemBody::AtmosphereParameters ap = *static_cast<SystemBody::AtmosphereParameters*>(this->specialParameter0); p->Use(); p->invLogZfarPlus1.Set(m_renderer->m_invLogZfarPlus1); p->emission.Set(this->emissive); p->sceneAmbient.Set(m_renderer->GetAmbientColor()); p->atmosColor.Set(ap.atmosCol); p->geosphereAtmosFogDensity.Set(ap.atmosDensity); p->geosphereAtmosInvScaleHeight.Set(ap.atmosInvScaleHeight); p->geosphereAtmosTopRad.Set(ap.atmosRadius); p->geosphereCenter.Set(ap.center); p->geosphereScaledRadius.Set(ap.planetRadius / ap.scale); p->geosphereScale.Set(ap.scale); }