TODO.txt 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. ----------------------- CAMELOT 2D / GUI -----------------------------------------------------------
  2. I still re-create GUIWidget mesh every frame instead of just updating it.
  3. MAJOR ISSUE: writeSubresource/readSubresoure doesn't require a shared ptr to GpuResourceData which means it could get destroyed while still in command queue. Right now it only works because I block right after I call those methods, which ensures nothing is destroyed.
  4. - When fixed, make sure I remove blocking calls after writeSubresource where they're not needed (GUIManager for example)
  5. I call waitUntilLoaded too many times. Sometimes 5-6 times in a single function. Each of those calls will be extremely slow.
  6. GUIWidget::updateMeshes leaks. If I leave the game running I can see memory continously going up
  7. - Resizing from the top doesn't work
  8. - Resizing from the left actually resizes the right side
  9. - BansheeApplication should probably derive from Camlelot application. Right now user needs to know the difference between
  10. gApplication and gBansheeApp, which is non-intuitive (e.g. retrieving a window can be done on gApplication, but running main loop can happen on both
  11. Over the holidays:
  12. - Profile code to see why it runs to slow in debug (AQTime probably)
  13. - Window docking/undocking
  14. IMMEDIATE:
  15. - Clicking on a window to focus and immediately trying to drag/resize it, doesn't work. I first need to click, then click again to drag/resize.
  16. - OpenGL rendering slows to extremely with time (seems to be related to rendering, possibly GUI, possibly in general Pass/Material/Shader/PassParams)
  17. - Update debug camera so it uses callbacks
  18. - I have disabled linear filtering because it doesn't look good on scale9grid textures. (Add another material so it works with stretched textures?)
  19. - Enable alpha test so I don't render completely transparent pixels.
  20. - What happens when I don't set a texture for a state of a GUI element. Use a dummy white texture probably?
  21. - Make sure GUI system uses a dummy texture if one isn't available
  22. - SpriteTexture keeps a static reference to DUmmyTexture which I need to release before shutdown
  23. - Hover colors of the scroll bar are wrong
  24. TextBox needed elements:
  25. - Key-repeat? Pressing left/right/up/down arrows doesn't repeat the keys (also delete/backspace)
  26. - Add special text input commands, which will get repeatedly sent as long as their corresponding key is set in GUIManager
  27. - Get DebugCamera to ignore input if GUI has already processed it
  28. - Cut/Copy/Paste
  29. - Clicking on the InputBox doesn't display the cursor. I need to click another time and then it shows up.
  30. - LATER
  31. - TAB between input elements
  32. - Context menu with copy/cut/paste
  33. - Remove updateText calls from updateRenderElementsInternal and instead call it whenever offsets change
  34. - I might consider not rendering caret from within input sprite to avoid redrawing it while, and draw it directly from GUIManager
  35. GUIDragManager
  36. - GUI system sends startdrag/enddrag/drag events to all elements
  37. - startDrag(void* userPtr) changes cursor
  38. - releasing the cursor sends enddrag event and then the control can retrieve the user ptr
  39. - SINCE currently non-active elements ignore drag events, add GUIElement::acceptsMouseDrop property
  40. - Such elements will receive mouse drag and mouse up events if other element is active, and they can filter if they want to accept it
  41. Later add InputMap class in which you can bind certain actions (like move left, fire, etc.) to Keyboard, Joystick or Mouse buttons.
  42. -----------
  43. - My test model is rendering back faces. I need to flip them.
  44. - Although more than likely I am loading the model incorrectly since it works in Unity?
  45. - I probably want to determine front faces based on normals
  46. Immediate TODO:
  47. - A way to update mesh buffers without recreating vertex/index buffers (Setting data currently does exactly that)
  48. ------------------------------------------------------------------------------------------------
  49. Longterm plans:
  50. <<Multithreaded GUI rendering>>
  51. - Event handling and normal "update" will still be done on the main thread
  52. - At the beginning of each frame a GUI mesh update is queued on the GUI thread
  53. - Since we're queuing the update at the beggining of the frame we will be using last frames transform and gui element states.
  54. - When queing we need to make sure to store GUIWidget transform, and specific element states (e.g. "text" in GUILabel)
  55. - At the end of simulation frame wait until GUI update is complete. After both simulation and GUI updates are complete, proceed with submitting it to render system.
  56. <<Figure out how to store texture references in a font>>
  57. - Currently I store a copy of the textures but how do I automatically update the font if they change?
  58. - Flesh out the dependencies system?
  59. - I can import texture as normal, and keep it as an actual TextureHandle, only keep it hidden
  60. if it was created automatically (by FontImporter) for example?
  61. - But then who deletes the texture?
  62. - Set up an "internalResource" system where resources hold references to each other and also release them?
  63. - In inspector they can be expanded as children of the main resource, but cannot be directly modified?
  64. - Deleting the main resource deletes the children too
  65. <<Window controls>>
  66. - Create GUIWindowFrame/GUITitleBar control that can be added to the widget
  67. - it has onMaximize, onMinimize, onClose, onMove, onResize callbacks
  68. - when window is floating onMove/onResize will resize the actual Window
  69. - when docked (EditorWindow should know if it's docked or not) it will call back the layout manager
  70. - (Frame and title bar need to be separate as some windows will used tabbed bar instead of normal title bar)
  71. - GUITabbedArea that will serve for tabbed EditorWindows
  72. - GUITabArea allows you to move tabs around, but also dock/undock them if the user drags the tab outside.
  73. - MainEditorWindow - handled specially, no need for a good interface
  74. - Keeps a title bar, status bar and a layout manager (i.e. docking manager)
  75. <<MessageBox class>>
  76. - A good first test case for my GUI windows
  77. <<Other>>
  78. - GUIManager events
  79. - GUIElement and GUIWidget "hasFocus" flag
  80. - Only elements in focus receive keyboard events
  81. - There is an issue that custom-UIs won't have their mesh shared. For example most game UIs will be advanced and will
  82. likely use on GUIWidget per element. However currently I only perform batching within a single widget which
  83. doesn't help in the mentioned case.
  84. ----------------------------------------------------------------------------------------------
  85. Other:
  86. - Move Debug to CamelotCore and add SetFillMode
  87. -----------------------BACKLOG TODO---------------------------------------------------------------
  88. ----------------------------------------------------------------------------------------------
  89. High priority:
  90. - GetRenderOperation doesn't consider sub-meshes
  91. ----------------------------------------------------------------------------------------------
  92. Medium priority:
  93. - Add a field that tracks % of resource deserialization in BinarySerializer
  94. - Mesh loading:
  95. - Example Freefall mesh has one index per vertex, and there are 17k+ vertices. I think I need a post-process step that optimizes them.
  96. - Imported FBX meshes are too big
  97. - Ogre performed special DDS loading. I removed that. I'm not sure if I'll need to re-add it?
  98. - My log is not thread safe yet it is being called from multiple threads.
  99. - RTTI:
  100. When defining RTTIType like so:
  101. RTTIType<D3D9HLSLProgram, HighLevelGpuProgram, D3D9HLSLProgramRTTI>
  102. I need to make sure that HighLevelGpuProgram class has valid RTTI type as well. Otherwise the inheritance hierarchy will not be correct. Right now this isn't checked anywhere.
  103. - Make sure that I am able to blit contents from render textures on all render systems
  104. - Command buffer:
  105. - Make CommandQueue not use mutexes and use atomics instead??
  106. - Figure out how to handle accessing texture from a non-render thread?
  107. - When importing a resource, and registering it with Resources I don't think it properly gets added to the loaded resources array? For some reason shaders get created twice.
  108. - Doing setPixels_async in the texture doesn't make sure that the user doesn't actually modify the provided PixelData after that call.
  109. - In general I need to rethink how to handle modifying resources with multithreading
  110. - Closing down a window (any window) will shut down main rendering loop
  111. ----------------------------------------------------------------------------------------------
  112. Low priority TODO
  113. - Mesh loading:
  114. - Sub-meshes aren't being transformed by world matrices of their nodes
  115. - Remove template from RTTIType and move it to IReflectable? This way i can hopefully move GetRTTITypeStatic and GetRTTIType to IReflectable so I don't
  116. need to manually implement those for every method.
  117. - Viewport needs to be updated when I call RenderTarget::setFullscreen/finishSwitchingFullscreen/updateWindowRect/windowMovedOrResized. Currently it's not
  118. - D3D9Texture::createTextureResources is commented out at the moment. It gets called on device reset, and at that point I should reload texture resources.
  119. - I should probably keep all resources by DX managed. OpenGL apparently keeps a mirror of all its resources anyway.
  120. - Device reset and resource re-loading in general
  121. - Fix up WorkQueue as it doesn't lock when initializing, to make sure threads are actually started before returning
  122. - CPU reading or writing to a render texture in OpenGL is not supported. (CmGLHardwarePixelBuffer::upload/download).
  123. - When saving a resource, make sure resource is properly loaded before saving
  124. - Add doc to Resources::save that says it will block until render thread updates the resource
  125. - Add documentation that tells the user that reading a resource non-async will block the thread and execute all queued render commands first
  126. - Remove Response handlers from Resources
  127. - Cg doesn't work. Either remove it or get it to work
  128. - System is not yet ready for multiple rendering contexts
  129. - When serializing/deserializing derived classes, deserialization is done from most derived to base, while it should probably be done the other way around.
  130. - Because GLSL introspection API is built around basic types I don't support structs or arrays of objects:
  131. - I can't determine the size of struct or object arrays, as GL compiler will optimize out unused elements
  132. - Can't determine size of individual struct either, for the same reason (some struct members might get optimized out)
  133. - Arrays of objects aren't supported in HLSL or GLSL because of limited GLSL introspection
  134. - I might need to add an exception thrown if user tries to use them
  135. - Structs aren't supported in GLSL for introspection reasons
  136. - Go through pixel formats and removed unused ones: L8, L16, A4L4, and many others
  137. - Having shared_ptrs used in RenderSystem and CommandQueue can cause potential performance problems. Dozends of thousands of shared
  138. pointers may be getting queued in command queue per frame, in a slightly more complex scene, which will most certainly cause performance problems
  139. due to thread safety and atomics used by shared_ptr. However I still need some guarantee that objects queued in RenderSystem won't be destroyed
  140. by the sim. thread.
  141. - A way to bind buffers to a Pass, while specifying buffer range
  142. - Add GL Texture buffers (They're equivalent to DX11 buffers) - http://www.opengl.org/wiki/Buffer_Texture
  143. - Better creation of PrimaryWindow
  144. - RENDERWINDOWDESC accepts a "externalWindow" flag and an "externalHandle" so when creating the primary window with RenderSystem::initialize we don't always need to create a new window
  145. - Actually new OpenGL seems to support creating context without a window with the help of wglCreateContextAttribsARB and wglMakeCurrent:
  146. - OpenGL render window no longer looks for a monitor index
  147. - Material RTTI should also serialize shared buffers (they need to be made into a resource)
  148. - BE CAREFUL on how this will be implemented. Likely it will have much of the same interface as a material and/or GpuParams
  149. - Mesh::setMeshData is currently always synced
  150. - queueGpuCommand is handled weird. shared_ptr isn't used for setting (this) parameter, and could be optimized out by the compiler
  151. - test if everything is okay in release mode
  152. - Resources::unload will deadlock if the resource isn't being loaded!
  153. - Maybe re-think how I handle ResourceHandle.isCreated?
  154. - Check D3D9/D3D11/GL resource usages. DX11 reports many unreleased objects. I'm guessing DX9 will as well. Not sure how to check OpenGL.
  155. - Shared GPU buffers
  156. - wouldn't work atm due to the way I update the buffers (and the way I mark them dirty)
  157. - Material::setParamBlock is commented out
  158. - Add support for diacritical marks to the input system (in WindowEventUtilities)
  159. - onMovedOrResized is still used by Viewport while that same callback is offered by RenderWindowManager. There is no need to have them in both places.
  160. - Replace list of windows in WIndowEventUtilities with RenderWindowManager list. No need to keep two lists I think
  161. ----------------------------------------------------------------------------------------------
  162. Optional:
  163. - Need better handling for shader techniques. Some Materials are able to run on all renderers yet I can only specify one. This is problematic
  164. for Materials for things like text and sprites, which should run on all renderers, even if user adds a new one
  165. - Add precompiled headers to all projects
  166. - If possible, make sure GLSL uses EntryPoint and Profile fields I have added to GpuProgram
  167. - Move all x86 libs to x86 folders. Move all binaries to x86 folders as well
  168. - Serializable callbacks can't be null otherwise compiler complains
  169. - FBX importer can be greatly sped up by implementing a better allocator
  170. - Extend texture copy so it accepts different subregions & subresources (currently only entire resource can be copied)
  171. - Need a way to convert MSAA render texture into a normal render texture
  172. - Vertex buffer start offset is not supported when calling Draw methods
  173. - Instead of doing setThisPtr on every CoreGpuObject, use intrusive shared_ptr instead?
  174. - Renderer::render(CameraPtr) is currently commented out because I moved Camera out of Camelot and I didn't want to bother figuring how to port this
  175. - When rendering Scale9Grid GUI elements the stretched center will cause linear interpolation to kick in and blend the edges with the border parts of the texture.
  176. - I should use point filtering for scale9grid, but that doesn't work in general case for stretched textures as they would look bad
  177. ----------------------------------------------------------------------------------------------
  178. After polish and ideas:
  179. - Each view (i.e. camera) of the scene should be put into its own thread
  180. - How do I handle multiple mesh formats? Some files need animation, other don't. Some would mabye like to use QTangent, others the proper tangent frame.
  181. - Asset postprocessor? Imports a regular mesh using normal importers and then postprocesses it into a specialized format?
  182. - Load texture mips separately so we can unload HQ textures from far away objects (like UE3)
  183. - Add Unified shader so I can easily switch between HLSL and GLSL shaders (they need same parameters usually, just different code)
  184. - Maybe just add support for Cg and force everyone to use that? - I'd like to be able to just switch out renderer in a single location and that everything keeps on working without
  185. further modifications.
  186. - Port boost threads to std threads (CmThreadDefines.h)
  187. - Remove HardwarePixelBuffer (DX11 doesn't use it, and DX9 and OpenGL textures can be rewritten so they have its methods internally)
  188. - Multihead device
  189. - 3D rendering (use low level hardware methods for it)
  190. - Don't forget to check out Unity DX11 documentation on how to implement DX11 features (http://docs.unity3d.com/Documentation/Manual/DirectX11.html)
  191. - Go to Game Engine Architecture book and make a list of Utility systems we will need (Config files, Parsers, File I/O etc)
  192. - Go to GEA book and read about resource managers before implementing them
  193. - Actually I should re-read most of the chapers in the book, or all of it
  194. - When building internal GUI make sure to use CEGUI as a reference
  195. - OpenGL non-Win32 window files haven't been properly parsed or tested
  196. - Since I probably can't compile them, try adding them to VS and see what intellisense says?
  197. - Textures and all other buffers keep a copy of their data in system memory. If there are memory constraints we might need a way to avoid this.
  198. - Move all multiplatform files (window creation, cursor, etc.) into a separate PlatformSpecific folder. So anyone porting it to a new platform
  199. knows that he only needs to change those files.
  200. - Make sure my Log system uses XML + HTML