protected internal virtual void PrepareShadowTextures( Camera camera, Viewport viewPort )
{
// Set the illumination stage, prevents recursive calls
IlluminationRenderStage savedStage = this.illuminationStage;
this.illuminationStage = IlluminationRenderStage.RenderToTexture;
// Determine far shadow distance
float shadowDist = this.shadowFarDistance;
if ( shadowDist == 0.0f )
{
// need a shadow distance, make one up
shadowDist = camera.Near * 300;
}
// set fogging to hide the shadow edge
float shadowOffset = shadowDist * this.shadowTextureOffset;
// Precalculate fading info
float shadowEnd = shadowDist + shadowOffset;
float fadeStart = shadowEnd * this.shadowTextureFadeStart;
float fadeEnd = shadowEnd * this.shadowTextureFadeEnd;
// Additive lighting should not use fogging, since it will overbrighten; use border clamp
if ( !this.IsShadowTechniqueAdditive )
{
this.shadowReceiverPass.SetFog( true,
FogMode.Linear,
ColorEx.White,
0,
fadeStart,
fadeEnd );
// if we have a custom receiver material, then give it the fog params too
if ( this.shadowTextureCustomReceiverPass != null )
{
this.shadowTextureCustomReceiverPass.SetFog( true,
FogMode.Linear,
ColorEx.White,
0,
fadeStart,
fadeEnd );
}
}
else
{
// disable fogging explicitly
this.shadowReceiverPass.SetFog( true, FogMode.None );
// if we have a custom receiver material, then give it the fog params too
if ( this.shadowTextureCustomReceiverPass != null )
{
this.shadowTextureCustomReceiverPass.SetFog( true, FogMode.None );
}
}
// Iterate over the lights we've found, max out at the limit of light textures
int sti = 0;
foreach ( Light light in this.lightsAffectingFrustum )
{
// Check limit reached
if ( sti == this.shadowTextures.Count )
break;
// Skip non-shadowing lights
if ( !light.CastShadows )
{
continue;
}
Texture shadowTex = this.shadowTextures[ sti ];
RenderTarget shadowRTT = shadowTex.GetBuffer().GetRenderTarget();
Viewport shadowView = shadowRTT.GetViewport( 0 );
Camera texCam = this.shadowTextureCameras[ sti ];
// rebind camera, incase another SM in use which has switched to its cam
shadowView.Camera = texCam;
// Associate main view camera as LOD camera
texCam.LodCamera = camera;
//Vector3 dir;
// set base
if ( light.Type == LightType.Point )
texCam.Direction = light.DerivedDirection;
if ( light.Type == LightType.Directional )
texCam.Position = light.DerivedPosition;
// Use the material scheme of the main viewport
// This is required to pick up the correct shadow_caster_material and similar properties.
shadowView.MaterialScheme = viewPort.MaterialScheme;
if ( light.CustomShadowCameraSetup == null )
{
_defaultShadowCameraSetup.GetShadowCamera( this, camera, viewPort, light, texCam, sti );
}
else
{
light.CustomShadowCameraSetup.GetShadowCamera( this, camera, viewPort, light, texCam, sti );
}
shadowView.BackgroundColor = ColorEx.White;
// Fire shadow caster update, callee can alter camera settings
// fireShadowTexturesPreCaster(light, texCam);
// Update target
shadowRTT.Update();
++sti;
}
// Set the illumination stage, prevents recursive calls
this.illuminationStage = savedStage;
//fireShadowTexturesUpdated( std::min(mLightsAffectingFrustum.size(), mShadowTextures.size()));
}