summaryrefslogtreecommitdiff
path: root/Assets/Scripts/Unit/LensEffect
diff options
context:
space:
mode:
Diffstat (limited to 'Assets/Scripts/Unit/LensEffect')
-rw-r--r--Assets/Scripts/Unit/LensEffect/LensEffectBase.cs101
-rw-r--r--Assets/Scripts/Unit/LensEffect/LensEffectBase.cs.meta (renamed from Assets/Scripts/Unit/LensEffect/LensEffects.cs.meta)2
-rw-r--r--Assets/Scripts/Unit/LensEffect/LensEffect_Glitch.cs18
-rw-r--r--Assets/Scripts/Unit/LensEffect/LensEffect_Glitch.cs.meta11
-rw-r--r--Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs64
-rw-r--r--Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs.meta11
-rw-r--r--Assets/Scripts/Unit/LensEffect/LensEffects.cs166
7 files changed, 206 insertions, 167 deletions
diff --git a/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs b/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs
new file mode 100644
index 00000000..08e20217
--- /dev/null
+++ b/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs
@@ -0,0 +1,101 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.Rendering;
+
+public class MaterialEntry
+{
+ public string shader;
+ public Material material;
+}
+
+public abstract class LensEffectBase : MonoBehaviour
+{
+ public enum EStage
+ {
+ Before ,
+ Iterate ,
+ After ,
+ Finished ,
+ }
+
+ public abstract ERenderingEvent renderingEvents { get; }
+
+ protected static Dictionary<string/*shaderName*/, List<MaterialEntry>> m_MaterailPool = new Dictionary<string, List<MaterialEntry>>();
+
+ private List<MaterialEntry> m_InUseMaterials = new List<MaterialEntry>();
+
+ private static MaterialEntry _ClaimMaterial(string shader)
+ {
+ List<MaterialEntry> mats;
+ if (m_MaterailPool.TryGetValue(shader, out mats) && mats.Count > 0)
+ {
+ MaterialEntry me = mats[mats.Count - 1];
+ mats.RemoveAt(mats.Count - 1);
+ return me;
+ }
+ Material mat = new Material(Shader.Find(shader));
+ MaterialEntry entry = new MaterialEntry();
+ entry.material = mat;
+ entry.shader = shader;
+ return entry;
+ }
+
+ private static void _ReleaseMaterial(MaterialEntry entry)
+ {
+ List<MaterialEntry> mats;
+ if (!m_MaterailPool.TryGetValue(entry.shader, out mats))
+ {
+ mats = new List<MaterialEntry>();
+ m_MaterailPool.Add(entry.shader, mats);
+ }
+ mats.Add(entry);
+ }
+
+ protected MaterialEntry ClaimMaterial(string shader)
+ {
+ MaterialEntry entry = _ClaimMaterial(shader);
+ m_InUseMaterials.Add(entry);
+ return entry;
+ }
+
+ protected void ReleaseMaterial(MaterialEntry entry)
+ {
+ m_InUseMaterials.Remove(entry);
+ _ReleaseMaterial(entry);
+ }
+
+ protected void ReleaseAllInUsedMaterials()
+ {
+ for(int i = 0; i < m_InUseMaterials.Count; ++i)
+ {
+ _ReleaseMaterial(m_InUseMaterials[i]);
+ }
+ m_InUseMaterials.Clear();
+ }
+
+ public virtual void BeforeDepthTexture(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+ public virtual void AfterDepthTexture(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+
+ public virtual void BeforeDepthNormalsTexture(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+ public virtual void AfterDepthNormalsTexture(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+
+ public virtual void BeforeForwardOpaque(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+ public virtual void AfterForwardOpaque(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+
+ public virtual void BeforeImageEffectsOpaque(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+ public virtual void AfterImageEffectsOpaque(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+
+ public virtual void BeforeSkybox(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+ public virtual void AfterSkybox(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+
+ public virtual void BeforeForwardAlpha(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+ public virtual void AfterForwardAlpha(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+
+ public virtual void BeforeImageEffects(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+ public virtual void AfterImageEffects(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+
+ public virtual void BeforeEverything(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+ public virtual void AfterEverything(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null) { }
+
+} \ No newline at end of file
diff --git a/Assets/Scripts/Unit/LensEffect/LensEffects.cs.meta b/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs.meta
index ec32bb75..d0d0d81b 100644
--- a/Assets/Scripts/Unit/LensEffect/LensEffects.cs.meta
+++ b/Assets/Scripts/Unit/LensEffect/LensEffectBase.cs.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
-guid: c5acf04ae1e72ed42a1d20ee038ac73e
+guid: 548560041d20266478078df50edab4e9
MonoImporter:
externalObjects: {}
serializedVersion: 2
diff --git a/Assets/Scripts/Unit/LensEffect/LensEffect_Glitch.cs b/Assets/Scripts/Unit/LensEffect/LensEffect_Glitch.cs
new file mode 100644
index 00000000..00763a37
--- /dev/null
+++ b/Assets/Scripts/Unit/LensEffect/LensEffect_Glitch.cs
@@ -0,0 +1,18 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+
+public class LensEffect_Glitch : MonoBehaviour
+{
+ // Start is called before the first frame update
+ void Start()
+ {
+
+ }
+
+ // Update is called once per frame
+ void Update()
+ {
+
+ }
+}
diff --git a/Assets/Scripts/Unit/LensEffect/LensEffect_Glitch.cs.meta b/Assets/Scripts/Unit/LensEffect/LensEffect_Glitch.cs.meta
new file mode 100644
index 00000000..88e5b0de
--- /dev/null
+++ b/Assets/Scripts/Unit/LensEffect/LensEffect_Glitch.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 48bd0d7bffad03a44a281ccb6f21f188
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs b/Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs
new file mode 100644
index 00000000..9ec7d056
--- /dev/null
+++ b/Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs
@@ -0,0 +1,64 @@
+using System.Collections;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.Rendering;
+
+public class LensEffect_MotionBlur : LensEffectBase
+{
+ int tempID;
+
+ public LensEffect_MotionBlur()
+ {
+ }
+
+ public override ERenderingEvent renderingEvents => ERenderingEvent.AfterImageEffectsOpaque;
+
+ public override void AfterImageEffectsOpaque(EStage stage, CommandBuffer cb, BodyPartRenderer renderer = null)
+ {
+ if(stage == EStage.Before)
+ {
+ tempID = Shader.PropertyToID("_Temp1");
+
+ cb.GetTemporaryRT(tempID, -1, -1, 24, FilterMode.Bilinear);
+ cb.SetRenderTarget(tempID);
+ cb.ClearRenderTarget(true, true, new Color(0, 0, 0, 0));
+ }
+ else if(stage == EStage.Iterate)
+ {
+ Matrix4x4 obj2Wod = Matrix4x4.identity;
+ int subMeshCount = 0;
+ if (renderer.renderer is SkinnedMeshRenderer)
+ {
+ SkinnedMeshRenderer smr = renderer.renderer as SkinnedMeshRenderer;
+ Vector3 pos = smr.rootBone.transform.position;
+ Quaternion rot = smr.rootBone.transform.rotation;
+ obj2Wod = MatrixUtility.RotateAndTranslate(pos, rot);
+ subMeshCount = smr.sharedMesh.subMeshCount;
+ }
+ else if (renderer.renderer is MeshRenderer)
+ {
+ obj2Wod = renderer.renderer.transform.localToWorldMatrix;
+ subMeshCount = renderer.renderer.GetComponent<MeshFilter>().sharedMesh.subMeshCount;
+ }
+
+ for (int i = 0; i < subMeshCount; ++i)
+ {
+ MaterialEntry mat = ClaimMaterial(StaticDefine.shaders[EShader.SolidColor].name);
+ mat.material.SetColor("_Color", Color.red);
+ mat.material.SetMatrix("_ObjectToWorld", obj2Wod);
+
+ cb.DrawRenderer(renderer.renderer, mat.material, i);
+ }
+ }
+ else if(stage == EStage.After)
+ {
+ MaterialEntry blur = ClaimMaterial(StaticDefine.shaders[EShader.Blur].name);
+ cb.Blit(tempID, BuiltinRenderTextureType.CameraTarget, blur.material);
+ }
+ else if(stage == EStage.Finished)
+ {
+ ReleaseAllInUsedMaterials();
+ }
+ }
+
+} \ No newline at end of file
diff --git a/Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs.meta b/Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs.meta
new file mode 100644
index 00000000..364e3d30
--- /dev/null
+++ b/Assets/Scripts/Unit/LensEffect/LensEffect_MotionBlur.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 499c4e25bc0f4d641b99f688e91c495f
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/Scripts/Unit/LensEffect/LensEffects.cs b/Assets/Scripts/Unit/LensEffect/LensEffects.cs
deleted file mode 100644
index 4083eb88..00000000
--- a/Assets/Scripts/Unit/LensEffect/LensEffects.cs
+++ /dev/null
@@ -1,166 +0,0 @@
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using UnityEngine;
-using UnityEngine.Rendering;
-
-public class MaterialEntry
-{
- public Material material;
- public string shader;
-}
-
-public struct ScaleOffset
-{
- public Vector2 scale;
- public Vector2 offset;
-}
-
-public class LensEffect
-{
- #region callbacks
- public delegate void BeforeIterateHandler(CommandBuffer cb);
- public BeforeIterateHandler beforeIterate;
-
- public delegate void IterationHandler(CommandBuffer cb, BodyPartRenderer renderer);
- public IterationHandler iterate;
-
- public delegate void AfterIterateHandler(CommandBuffer cb);
- public AfterIterateHandler afterIterate;
-
- // 这一帧的这个特效结束
- public delegate void FinishRenderHandler();
- public FinishRenderHandler finishRender;
- #endregion
-
- private static Dictionary<string/*shaderName*/, List<MaterialEntry>> m_MaterailPool;
-
- public static LensEffect Create(Func<LensEffect> create)
- {
- return create();
- }
-
- static LensEffect()
- {
- m_MaterailPool = new Dictionary<string, List<MaterialEntry>>();
- }
-
- static MaterialEntry ClaimMaterial(string shader)
- {
- List<MaterialEntry> mats;
- if (m_MaterailPool.TryGetValue(shader, out mats) && mats.Count > 0)
- {
- MaterialEntry me = mats[mats.Count - 1];
- mats.RemoveAt(mats.Count - 1);
- return me;
- }
- Material mat = new Material(Shader.Find(shader));
- MaterialEntry entry = new MaterialEntry();
- entry.material = mat;
- entry.shader = shader;
- return entry;
- }
-
- static void ReleaseMaterial(MaterialEntry entry)
- {
- List<MaterialEntry> mats;
- if (!m_MaterailPool.TryGetValue(entry.shader, out mats))
- {
- mats = new List<MaterialEntry>();
- m_MaterailPool.Add(entry.shader, mats);
- }
- mats.Add(entry);
- }
-
- #region LensEffects
-
- public static LensEffect MotionBlur()
- {
- LensEffect eff = LensEffect.Create(() =>
- {
- LensEffect e = new LensEffect();
-
- List<MaterialEntry> materials = ListPool<MaterialEntry>.Get();
- int tempID = Shader.PropertyToID("_Temp1");
-
- ScaleOffset scaleOffset = new ScaleOffset();
-
- e.beforeIterate = (CommandBuffer cb) =>
- {
- cb.GetTemporaryRT(tempID, -1, -1, 24, FilterMode.Bilinear);
- cb.SetRenderTarget(tempID);
- cb.ClearRenderTarget(true, true, new Color(0, 0, 0, 0));
- };
- e.iterate = (CommandBuffer cb, BodyPartRenderer renderer) =>
- {
- Matrix4x4 obj2Wod = Matrix4x4.identity;
- int subMeshCount = 0;
- if (renderer.renderer is SkinnedMeshRenderer)
- {
- SkinnedMeshRenderer smr = renderer.renderer as SkinnedMeshRenderer;
- Vector3 pos = smr.rootBone.transform.position;
- Quaternion rot = smr.rootBone.transform.rotation;
- obj2Wod = MatrixUtility.RotateAndTranslate(pos, rot);
- subMeshCount = smr.sharedMesh.subMeshCount;
- }
- else if (renderer.renderer is MeshRenderer)
- {
- obj2Wod = renderer.renderer.transform.localToWorldMatrix;
- subMeshCount = renderer.renderer.GetComponent<MeshFilter>().sharedMesh.subMeshCount;
- }
-
- for (int i = 0; i < subMeshCount; ++i)
- {
- MaterialEntry mat = ClaimMaterial(StaticDefine.shaders[EShader.SolidColor].name);
- materials.Add(mat);
- mat.material.SetColor("_Color", Color.red);
- mat.material.SetMatrix("_ObjectToWorld", obj2Wod);
-
- cb.DrawRenderer(renderer.renderer, mat.material, i);
- }
- };
- e.afterIterate = (CommandBuffer cb) =>
- {
- MaterialEntry blur = ClaimMaterial(StaticDefine.shaders[EShader.Blur].name);
- materials.Add(blur);
-
- cb.Blit(tempID, BuiltinRenderTextureType.CameraTarget, blur.material);
- };
- e.finishRender = () =>
- {
- for (int i = materials.Count - 1; i >= 0; --i)
- {
- MaterialEntry mat = materials[i];
- ReleaseMaterial(mat);
- materials.RemoveAt(i);
- }
- };
- return e;
- });
- return eff;
- }
-
- public static LensEffect Glitch()
- {
-
- return null;
- }
-
- public static LensEffect OutLine()
- {
-
- return null;
- }
-
- public static LensEffect RimLight()
- {
- return null;
- }
-
- public static LensEffect Decals()
- {
- return null;
- }
-
- #endregion
-}