ObiBaseFluidRenderer.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. using UnityEngine;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using UnityEngine.Rendering;
  5. namespace Obi
  6. {
  7. [ExecuteInEditMode]
  8. [RequireComponent (typeof(Camera))]
  9. public abstract class ObiBaseFluidRenderer : MonoBehaviour{
  10. public ObiParticleRenderer[] particleRenderers;
  11. public bool autoupdate = true;
  12. protected CommandBuffer renderFluid;
  13. protected Camera currentCam;
  14. void Awake(){
  15. currentCam = GetComponent<Camera>();
  16. }
  17. public void OnEnable()
  18. {
  19. GetComponent<Camera>().forceIntoRenderTexture = true;
  20. DestroyCommandBuffer();
  21. Cleanup();
  22. }
  23. public void OnDisable()
  24. {
  25. DestroyCommandBuffer();
  26. Cleanup();
  27. }
  28. protected Material CreateMaterial (Shader shader)
  29. {
  30. if (!shader || !shader.isSupported)
  31. return null;
  32. Material m = new Material (shader);
  33. m.hideFlags = HideFlags.HideAndDontSave;
  34. return m;
  35. }
  36. protected virtual void Setup(){}
  37. protected virtual void Cleanup(){}
  38. /**
  39. * Re-generates the CommandBuffer used for fluid rendering. Call it whenever a new ParticleRenderer is added, removed or modified.
  40. */
  41. public abstract void UpdateFluidRenderingCommandBuffer();
  42. private void DestroyCommandBuffer(){
  43. if (renderFluid != null){
  44. GetComponent<Camera>().RemoveCommandBuffer (CameraEvent.BeforeImageEffectsOpaque,renderFluid);
  45. renderFluid = null;
  46. }
  47. }
  48. private void OnPreRender(){
  49. bool act = gameObject.activeInHierarchy && enabled;
  50. if (!act || particleRenderers == null || particleRenderers.Length == 0)
  51. {
  52. DestroyCommandBuffer();
  53. Cleanup();
  54. return;
  55. }
  56. Setup();
  57. if (renderFluid == null)
  58. {
  59. renderFluid = new CommandBuffer();
  60. renderFluid.name = "Render fluid";
  61. UpdateFluidRenderingCommandBuffer();
  62. currentCam.AddCommandBuffer (CameraEvent.BeforeImageEffectsOpaque, renderFluid);
  63. }else if (autoupdate){
  64. UpdateFluidRenderingCommandBuffer();
  65. }
  66. }
  67. }
  68. }