rj-action-library/Runtime/VirtualCameras/PostProcess/PostProcessVolumeEffect.cs

236 lines
5.4 KiB
C#

using Godot;
using System.Collections.Generic;
using System;
using System.Linq;
namespace Rokojori
{
[Tool]
[GlobalClass]
public partial class PostProcessVolumeEffect: Resource
{
public virtual void Apply( WorldEnvironment worldEnvironment )
{
}
public virtual void Lerp( object listOfOwnType, List<PostProcessVolume> volumes )
{
}
public virtual BoxedFloatValue[] GetFloatValues()
{
return [];
}
public virtual void SetFloatValues( BoxedFloatValue[] values )
{
}
public void LerpFloats( IReadOnlyList<PostProcessVolumeEffect> effects, List<PostProcessVolume> volumes)
{
var floatValues = GetFloatValues();
for ( int i = 0; i < floatValues.Length; i++ )
{
if ( floatValues[ i ] == null )
{
var hasEffect = false;
for ( int j = 0; j < effects.Count; j++ )
{
if ( effects[ j ].GetFloatValues() [ i ] != null )
{
hasEffect = true;
j = effects.Count;
}
}
if ( hasEffect )
{
floatValues[ i ] = new FloatValue();
}
else
{
floatValues[ i ] = null;
}
}
if ( floatValues[ i ] == null )
{
continue;
}
floatValues[ i ].SetFloatValue( 0f );
}
var valueWeights = new float[ floatValues.Length ];
var priorities = new int[ floatValues.Length ];
for ( int i = 0; i < floatValues.Length; i++ )
{
valueWeights[ i ] = 0;
priorities[ i ] = -100000;
}
for ( int i = 0; i < effects.Count; i++ )
{
var otherValues = effects[ i ].GetFloatValues();
// this.LogInfo( "effects:", HierarchyName.Of( effects[ i ] ) );
for ( int j = 0; j < floatValues.Length; j++ )
{
if ( floatValues[ j ] == null || otherValues[ j ] == null )
{
continue;
}
if ( volumes[ i ].priority < priorities[ j ] )
{
continue;
}
if ( priorities[ j ] < volumes[ i ].priority )
{
valueWeights[ j ] = 0f;
floatValues[ j ].SetFloatValue( 0f );
}
priorities[ j ] = volumes[ i ].priority;
var value = floatValues[ j ].GetFloatValue();
floatValues[ j ].SetFloatValue( value + otherValues[ j ].GetFloatValue() );
valueWeights[ j ] += volumes[ i ].combinedWeight;
// this.LogInfo( "Lerping", j, otherValues[ j ].value, valueWeights[ j ] );
}
}
for ( int i = 0; i < floatValues.Length; i++)
{
if ( floatValues[ i ] == null )
{
continue;
}
floatValues[ i ].SetFloatValue( floatValues[ i ].GetFloatValue() / valueWeights[ i ] );
}
SetFloatValues( floatValues );
}
public virtual ColorValue[] GetColorValues()
{
return [];
}
public virtual void SetColorValues( ColorValue[] values )
{
}
public void LerpColors( IReadOnlyList<PostProcessVolumeEffect> effects, List<PostProcessVolume> volumes)
{
var colorValues = GetColorValues();
for ( int i = 0; i < colorValues.Length; i++ )
{
if ( colorValues[ i ] == null )
{
var hasEffect = false;
for ( int j = 0; j < effects.Count; j++ )
{
if ( effects[ j ].GetColorValues() [ i ] != null )
{
hasEffect = true;
j = effects.Count;
}
}
if ( hasEffect )
{
colorValues[ i ] = new ColorValue();
}
else
{
colorValues[ i ] = null;
}
}
if ( colorValues[ i ] == null )
{
continue;
}
colorValues[ i ].value = new Color( 0, 0, 0, 0 );
}
var valueWeights = new float[ colorValues.Length ];
var priorities = new int[ colorValues.Length ];
for ( int i = 0; i < colorValues.Length; i++ )
{
valueWeights[ i ] = 0;
priorities[ i ] = -100000;
}
for ( int i = 0; i < effects.Count; i++ )
{
var otherValues = effects[ i ].GetColorValues();
// this.LogInfo( "effects:", HierarchyName.Of( effects[ i ] ) );
for ( int j = 0; j < colorValues.Length; j++ )
{
if ( colorValues[ j ] == null || otherValues[ j ] == null )
{
continue;
}
if ( volumes[ i ].priority < priorities[ j ] )
{
continue;
}
if ( priorities[ j ] < volumes[ i ].priority )
{
valueWeights[ j ] = 0f;
colorValues[ j ].value = new Color( 0, 0, 0, 0 );
}
priorities[ j ] = volumes[ i ].priority;
colorValues[ j ].value += otherValues[ j ].value;
valueWeights[ j ] += volumes[ i ].combinedWeight;
// this.LogInfo( "Lerping", j, otherValues[ j ].value, valueWeights[ j ] );
}
}
for ( int i = 0; i < colorValues.Length; i++)
{
if ( colorValues[ i ] == null )
{
continue;
}
colorValues[ i ].value /= valueWeights[ i ];
}
SetColorValues( colorValues );
}
}
}