Files
falling_rooms/Assets/CapturePanorama/Scripts/ImageEffectCopyCamera.cs
2025-07-09 11:02:37 +02:00

84 lines
3.0 KiB
C#

// This is free and unencumbered software released into the public domain.
// For more information, please refer to <http://unlicense.org/>
using System;
using System.Collections.Generic;
using System.Reflection;
using UnityEngine;
namespace CapturePanorama.Internals
{
class ImageEffectCopyCamera : MonoBehaviour
{
public struct InstanceMethodPair {
public object Instance;
public MethodInfo Method;
}
public List<InstanceMethodPair> onRenderImageMethods = new List<InstanceMethodPair>();
public static List<InstanceMethodPair> GenerateMethodList(Camera camToCopy)
{
var result = new List<InstanceMethodPair>();
foreach (var script in camToCopy.gameObject.GetComponents<MonoBehaviour>())
{
if (script.enabled)
{
Type scriptType = script.GetType();
MethodInfo m = scriptType.GetMethod("OnRenderImage",
BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null,
new Type[] { typeof(RenderTexture), typeof(RenderTexture) }, null);
if (m != null)
{
InstanceMethodPair pair = new InstanceMethodPair();
pair.Instance = script;
pair.Method = m;
result.Add(pair);
}
}
}
return result;
}
RenderTexture[] temp = new RenderTexture[] { null, null };
void OnDestroy()
{
for (int i = 0; i < temp.Length; i++)
{
if (temp[i] != null)
Destroy(temp[i]);
temp[i] = null;
}
}
void OnRenderImage(RenderTexture src, RenderTexture dest)
{
int desiredDepth = Math.Max(src.depth, dest.depth);
for (int i = 0; i < temp.Length; i++)
{
if (onRenderImageMethods.Count > i + 1)
{
if (temp[i] != null &&
(temp[i].width != dest.width || temp[i].height != dest.height || temp[i].depth != desiredDepth || temp[i].format != dest.format))
{
Destroy(temp[i]);
temp[i] = null;
}
if (temp[i] == null)
temp[i] = new RenderTexture(dest.width, dest.height, desiredDepth, dest.format);
}
}
var sequence = new List<RenderTexture>();
sequence.Add(src);
for (int i = 0; i < onRenderImageMethods.Count - 1; i++)
sequence.Add(i % 2 == 0 ? temp[0] : temp[1]);
sequence.Add(dest);
for (int i = 0; i < onRenderImageMethods.Count; i++)
onRenderImageMethods[i].Method.Invoke(onRenderImageMethods[i].Instance, new object[] { sequence[i], sequence[i + 1] });
}
}
}