CSharpWrap.txt 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. Classes that need C# wrappers:
  2. Math (Instead of a wrapper create actual C# classes, but which map 1-1 with C++ code so we can move them through C++/C# boundaries):
  3. -Vector2
  4. -Vector3
  5. -Vector4
  6. -Matrix3
  7. -Matrix4
  8. -Quaternion
  9. -Rect
  10. -Int2
  11. -Color
  12. Resources:
  13. - Mesh
  14. - Texture
  15. - Font
  16. - Material
  17. - GpuProgram
  18. - Technique
  19. - Shader
  20. - DepthStencil/Blend/Rasterizer/Sampler state
  21. Core objects:
  22. - RenderTarget
  23. - RenderWindow
  24. - RenderTexture
  25. - MultiRenderTexture
  26. - SceneObject
  27. - Component
  28. - plus specific components Camera, Renderable, maybe others
  29. - (later ofc ability to derive custom C# components)
  30. GUI:
  31. - EditorWindow
  32. - GUIWidget
  33. - GUILabel/GUIButton/GUIToggle/GUIInputBox/GUITexture...
  34. - GUILayoutX/GUILayoutY/GUILayoutOptions
  35. - GUISkin/GUIElementStyle
  36. Systems:
  37. - Resources
  38. - Importer
  39. - Application (startUp/shutDown)
  40. - Cursor
  41. - Debug
  42. - Input
  43. - Time
  44. -----------------
  45. ScriptManager
  46. - loadAssembly
  47. - compileAssembly
  48. ScriptAssembly
  49. - GetClass(namespace, name)
  50. ScriptClass
  51. - GetField(name)
  52. - GetMethod(name)
  53. - InvokeMethod(name, void** params)
  54. - AddInternalCall
  55. - CreateInstance()
  56. ScriptMethod
  57. - Invoke(void** params)
  58. retval = mono_jit_exec (domain, assembly, argc - 1, argv + 1);
  59. to call a Main function in the assembly
  60. -----------------
  61. VERY IMPORTANT:
  62. - Attempt to compile mono runtime as 64bit
  63. Make sure to add /etc and /lib folders in CamelotDependencies. Plus all of the x64 files.
  64. - lib/bin files only exist in x86 Debug. And projects are only set up for that single configuration as well
  65. -----------------
  66. add BansheeEditor class
  67. Add C++ EditorApplication and have it start up Application and create a main window
  68. Then in C# class just call EditorApplication to create a main window
  69. Create another .exe class called BansheeEd, which loads up MBansheeEditor assembly and calls EditorApplication to start everything up.
  70. - I might need to add Mono loading code to BansheeEngine first?
  71. - ScriptManager
  72. - InvokeMethod
  73. For EditorWindow, add a new class in BansheeEditor, which pretty much does the job of EditorWidget::open
  74. - Except it creates an empty widget. (It will also create a window, but in C++ code)
  75. - All the window docking/undocking moving/resizing is done in C++
  76. - EditorWindow only has a reference to EditorWidget
  77. -----------------
  78. But which ones will I need initially?
  79. - [EditorApplication] - Entry point. Creates a MainEditorWindow
  80. - [EditorWindow] (Scene, Project, Hierarchy, etc.)
  81. - show()/hide()
  82. - [MainEditorWindow]
  83. - Slight variation of EditorWindow as there can be only one of them
  84. - Contains [TitleBar], [DockManager]
  85. - When adding GUI elements I need to make it easy to add game GUI elements,
  86. but also make a distinction and make it possible to add editor GUI elements.
  87. - Each EditorWindow contains a [GUIWidget] (created by default)
  88. - This GUIWIdget is created specially with EditorWindow as its target
  89. - GUIWidget is also a Component which can be used for rendering to Game view
  90. - All game GUIWidgets are created with Game render target as their target
  91. - [GameObject], [Component]
  92. - Need something to add GUIWidget to
  93. - I need to have [Application] running within EditorApplication
  94. - So when I remove EditorApplication everything runs as normal
  95. - How to make the distinction?
  96. - Application needs to render to RenderTarget when in editor, and have its own window when standalone
  97. - When in Editor, EditorApplication will call application and tell it to create a render target
  98. - When published I will have a Game class, which will also call Application and run it in a window
  99. - Certain components should only exists in editor (Like Scene camera, gizmos and etc.)
  100. - Add a flag to GameObjects like in Unity, that can hide the object in Hierarchy, or make it not save
  101. - Editor objects would be hidden and would not save with the level, which would make publishing work
  102. - GUIWidget
  103. - [GUILayoutX], [GUILayoutY], [GUIArea], [GUISpace], [GUIFlexibleSpace]
  104. - [GUIElement]
  105. - [GUILabel], [GUIButton], etc.
  106. - TODO: GUISkin? - Will I need to create interface for textures and resource loading/importing as well? Probably
  107. ----------------
  108. I want my .exe to be native. Internally it will call MBansheeEngine and MBansheeEditor.
  109. This will allow me to debug and start C++ as usual.
  110. -----------------
  111. Notes:
  112. - I will need RequireComponent[] attribute. This attribute should automatically add the specified class to the wanted
  113. GameObject. This is useful if you suddenly decide your class is now dependant on another, but you would otherwise have to manually
  114. go through all instances of that GameObject in scene and add the required component.
  115. - HOWEVER, a more generic way of doing this (maybe using prefabs) would be useful. Because what happens when a class suddenly becomes
  116. dependant on a resource, or a specific instance of a class? In that case we cannot use RequireComponent.
  117. - Use FrameUpdate[QueueIdx], OnCreate[QueueIdx], OnDestroy[QueueIdx] attributes to signify to the scripting system when to execute
  118. certain methods. QueueIdx allows you to specify the order in which these methods will be called. In Unity you have Awake and Start methods
  119. for initialization, but here you may just specify OnCreate[0] and OnCreate[1].
  120. - I will likely need C++ equivalents of these queues because C++ components will also require such ordering.