Iterating over lights in a software shader

Contrary to the GPU version, a software shader contained in the RED::MTL_LIT pass have to loop through the lights in order to cumulate their effect.

Here is a simple code to iterate over the lights and perform sampling when needed:

// let:
// - rayctx be the RED::ISoftRayContext.
// - shaderctx be the RED::ISoftShaderContext.
// - renderctx be the RED::ISoftRenderingContext.
double hit[4], normal[4];
double latt[4];
double ldir[4], lcolor[4], lshadows[4];
bool moresamples;

// Get the ray hit and normal.
rayctx.GetWCSHit( hit );
rayctx.GetWCSNormal( normal, shaderctx.GetRenderCode(), RED_VSH_NORMAL );

// Prepare lights before shading.
// This call is mandatory before accessing the lights.
RC_TEST( rayctx.PrepareLights( hit, normal, false, renderctx ) );

// Iterate over the scene lights.
for( unsigned int i = 0; i < renderctx.GetLightsCount(); ++i )
{
  const RED::ISoftLight& light = renderctx.GetLight( i );

  // Perform culling.
  if( !light.GetAttenuation( latt, rayctx.GetThreadID() ) )
    continue;

  // Sampled light.
  if( light.NeedSampling() )
  {
    moresamples = true;
    while( true )
    {
      RC_TEST( light.GetNextWCSSample( moresamples,
                                       ldir, lcolor, lshadows, 
                                       hit, normal, 
                                       rayctx, renderctx ) );
      if( !moresamples )
        break;

      // Do something with the light sample...
    }
  }
  // Not sampled light.
  else
  {
    // Do something with the light...
  }
}