NativeRenderable.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. using System;
  2. using System.Runtime.CompilerServices;
  3. namespace BansheeEngine
  4. {
  5. /// <summary>
  6. /// Wrapper around the native Renderable class.
  7. /// <see cref="Renderable"/>
  8. /// </summary>
  9. internal class NativeRenderable : ScriptObject
  10. {
  11. internal Mesh Mesh
  12. {
  13. get
  14. {
  15. return mesh;
  16. }
  17. set
  18. {
  19. mesh = value;
  20. int subMeshCount = 0;
  21. if (mesh != null)
  22. subMeshCount = mesh.SubMeshCount;
  23. Material[] newMaterials = new Material[subMeshCount];
  24. int numToCopy = MathEx.Min(newMaterials.Length, materials.Length);
  25. Array.Copy(materials, newMaterials, numToCopy);
  26. materials = newMaterials;
  27. IntPtr meshPtr = IntPtr.Zero;
  28. if (mesh != null)
  29. meshPtr = mesh.GetCachedPtr();
  30. Internal_SetMesh(mCachedPtr, meshPtr);
  31. }
  32. }
  33. internal Bounds GetBounds(SceneObject parent)
  34. {
  35. AABox box;
  36. Sphere sphere;
  37. Internal_GetBounds(mCachedPtr, parent.mCachedPtr, out box, out sphere);
  38. return new Bounds(box, sphere);
  39. }
  40. internal UInt64 Layers
  41. {
  42. get { return Internal_GetLayers(mCachedPtr); }
  43. set { Internal_SetLayers(mCachedPtr, value); }
  44. }
  45. private Material[] materials = new Material[0];
  46. private Mesh mesh;
  47. public NativeRenderable(SceneObject sceneObject)
  48. {
  49. IntPtr sceneObjPtr = IntPtr.Zero;
  50. if (sceneObject != null)
  51. sceneObjPtr = sceneObject.GetCachedPtr();
  52. Internal_Create(this, sceneObjPtr);
  53. }
  54. internal Material GetMaterial(int index = 0)
  55. {
  56. return materials[index];
  57. }
  58. internal void SetMaterial(Material material, int index = 0)
  59. {
  60. materials[index] = material;
  61. IntPtr materialPtr = IntPtr.Zero;
  62. if (material != null)
  63. materialPtr = material.GetCachedPtr();
  64. Internal_SetMaterial(mCachedPtr, materialPtr, index);
  65. }
  66. internal void UpdateTransform(SceneObject sceneObject)
  67. {
  68. Internal_UpdateTransform(mCachedPtr, sceneObject.mCachedPtr);
  69. }
  70. internal void OnDestroy()
  71. {
  72. Internal_OnDestroy(mCachedPtr);
  73. }
  74. [MethodImpl(MethodImplOptions.InternalCall)]
  75. private static extern void Internal_Create(NativeRenderable instance, IntPtr parentSO);
  76. [MethodImpl(MethodImplOptions.InternalCall)]
  77. private static extern void Internal_UpdateTransform(IntPtr thisPtr, IntPtr parentSO);
  78. [MethodImpl(MethodImplOptions.InternalCall)]
  79. private static extern void Internal_SetMesh(IntPtr thisPtr, IntPtr mesh);
  80. [MethodImpl(MethodImplOptions.InternalCall)]
  81. private static extern void Internal_GetBounds(IntPtr thisPtr, IntPtr parentSO, out AABox box, out Sphere sphere);
  82. [MethodImpl(MethodImplOptions.InternalCall)]
  83. private static extern UInt64 Internal_GetLayers(IntPtr thisPtr);
  84. [MethodImpl(MethodImplOptions.InternalCall)]
  85. private static extern void Internal_SetLayers(IntPtr thisPtr, UInt64 layers);
  86. [MethodImpl(MethodImplOptions.InternalCall)]
  87. private static extern void Internal_SetMaterial(IntPtr thisPtr, IntPtr material, int index);
  88. [MethodImpl(MethodImplOptions.InternalCall)]
  89. private static extern void Internal_OnDestroy(IntPtr thisPtr);
  90. }
  91. }