//=============================================================================
// TWIndoorLightingVolume
//=============================================================================
// Volume to section off indoor areas. All objects placed within this volume
// will use the indoor lighting channel, unless this functionality is overridden.
// Typical cases when this will be overridden is when you want an object to use
// both indoor or outdoor lighting channels.
//=============================================================================
// Killing Floor 2
// Copyright (C) 2015 Tripwire Interactive LLC
//  - Sakib Saikia 2/7/2013
//=============================================================================

class TWIndoorLightingVolume extends Volume
	native(TW)
	placeable;

var const LightingChannelContainer	IndoorLightingChannel;
var const LightingChannelContainer	OutdoorLightingChannel;

cpptext
{
	// Called during lighting build phase. Tag all actors within this volume
	// to use the indoor lighting channel. The only exception is when the lighting
	// channels are overridden manually
	virtual void Build_TagLightingChannels();
}

simulated event Touch(Actor Other, PrimitiveComponent OtherComp, vector HitLocation, vector HitNormal)
{
	local Pawn P;

	Super.Touch(Other,OtherComp,HitLocation,HitNormal);

    // Note: We're using Pawn instead of KFPawn because TWIndoorLightingVolume is part of
    // the engine package. Hence, we cannot access KFPawn. It needs to be part of engine
    // because it is required to tag primitives at light build time.
	P = Pawn(Other);
	if( P != none )
	{
	    P.LightingVolumeEnterCount++;
		P.SetMeshLightingChannels(IndoorLightingChannel);
	}
}

simulated event UnTouch(Actor Other)
{
	local Pawn P;

	Super.UnTouch(Other);

    // Note: We're using Pawn instead of KFPawn because TWIndoorLightingVolume is part of
    // the engine package. Hence, we cannot access KFPawn. It needs to be part of engine
    // because it is required to tag primitives at light build time.
	P = Pawn(Other);
	if( P != none )
	{
	   	if ( P.LightingVolumeEnterCount > 0 )
		{
			P.LightingVolumeEnterCount--;
		}

        // Because the sequence of touch and untouch events are not reliable, keep
        // a counter to track whether the pawn is actually outside of the volume or not,
        // and switch channels only when it is not inside ANY indoor lighting volume
        if( P.LightingVolumeEnterCount == 0 )
        {
		    P.SetMeshLightingChannels(OutdoorLightingChannel);
		}
	}
}

defaultproperties
{
	// Collide with pawns only
	bPawnsOnly=true

	// Lighting channel presets
	IndoorLightingChannel=(Indoor=TRUE,Outdoor=FALSE,bInitialized=TRUE)
	OutdoorLightingChannel=(Indoor=FALSE,Outdoor=TRUE,bInitialized=TRUE)
}