NativeRenderable.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  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[] Materials
  55. {
  56. get { return materials; }
  57. set
  58. {
  59. int newNumMaterials = value != null ? value.Length : 0;
  60. int min = MathEx.Min(materials.Length, newNumMaterials);
  61. for (int i = 0; i < min; i++)
  62. materials[i] = value[i];
  63. for (int i = min; i < materials.Length; i++)
  64. materials[i] = null;
  65. Internal_SetMaterials(mCachedPtr, materials);
  66. }
  67. }
  68. internal Material GetMaterial(int index = 0)
  69. {
  70. return materials[index];
  71. }
  72. internal void SetMaterial(Material material, int index = 0)
  73. {
  74. materials[index] = material;
  75. IntPtr materialPtr = IntPtr.Zero;
  76. if (material != null)
  77. materialPtr = material.GetCachedPtr();
  78. Internal_SetMaterial(mCachedPtr, materialPtr, index);
  79. }
  80. internal void UpdateTransform(SceneObject sceneObject)
  81. {
  82. Internal_UpdateTransform(mCachedPtr, sceneObject.mCachedPtr);
  83. }
  84. internal void OnDestroy()
  85. {
  86. Internal_OnDestroy(mCachedPtr);
  87. }
  88. [MethodImpl(MethodImplOptions.InternalCall)]
  89. private static extern void Internal_Create(NativeRenderable instance, IntPtr parentSO);
  90. [MethodImpl(MethodImplOptions.InternalCall)]
  91. private static extern void Internal_UpdateTransform(IntPtr thisPtr, IntPtr parentSO);
  92. [MethodImpl(MethodImplOptions.InternalCall)]
  93. private static extern void Internal_SetMesh(IntPtr thisPtr, IntPtr mesh);
  94. [MethodImpl(MethodImplOptions.InternalCall)]
  95. private static extern void Internal_GetBounds(IntPtr thisPtr, IntPtr parentSO, out AABox box, out Sphere sphere);
  96. [MethodImpl(MethodImplOptions.InternalCall)]
  97. private static extern UInt64 Internal_GetLayers(IntPtr thisPtr);
  98. [MethodImpl(MethodImplOptions.InternalCall)]
  99. private static extern void Internal_SetLayers(IntPtr thisPtr, UInt64 layers);
  100. [MethodImpl(MethodImplOptions.InternalCall)]
  101. private static extern void Internal_SetMaterial(IntPtr thisPtr, IntPtr material, int index);
  102. [MethodImpl(MethodImplOptions.InternalCall)]
  103. private static extern void Internal_SetMaterials(IntPtr thisPtr, Material[] materials);
  104. [MethodImpl(MethodImplOptions.InternalCall)]
  105. private static extern void Internal_OnDestroy(IntPtr thisPtr);
  106. }
  107. }