using System; using System.Runtime.InteropServices; using UnityEngine; public static class QExtensions { public static TStruct[] ToStructArray(this IntPtr ptr, int count) { if (ptr == IntPtr.Zero) return null; TStruct[] result = new TStruct[count]; int size = Marshal.SizeOf(); IntPtr current = ptr; for (int i = 0; i < count; ++i) { result[i] = Marshal.PtrToStructure(current); current = IntPtr.Add(current, size); } return result; } public static int[] ToIntArray(this IntPtr ptr, int count) { if (ptr == IntPtr.Zero) return null; int[] result = new int[count]; Marshal.Copy(ptr, result, 0, count); return result; } public static Vector2 ToVector2(this QVec2 vec) { return new Vector2(vec.x, vec.y); } public static Vector3 ToVector3(this QVec3 vec) { return new Vector3(vec.x, vec.y, vec.z); } public static Vector3 ToVector3(this QTriVertex triVertex) { byte[] v = triVertex.v; return new Vector3(v[0], v[1], v[2]); } public static Vector3 ToUnity(this Vector3 vec) { return new Vector3(vec.y, vec.z, -vec.x); } public static Vector3 ToUnityPosition(this QVec3 origin) { return new Vector3(origin.y, origin.z, -origin.x); } public static Vector3 ToUnityDirection(this QVec3 dir) { return new Vector3(dir.y, dir.z, -dir.x); } public static Quaternion ToUnityRotation(this QVec3 angles) { return Quaternion.AngleAxis(-angles.y, Vector3.up) * Quaternion.AngleAxis(angles.x, Vector3.right) * Quaternion.AngleAxis(angles.z, Vector3.forward); } public static Color ToColor(this uint color) { return new Color32( (byte)(color & 0xFF), (byte)((color >> 8) & 0xFF), (byte)((color >> 16) & 0xFF), (byte)((color >> 24) & 0xFF)); } public static Color ToColor(this QVec3 vec) { return new Color(vec.x, vec.y, vec.z); } }