diff options
Diffstat (limited to 'Assets/Scripts/Unit/LensEffect/LensEffect_Dash.cs')
-rw-r--r-- | Assets/Scripts/Unit/LensEffect/LensEffect_Dash.cs | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/Assets/Scripts/Unit/LensEffect/LensEffect_Dash.cs b/Assets/Scripts/Unit/LensEffect/LensEffect_Dash.cs new file mode 100644 index 00000000..9111bd68 --- /dev/null +++ b/Assets/Scripts/Unit/LensEffect/LensEffect_Dash.cs @@ -0,0 +1,89 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; + +public class LensEffect_Dash : LensEffectBase +{ + public override ERenderingEvent renderingEvents => ERenderingEvent.AfterForwardOpaque; + + Color rimColor; + int tempID; + float lifeTime; + UnitSnapshot snapshot; + + public LensEffect_Dash(Color color, float lifeTime) : base() + { + rimColor = color; + tempID = Shader.PropertyToID("_BlurRim_RT0"); + this.lifeTime = lifeTime; + } + + public override void AfterForwardOpaque(EStage stage, CommandBuffer cb) + { + if (stage == EStage.Before) + { + Before(cb); + } + else if (stage == EStage.Iterate) + { + Iterate(cb); + } + else if (stage == EStage.After) + { + After(cb); + } + else if (stage == EStage.Finished) + { + } + } + + void Before(CommandBuffer cb) + { + cb.GetTemporaryRT(tempID, -1, -1, 24, FilterMode.Bilinear); + cb.SetRenderTarget(tempID); + cb.ClearRenderTarget(true, true, new Color(0, 0, 0, 0)); + } + + void Iterate(CommandBuffer cb) + { + Matrix4x4 obj2Wod = Matrix4x4.identity; + int subMeshCount = 0; + if (curBodypartRenderer.renderer is SkinnedMeshRenderer) + { + SkinnedMeshRenderer smr = curBodypartRenderer.renderer as SkinnedMeshRenderer; + Vector3 pos = smr.rootBone.transform.position; + Quaternion rot = smr.rootBone.transform.rotation; + obj2Wod = MatrixUtility.RotateAndTranslate(pos, rot); + obj2Wod = Matrix4x4.Translate(new Vector3(1, 0, 0)) * obj2Wod; + subMeshCount = smr.sharedMesh.subMeshCount; + } + else if (curBodypartRenderer.renderer is MeshRenderer) + { + obj2Wod = curBodypartRenderer.renderer.transform.localToWorldMatrix; + obj2Wod = Matrix4x4.Translate(new Vector3(1, 0, 0)) * obj2Wod; + subMeshCount = curBodypartRenderer.renderer.GetComponent<MeshFilter>().sharedMesh.subMeshCount; + } + + for (int i = 0; i < subMeshCount; ++i) + { + MaterialEntry mat = ClaimMaterial(StaticDefine.shaders[EShader.SolidColor].name); + mat.material.SetColor("_Color", rimColor); + mat.material.SetMatrix("_ObjectToWorld", obj2Wod); + mat.material.SetTexture("_MainTex", curBodypartRenderer.renderer.sharedMaterial.GetTexture("_MainTex")); + cb.DrawRenderer(curBodypartRenderer.renderer, mat.material, i); + } + } + + void After(CommandBuffer cb) + { + MaterialEntry blur = ClaimMaterial(StaticDefine.shaders[EShader.Blur].name); + + Vector4 tileOffset = RenderingUtility.GetTillingOffset(MainCamera.Instance.camera, owner.center, owner.unitDetail.snapshotBound); + blur.material.SetVector("_TileOffset", tileOffset); + + cb.Blit(tempID, BuiltinRenderTextureType.CameraTarget, blur.material); + cb.ReleaseTemporaryRT(tempID); + } + +}
\ No newline at end of file |