TODO.txt 17 KB

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