Skip to content

Instantly share code, notes, and snippets.

@nezix
Last active March 27, 2020 16:37
Show Gist options
  • Save nezix/f1573e421dbd223485004c9a00a6ebae to your computer and use it in GitHub Desktop.
Save nezix/f1573e421dbd223485004c9a00a6ebae to your computer and use it in GitHub Desktop.

Visualize normals of large meshes in Unity editor

Activates when you select an object with a MeshFilter in the Editor.

- Use

Add this script to a GameObject with a MeshFilter.

- How

It creates a mesh with a Line MeshTopology to render a large amount of lines.

- Why

Using gizmos for large meshes does not really work => slow / freezes Unity Editor

- What does it do

image text image text image text

using UnityEngine;
[RequireComponent(typeof(MeshFilter))]
public class NormalsVisualizer : MonoBehaviour {
private Mesh mesh;
private string curName = "";
private Mesh debugMesh;
private GameObject curGo;
void Start() {
curGo = new GameObject("DebugNormals");
curGo.transform.SetParent(transform);
MeshRenderer mr = curGo.AddComponent<MeshRenderer>();
mr.material = new Material(Shader.Find("Legacy Shaders/Particles/Alpha Blended"));
debugMesh = new Mesh();
debugMesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
curGo.AddComponent<MeshFilter>().sharedMesh = debugMesh;
MeshFilter mf = gameObject.GetComponent<MeshFilter>();
if (mf != null) {
mesh = mf.sharedMesh;
createNormalLines(mesh);
}
}
void createNormalLines(Mesh m) {
Vector3[] normals = m.normals;
Vector3[] verts = m.vertices;
int N = m.vertexCount;
Vector3[] newVerts = new Vector3[N * 2];
int[] newTris = new int[N * 2];
for (int i = 0; i < m.vertexCount; i++) {
newVerts[i * 2] = transform.TransformPoint(verts[i]);
newVerts[i * 2 + 1] = transform.TransformPoint(verts[i]) + transform.TransformVector(normals[i]);
newTris[i * 2] = i * 2;
newTris[i * 2 + 1] = i * 2 + 1;
}
debugMesh.SetVertices(newVerts);
debugMesh.SetIndices(newTris, MeshTopology.Lines, 0);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment