using System.Collections.Generic; using UnityEngine; namespace Obi { [AddComponentMenu("Physics/Obi/Obi Rope Mesh Renderer", 886)] [ExecuteInEditMode] [RequireComponent(typeof(ObiPathSmoother))] public class ObiRopeMeshRenderer : MonoBehaviour, ObiActorRenderer, IMeshDataProvider { public Renderer sourceRenderer { get; protected set; } public ObiActor actor { get; private set; } public uint meshInstances { get {return instances;} } [field: SerializeField] public Mesh sourceMesh { get; set; } [field: SerializeField] public Material[] materials { get; set; } public virtual int vertexCount { get { return sourceMesh ? sourceMesh.vertexCount : 0; } } public virtual int triangleCount { get { return sourceMesh ? sourceMesh.triangles.Length / 3 : 0; } } public RenderBatchParams renderParameters = new RenderBatchParams(true); public ObiPathFrame.Axis axis; public float volumeScaling = 0; public bool stretchWithRope = true; public bool spanEntireLength = true; public uint instances = 1; public float instanceSpacing = 0; public float offset = 0; public Vector3 scale = Vector3.one; public void Awake() { actor = GetComponent(); sourceRenderer = GetComponent(); } public void OnEnable() { ((ObiActorRenderer)this).EnableRenderer(); } public void OnDisable() { ((ObiActorRenderer)this).DisableRenderer(); } public void OnValidate() { ((ObiActorRenderer)this).SetRendererDirty(Oni.RenderingSystemType.MeshRope); } RenderSystem ObiRenderer.CreateRenderSystem(ObiSolver solver) { switch (solver.backendType) { #if (OBI_BURST && OBI_MATHEMATICS && OBI_COLLECTIONS) case ObiSolver.BackendType.Burst: return new BurstMeshRopeRenderSystem(solver); #endif case ObiSolver.BackendType.Compute: default: if (SystemInfo.supportsComputeShaders) return new ComputeMeshRopeRenderSystem(solver); return null; } } public virtual void GetVertices(List vertices) { sourceMesh.GetVertices(vertices); } public virtual void GetNormals(List normals) { sourceMesh.GetNormals(normals); } public virtual void GetTangents(List tangents) { sourceMesh.GetTangents(tangents); } public virtual void GetColors(List colors) { sourceMesh.GetColors(colors); } public virtual void GetUVs(int channel, List uvs) { sourceMesh.GetUVs(channel, uvs); } public virtual void GetTriangles(List triangles) { triangles.Clear(); triangles.AddRange(sourceMesh.triangles); } } }