if (pass.ShadowReceiverFragmentProgramName != "")
{
keepTUCount = 1;
http://retPass.LightingEnabled = true;
http://retPass.Ambient = pass.Ambient;
http://retPass.Diffuse = pass.Diffuse;
http://retPass.Specular = pass.Specular;
http://retPass.Shininess = pass.Shininess;
http://retPass.SetRunNTimesPerLight(pass.RunOncePerLight, // pass.PassIterationCount,
// pass.LightsPerIteration,
// pass.RunOnlyForOneLightType,
// pass.OnlyLightType);
int origPassTUCount = pass.NumTextureUnitStages;
for (int t = 0; t < origPassTUCount; ++t)
{
int targetIndex = t + 1;
TextureUnitState tex = (retPass.NumTextureUnitStages <= targetIndex ?
retPass.CreateTextureUnitState() :
retPass.GetTextureUnitState(targetIndex));
pass.GetTextureUnitState(t).CopyTo(tex);
}
keepTUCount = origPassTUCount + 1;
pass.SetShadowReceiverFragmentProgram(pass.ShadowReceiverFragmentProgramName);
// Have to merge the shadow receiver vertex program in
retPass.SetFragmentProgram(pass.ShadowReceiverFragmentProgramName);
GpuProgram prg = retPass.FragmentProgram;
// Load this program if not done already
if (!prg.IsLoaded)
prg.Load();
// Copy params
retPass.FragmentProgramParameters = pass.ShadowReceiverFragmentProgramParameters;
// Did we bind a shadow vertex program?
if (pass.HasVertexProgram && !retPass.HasVertexProgram)
{
// We didn't bind a receiver-specific program, so bind the original
retPass.SetVertexProgram(pass.VertexProgramName);
prg = retPass.VertexProgram;
// Load this program if required
if (!prg.IsLoaded)
prg.Load();
// Copy params
retPass.VertexProgramParameters = pass.VertexProgramParameters;
}
}//end if (pass.ShadowReceiverFragmentProgramName != "")
else
{
// Reset any merged fragment programs from last time
if (retPass == shadowTextureCustomReceiverPass)
{
// reset fp?
if (retPass.FragmentProgramName != shadowTextureCustomReceiverFragmentProgram)
{
retPass.SetFragmentProgram(shadowTextureCustomReceiverFragmentProgram);
if (retPass.HasFragmentProgram)
retPass.FragmentProgramParameters = shadowTextureCustomReceiverFPParams;
}
}
else
// Standard shadow receiver pass, reset to no fp
retPass.SetFragmentProgram("");
}