bool outputLight( const ScenePlug *scene, const ScenePlug::ScenePath &path, IECore::Renderer *renderer ) { IECore::ConstLightPtr constLight = runTimeCast<const IECore::Light>( scene->object( path ) ); if( !constLight ) { return false; } if( !visible( scene, path ) ) { /// \todo Since both visible() and fullAttributes() perform similar work, /// we may want to combine them into one query if we see this function /// being a significant fraction of render time. Maybe something like /// `fullAttributes( returnNullIfInvisible = true )`? It probably also /// makes sense to migrate all the convenience functions from ScenePlug /// into SceneAlgo. return false; } ConstCompoundObjectPtr attributes = scene->fullAttributes( path ); const M44f transform = scene->fullTransform( path ); std::string lightHandle; ScenePlug::pathToString( path, lightHandle ); LightPtr light = constLight->copy(); light->setHandle( lightHandle ); { AttributeBlock attributeBlock( renderer ); renderer->setAttribute( "name", new StringData( lightHandle ) ); outputAttributes( attributes.get(), renderer ); renderer->concatTransform( transform ); light->render( renderer ); } renderer->illuminate( lightHandle, true ); return true; }
void Render::outputLights( const ScenePlug *scene, const IECore::CompoundObject *globals, IECore::Renderer *renderer ) const { const CompoundData *forwardDeclarations = globals->member<CompoundData>( "gaffer:forwardDeclarations" ); if( !forwardDeclarations ) { return; } CompoundDataMap::const_iterator it, eIt; for( it = forwardDeclarations->readable().begin(), eIt = forwardDeclarations->readable().end(); it != eIt; it++ ) { const CompoundData *declaration = runTimeCast<const CompoundData>( it->second.get() ); if( !declaration ) { continue; } const IECore::TypeId type = (IECore::TypeId)declaration->member<IntData>( "type", true )->readable(); if( type != IECore::LightTypeId ) { continue; } ScenePlug::ScenePath path; ScenePlug::stringToPath( it->first.string(), path ); IECore::ConstLightPtr constLight = runTimeCast<const IECore::Light>( scene->object( path ) ); if( !constLight ) { continue; } ConstCompoundObjectPtr attributes = scene->fullAttributes( path ); const BoolData *visibilityData = attributes->member<BoolData>( "gaffer:visibility" ); if( visibilityData && !visibilityData->readable() ) { continue; } M44f transform = scene->fullTransform( path ); LightPtr light = constLight->copy(); light->setHandle( it->first.string() ); { AttributeBlock attributeBlock( renderer ); renderer->setAttribute( "name", new StringData( it->first ) ); CompoundObject::ObjectMap::const_iterator aIt, aeIt; for( aIt = attributes->members().begin(), aeIt = attributes->members().end(); aIt != aeIt; aIt++ ) { if( const Data *attribute = runTimeCast<const Data>( aIt->second.get() ) ) { renderer->setAttribute( aIt->first.string(), attribute ); } } renderer->concatTransform( transform ); light->render( renderer ); } renderer->illuminate( light->getHandle(), true ); } }