using System.Collections; using System.Collections.Generic; using UnityEngine; namespace UltraCombos { public class UniformStructuredBuffer : StructuredBuffer { public ScriptableObject uniform; void Start() { int stride = GetStride(uniform.GetType()); Allocate(stride / sizeof(float), sizeof(float)); //Debug.LogFormat("stride: {0}", stride); } protected virtual void FixedUpdate() { var data = GetData(uniform); SetData(data); } protected int GetStride(System.Type type) { int res = 0; foreach (var field in type.GetFields()) { int s = System.Runtime.InteropServices.Marshal.SizeOf(field.FieldType); res += s; //Debug.LogFormat("{0}: {1}", field.Name, s); } return res; } protected List GetData(object obj) { List values = new List(); foreach (var field in obj.GetType().GetFields()) { var value = field.GetValue(obj); if (field.FieldType.Equals(typeof(int))) { values.Add((int)value); } else if (field.FieldType.Equals(typeof(float))) { values.Add((float)value); } else if (field.FieldType.Equals(typeof(Vector2))) { var v = (Vector2)value; values.Add(v.x); values.Add(v.y); } else if (field.FieldType.Equals(typeof(Vector3))) { var v = (Vector3)value; values.Add(v.x); values.Add(v.y); values.Add(v.z); } else if (field.FieldType.Equals(typeof(Vector4))) { var v = (Vector4)value; values.Add(v.x); values.Add(v.y); values.Add(v.z); values.Add(v.w); } else { Debug.LogFormat("Field is invalid: {0} - {1}", field.Name, field.FieldType); } } return values; } } }