Files
Fishing2/Packages/com.jbooth.microsplat.decal/Scripts/MicroSplatDecalReceiver_Dynamic.cs
2025-06-04 09:09:39 +08:00

122 lines
3.7 KiB
C#

//////////////////////////////////////////////////////
// MicroSplat
// Copyright (c) Jason Booth
//////////////////////////////////////////////////////
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace JBooth.MicroSplat
{
public partial class MicroSplatDecalReceiver : MonoBehaviour
{
[HideInInspector]
public List<MicroSplatDecal> dynamicDecals = null;
[HideInInspector]
public Texture2D dynamicCacheData;
[HideInInspector]
public Texture2D dynamicCullData;
int maxDynamicDecals = 0;
public int dynamicCount { get { return dynamicDecals == null ? 0 : dynamicDecals.Count; } }
void ClearDynamicCacheData()
{
if (staticCacheData != null)
{
DestroyImmediate(dynamicCacheData);
}
if (dynamicCullData != null)
{
DestroyImmediate(dynamicCullData);
}
dynamicCacheData = new Texture2D(maxDynamicDecals, 8, TextureFormat.RGBAFloat, false, true);
dynamicCacheData.Apply(false, false);
dynamicCullData = new Texture2D(maxDynamicDecals, 1, TextureFormat.RGBAFloat, false, true);
dynamicCullData.Apply(false, false);
dynamicCacheData.hideFlags = HideFlags.HideAndDontSave;
dynamicCullData.hideFlags = HideFlags.HideAndDontSave;
}
private void InitDynamic()
{
maxDynamicDecals = 8;
if (msObj.keywordSO.IsKeywordEnabled("_DECAL_MAX0"))
{
maxDynamicDecals = 1;
}
if (msObj.keywordSO.IsKeywordEnabled("_DECAL_MAX16"))
{
maxDynamicDecals = 16;
}
else if (msObj.keywordSO.IsKeywordEnabled("_DECAL_MAX32"))
{
maxDynamicDecals = 32;
}
else if (msObj.keywordSO.IsKeywordEnabled("_DECAL_MAX64"))
{
maxDynamicDecals = 64;
}
else if (msObj.keywordSO.IsKeywordEnabled("_DECAL_MAX128"))
{
maxDynamicDecals = 128;
}
else if (msObj.keywordSO.IsKeywordEnabled("_DECAL_MAX256"))
{
maxDynamicDecals = 256;
}
dynamicDecals = new List<MicroSplatDecal>(maxDynamicDecals);
ClearDynamicCacheData();
}
void RegisterDynamicDecal(MicroSplatDecal d)
{
bool contains = staticDecals.Contains(d);
if (!contains)
{
dynamicDecals.Add(d);
if (dynamicDecals.Count > 1 && d.sortOrder != dynamicDecals[dynamicDecals.Count - 2].sortOrder)
{
dynamicDecals.Sort((x, y) => x.sortOrder.CompareTo(y.sortOrder));
}
}
}
void UpdateDynamicPropertyBlocks()
{
int count = dynamicDecals.Count;
if (count > maxDynamicDecals)
count = maxDynamicDecals;
for (int i = 0; i < count; ++i)
{
Vector3 scale = dynamicDecals[i].transform.lossyScale - Vector3.zero;
float cullDist = scale.sqrMagnitude * 0.5f;
Vector3 pos = dynamicDecals[i].transform.position;
dynamicCullData.SetPixel(i, 0, new Color(pos.x, pos.y, pos.z, cullDist));
SetData(dynamicDecals[i], i, dynamicCacheData);
}
dynamicCacheData.Apply(false, false);
dynamicCullData.Apply(false, false);
decalBlock.SetInt("_MSDecalCount", count);
decalBlock.SetTexture("_DecalCullData", dynamicCullData);
decalBlock.SetTexture("_DecalDynamicData", dynamicCacheData);
}
void UnregisterDynamicDecal(MicroSplatDecal d)
{
if (dynamicDecals != null && dynamicDecals.Contains(d))
{
dynamicDecals.Remove(d);
}
}
}
}