16 private Renderer[] renderers = null;
18 private int clipPlaneID;
19 private Material[] materials;
20 private MaterialPropertyBlock materialPropertyBlock;
22 private void OnEnable()
25 UpdatePlanePosition();
26 ToggleClippingPlane(
true);
29 private void OnDisable()
31 UpdatePlanePosition();
32 ToggleClippingPlane(
false);
38 if (Application.isPlaying)
44 UpdatePlanePosition();
48 private void LateUpdate()
50 UpdatePlanePosition();
53 private void OnDrawGizmosSelected()
60 Gizmos.matrix = transform.localToWorldMatrix;
61 Gizmos.DrawLine(Vector3.zero, Vector3.up * 0.5f);
62 Gizmos.DrawWireCube(Vector3.zero,
new Vector3(1.0f, 0.0f, 1.0f));
65 private void OnDestroy()
67 if (materials != null)
69 foreach (Material material
in materials)
71 if (Application.isPlaying)
81 private void Initialize()
83 clipPlaneID = Shader.PropertyToID(
"_ClipPlane");
85 materials =
new Material[renderers.Length];
87 for (
int i = 0; i < renderers.Length; ++i)
89 if (Application.isPlaying)
91 materials[i] = renderers[i].material;
95 materials[i] = renderers[i].sharedMaterial;
99 materialPropertyBlock =
new MaterialPropertyBlock();
102 private void UpdatePlanePosition()
104 if (renderers == null)
109 Vector3 up = transform.up;
110 Vector4 plane =
new Vector4(up.x, up.y, up.z, Vector3.Dot(up, transform.position));
112 foreach (Renderer renderer
in renderers)
114 if (renderer == null)
119 renderer.GetPropertyBlock(materialPropertyBlock);
120 materialPropertyBlock.SetVector(clipPlaneID, plane);
121 renderer.SetPropertyBlock(materialPropertyBlock);
125 private void ToggleClippingPlane(
bool isClippingPlaneOn)
127 if (materials == null)
132 foreach (Material material
in materials)
134 if (material == null)
139 const string clippingPlaneKeyword =
"_CLIPPING_PLANE";
141 if (isClippingPlaneOn)
143 if (!material.IsKeywordEnabled(clippingPlaneKeyword))
145 material.EnableKeyword(clippingPlaneKeyword);
150 if (material.IsKeywordEnabled(clippingPlaneKeyword))
152 material.DisableKeyword(clippingPlaneKeyword);