Octree.cs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Runtime.InteropServices;
  4. namespace Urho
  5. {
  6. partial class Octree
  7. {
  8. [DllImport(Consts.NativeImport, CallingConvention = CallingConvention.Cdecl)]
  9. internal static extern IntPtr Octree_Raycast(IntPtr handle, ref Ray ray, ref RayQueryLevel level, float maxDistance, uint drawableFlags, uint viewMask, bool single, out int count);
  10. List<RayQueryResult> Raycast(Ray ray, RayQueryLevel level, float maxDistance, DrawableFlags drawableFlags, bool single, uint viewMask = UInt32.MaxValue)
  11. {
  12. Runtime.ValidateRefCounted(this);
  13. List<RayQueryResult> result = new List<RayQueryResult>();
  14. int count;
  15. var ptr = Octree_Raycast(Handle, ref ray, ref level, maxDistance, (uint)drawableFlags, viewMask, single, out count);
  16. if (ptr == IntPtr.Zero)
  17. return result;
  18. int structSize = Marshal.SizeOf(typeof (RayQueryResult));
  19. for (int i = 0; i < count; i++)
  20. {
  21. IntPtr data = new IntPtr(ptr.ToInt64() + structSize * i);
  22. RayQueryResult item = (RayQueryResult)Marshal.PtrToStructure(data, typeof(RayQueryResult));
  23. result.Add(item);
  24. }
  25. return result;
  26. }
  27. public List<RayQueryResult> Raycast(Ray ray, RayQueryLevel level = RayQueryLevel.Triangle, float maxDistance = 10000, DrawableFlags drawableFlags = DrawableFlags.Geometry, uint viewMask = UInt32.MaxValue)
  28. {
  29. Runtime.ValidateRefCounted(this);
  30. return Raycast(ray, level, maxDistance, drawableFlags, false, viewMask);
  31. }
  32. public RayQueryResult? RaycastSingle(Ray ray, RayQueryLevel level = RayQueryLevel.Triangle, float maxDistance = 10000, DrawableFlags drawableFlags = DrawableFlags.Geometry, uint viewMask = UInt32.MaxValue)
  33. {
  34. Runtime.ValidateRefCounted(this);
  35. var result = Raycast(ray, level, maxDistance, drawableFlags, true, viewMask);
  36. if (result != null && result.Count > 0)
  37. return result[0];
  38. return null;
  39. }
  40. }
  41. }