// Magica Cloth 2.
// Copyright (c) 2025 MagicaSoft.
// https://magicasoft.jp
using System.Collections.Generic;
using UnityEngine;
namespace MagicaCloth2
{
[System.Serializable]
public class CullingSettings : IDataValidate
{
///
/// Camera culling mode.
/// カメラカリングモード
///
public enum CameraCullingMode
{
///
/// No culling.
/// カリングは行わない
///
Off = 0,
///
/// Simulation resets when hidden from camera.
/// カメラから非表示になるとシミュレーションはリセットされる
///
Reset = 10,
///
/// Simulation pauses when hidden from camera.
/// カメラから非表示になるとシミュレーションは一時停止する
///
Keep = 20,
///
/// Automatically set from linked animator.
/// 連動アニメーターから自動設定する
/// - Animator.CullingMode.AlwaysAnimate -> Off
/// - Animator.CullingMode.CullUpdateTransforms -> Reset
/// - Animator.CullingMode.CullCompletely -> Keep
///
AnimatorLinkage = 30,
}
///
/// Camera culling method.
/// カリング方式
///
public enum CameraCullingMethod
{
///
/// Work with an animator.
/// アニメーターと連動する
///
AutomaticRenderer = 0,
///
/// Determine from user-specified renderer.
/// ユーザー指定のレンダラーから判定する
///
ManualRenderer = 10,
}
///
/// Camera culling mode.
/// カメラカリングモード
/// [OK] Runtime changes.
/// [NG] Export/Import with Presets
///
public CameraCullingMode cameraCullingMode = CameraCullingMode.AnimatorLinkage;
///
/// Camera culling judgment method.
/// カメラカリング判定方式
/// [OK] Runtime changes.
/// [NG] Export/Import with Presets
///
public CameraCullingMethod cameraCullingMethod = CameraCullingMethod.AutomaticRenderer;
///
/// User-specified camera culling judgment renderer.
/// ユーザー指定のカメラカリング判定用レンダラー
/// [OK] Runtime changes.
/// [NG] Export/Import with Presets
///
public List cameraCullingRenderers = new List();
///
/// 距離カリングの状態と距離
/// Distance Culling State and Distance.
/// [OK] Runtime changes.
/// [NG] Export/Import with Presets
///
public CheckSliderSerializeData distanceCullingLength;
///
/// 距離カリングのフェード割合(0.0 ~ 1.0)
/// Distance culling fade rate (0.0 to 1.0).
/// [OK] Runtime changes.
/// [NG] Export/Import with Presets
///
[Range(0.0f, 1.0f)]
public float distanceCullingFadeRatio;
///
/// 距離カリングの測定対象(None=メインカメラ)
/// Distance culling measurement target (None = main camera).
/// [OK] Runtime changes.
/// [NG] Export/Import with Presets
///
public GameObject distanceCullingReferenceObject;
//=========================================================================================
public struct CullingParams
{
public bool useDistanceCulling;
public float distanceCullingLength;
public float distanceCullingFadeRatio;
public void Convert(CullingSettings cullingSettings)
{
useDistanceCulling = cullingSettings.distanceCullingLength.use;
distanceCullingLength = cullingSettings.distanceCullingLength.value;
distanceCullingFadeRatio = cullingSettings.distanceCullingFadeRatio;
}
}
//=========================================================================================
public CullingSettings()
{
distanceCullingLength = new CheckSliderSerializeData(false, 30.0f);
distanceCullingFadeRatio = 0.2f;
}
public void DataValidate()
{
distanceCullingLength.DataValidate(0.0f, Define.System.DistanceCullingMaxLength);
distanceCullingFadeRatio = Mathf.Clamp01(distanceCullingFadeRatio);
}
public CullingSettings Clone()
{
return new CullingSettings()
{
cameraCullingMode = cameraCullingMode,
cameraCullingMethod = cameraCullingMethod,
cameraCullingRenderers = new List(cameraCullingRenderers),
distanceCullingLength = distanceCullingLength.Clone(),
distanceCullingFadeRatio = distanceCullingFadeRatio,
distanceCullingReferenceObject = distanceCullingReferenceObject,
};
}
///
/// エディタメッシュの更新を判定するためのハッシュコード
/// (このハッシュは実行時には利用されない編集用のもの)
///
///
public override int GetHashCode() => 0;
}
}