5 using System.Collections.Generic;
11 [UseWith(typeof(LineBase))]
14 readonly
string InvisibleShaderName =
"MixedRealityToolkit/InvisibleShader";
16 [Header(
"Instanced Mesh Settings")]
22 public string ColorProp =
"_Color";
25 private MaterialPropertyBlock linePropertyBlock;
27 private Matrix4x4[] meshTransforms;
28 private Vector4[] colorValues;
29 private bool executeCommandBuffer =
false;
30 private Dictionary<Camera, CommandBuffer> cameras =
new Dictionary<Camera, CommandBuffer>();
32 private MeshRenderer onWillRenderHelper;
33 private Mesh onWillRenderMesh;
34 private Material onWillRenderMat;
35 private Vector3[] meshVertices =
new Vector3[3];
39 if (LineMaterial == null)
41 Debug.LogError(
"Line material cannot be null.");
46 if (linePropertyBlock == null)
48 LineMaterial.enableInstancing =
true;
49 linePropertyBlock =
new MaterialPropertyBlock();
50 colorID = Shader.PropertyToID(ColorProp);
53 if (onWillRenderHelper == null)
58 onWillRenderHelper = gameObject.AddComponent<MeshRenderer>();
59 onWillRenderHelper.receiveShadows =
false;
60 onWillRenderHelper.shadowCastingMode = ShadowCastingMode.Off;
61 onWillRenderHelper.lightProbeUsage = LightProbeUsage.Off;
62 onWillRenderHelper.motionVectorGenerationMode = MotionVectorGenerationMode.ForceNoMotion;
64 onWillRenderMesh =
new Mesh();
65 onWillRenderMesh.vertices = meshVertices;
66 onWillRenderMesh.triangles =
new int[] { 0, 1, 2 };
68 MeshFilter helperMeshFilter = gameObject.AddComponent<MeshFilter>();
69 helperMeshFilter.sharedMesh = onWillRenderMesh;
72 onWillRenderMat =
new Material(Shader.Find(InvisibleShaderName));
73 onWillRenderHelper.sharedMaterial = onWillRenderMat;
79 executeCommandBuffer =
false;
83 if (meshTransforms == null || meshTransforms.Length != NumLineSteps)
85 meshTransforms =
new Matrix4x4[NumLineSteps];
88 if (colorValues == null || colorValues.Length != NumLineSteps)
90 colorValues =
new Vector4[NumLineSteps];
91 linePropertyBlock.Clear();
94 for (
int i = 0; i < NumLineSteps; i++)
96 float normalizedDistance = (1f / (NumLineSteps - 1)) * i;
97 colorValues[i] = GetColor(normalizedDistance);
98 meshTransforms[i] = Matrix4x4.TRS(Source.GetPoint(normalizedDistance), Source.GetRotation(normalizedDistance), Vector3.one * GetWidth(normalizedDistance));
101 linePropertyBlock.SetVectorArray(colorID, colorValues);
103 executeCommandBuffer =
true;
107 private void OnDisable()
109 foreach (KeyValuePair<Camera, CommandBuffer> cam
in cameras)
113 cam.Key.RemoveCommandBuffer(CameraEvent.AfterForwardOpaque, cam.Value);
119 private void OnWillRenderObject()
121 Camera cam = Camera.current;
122 CommandBuffer buffer = null;
123 if (!cameras.TryGetValue(cam, out buffer))
125 buffer =
new CommandBuffer();
126 buffer.name =
"Line Mesh Renderer " + cam.name;
127 cam.AddCommandBuffer(CameraEvent.AfterForwardOpaque, buffer);
128 cameras.Add(cam, buffer);
132 if (executeCommandBuffer)
134 buffer.DrawMeshInstanced(LineMesh, 0, LineMaterial, 0, meshTransforms, meshTransforms.Length, linePropertyBlock);
138 private void LateUpdate()
141 meshVertices[0] = transform.InverseTransformPoint(Source.GetPoint(0.0f));
142 meshVertices[1] = transform.InverseTransformPoint(Source.GetPoint(0.5f));
143 meshVertices[2] = transform.InverseTransformPoint(Source.GetPoint(1.0f));
144 onWillRenderMesh.vertices = meshVertices;
145 onWillRenderMesh.RecalculateBounds();
150 public class CustomEditor : MRTKEditor { }