TODO.txt 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. ----------------------- CAMELOT 2D / GUI -----------------------------------------------------------
  2. LONGTERM TODO:
  3. 1. Finish docking manager
  4. 2. OPTIMIZE GUI
  5. - This should be a fairly long-term task, about 2 months. I need to study GUI system in detail and identify bottlenecks.
  6. Then develop a clear and tight plan how to reorganize everything so it runs at maximum efficiency. GUI system is pretty much the
  7. only large fully fledged system in the engine, so investing this much time into optimizing it is worth it.
  8. Optimization notes:
  9. - submitToCoreThread calls are EXTREMELY slow. In 10-50ms range.
  10. - GUIManager updateMeshes seems to be executing every frame
  11. A lot of stuff is still using GSyncedMainCA but it should be using gMainCA - Find and replace
  12. TODO: Viewport can be modified from the sim thread, but is used on the core thread without any syncronization mechanisms. Maybe add a method that returns VIEWPORT_DATA, and have that used on the core thread.
  13. I still re-create GUIWidget mesh every frame instead of just updating it.
  14. I call waitUntilLoaded too many times. Sometimes 5-6 times in a single function. Each of those calls will be extremely slow.
  15. GUIWidget::updateMeshes leaks. If I leave the game running I can see memory continously going up
  16. - BansheeApplication should probably derive from Camlelot application. Right now user needs to know the difference between
  17. 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
  18. IMMEDIATE:
  19. - Update debug camera so it uses callbacks
  20. - I have disabled linear filtering because it doesn't look good on scale9grid textures. (Add another material so it works with stretched textures?)
  21. - Enable alpha test so I don't render completely transparent pixels.
  22. - What happens when I don't set a texture for a state of a GUI element. Use a dummy white texture probably?
  23. - Make sure GUI system uses a dummy texture if one isn't available
  24. - SpriteTexture keeps a static reference to DUmmyTexture which I need to release before shutdown
  25. - Hover colors of the scroll bar are wrong
  26. TextBox needed elements:
  27. - Get DebugCamera to ignore input if GUI has already processed it
  28. - LATER
  29. - TAB between input elements
  30. - Remove updateText calls from updateRenderElementsInternal and instead call it whenever offsets change
  31. - I might consider not rendering caret from within input sprite to avoid redrawing it while, and draw it directly from GUIManager
  32. GUIDragManager
  33. - GUI system sends startdrag/enddrag/drag events to all elements
  34. - startDrag(void* userPtr) changes cursor
  35. - releasing the cursor sends enddrag event and then the control can retrieve the user ptr
  36. - SINCE currently non-active elements ignore drag events, add GUIElement::acceptsMouseDrop property
  37. - 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
  38. -----------
  39. - My test model is rendering back faces. I need to flip them.
  40. - Although more than likely I am loading the model incorrectly since it works in Unity?
  41. - I probably want to determine front faces based on normals
  42. Immediate TODO:
  43. - A way to update mesh buffers without recreating vertex/index buffers (Setting data currently does exactly that)
  44. ----------------------------------------------------------------------------------------------
  45. Other:
  46. - Move Debug to CamelotCore and add SetFillMode
  47. -----------------------BACKLOG TODO---------------------------------------------------------------
  48. ----------------------------------------------------------------------------------------------
  49. Medium priority:
  50. - Mesh loading:
  51. - Example Freefall mesh has one index per vertex, and there are 17k+ vertices. I think I need a post-process step that optimizes them.
  52. - Imported FBX meshes are too big
  53. - Ogre performed special DDS loading. I removed that. I'm not sure if I'll need to re-add it?
  54. - My log is not thread safe yet it is being called from multiple threads.
  55. - RTTI:
  56. When defining RTTIType like so:
  57. RTTIType<D3D9HLSLProgram, HighLevelGpuProgram, D3D9HLSLProgramRTTI>
  58. 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.
  59. - Make sure that I am able to blit contents from render textures on all render systems
  60. - Command buffer:
  61. - Make CommandQueue not use mutexes and use atomics instead??
  62. - 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.
  63. - Closing down a window (any window) will shut down main rendering loop
  64. - GUIManager draw call merging:
  65. I merge two GUI elements if they don't overlap each other, however I don't consider if there is some world geometry between them. Another reason to move batching out of GUIManager.
  66. - Update Mesh DX11 buffers so they get initialized with data immediately upon construction as an optimization and see if OpenGL has something similar
  67. ----------------------------------------------------------------------------------------------
  68. Low priority TODO
  69. - Mesh loading:
  70. - Sub-meshes aren't being transformed by world matrices of their nodes
  71. - Remove template from RTTIType and move it to IReflectable? This way i can hopefully move GetRTTITypeStatic and GetRTTIType to IReflectable so I don't
  72. need to manually implement those for every method.
  73. - Viewport needs to be updated when I call RenderTarget::setFullscreen/finishSwitchingFullscreen/updateWindowRect/windowMovedOrResized. Currently it's not
  74. - D3D9Texture::createTextureResources is commented out at the moment. It gets called on device reset, and at that point I should reload texture resources.
  75. - I should probably keep all resources by DX managed. OpenGL apparently keeps a mirror of all its resources anyway.
  76. - Device reset and resource re-loading in general
  77. - Fix up WorkQueue as it doesn't lock when initializing, to make sure threads are actually started before returning
  78. - CPU reading or writing to a render texture in OpenGL is not supported. (CmGLHardwarePixelBuffer::upload/download).
  79. - When saving a resource, make sure resource is properly loaded before saving
  80. - Add doc to Resources::save that says it will block until render thread updates the resource
  81. - Add documentation that tells the user that reading a resource non-async will block the thread and execute all queued render commands first
  82. - Remove Response handlers from Resources
  83. - Cg doesn't work. Either remove it or get it to work
  84. - System is not yet ready for multiple rendering contexts
  85. - When serializing/deserializing derived classes, deserialization is done from most derived to base, while it should probably be done the other way around.
  86. - Because GLSL introspection API is built around basic types I don't support structs or arrays of objects:
  87. - I can't determine the size of struct or object arrays, as GL compiler will optimize out unused elements
  88. - Can't determine size of individual struct either, for the same reason (some struct members might get optimized out)
  89. - Arrays of objects aren't supported in HLSL or GLSL because of limited GLSL introspection
  90. - I might need to add an exception thrown if user tries to use them
  91. - Structs aren't supported in GLSL for introspection reasons
  92. - Go through pixel formats and removed unused ones: L8, L16, A4L4, and many others
  93. - Having shared_ptrs used in RenderSystem and CommandQueue can cause potential performance problems. Dozends of thousands of shared
  94. pointers may be getting queued in command queue per frame, in a slightly more complex scene, which will most certainly cause performance problems
  95. 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
  96. by the sim. thread.
  97. - A way to bind buffers to a Pass, while specifying buffer range
  98. - Better creation of PrimaryWindow
  99. - 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
  100. - Actually new OpenGL seems to support creating context without a window with the help of wglCreateContextAttribsARB and wglMakeCurrent:
  101. - OpenGL render window no longer looks for a monitor index
  102. - Material RTTI should also serialize shared buffers (they need to be made into a resource)
  103. - BE CAREFUL on how this will be implemented. Likely it will have much of the same interface as a material and/or GpuParams
  104. - queueGpuCommand is handled weird. shared_ptr isn't used for setting (this) parameter, and could be optimized out by the compiler
  105. - test if everything is okay in release mode
  106. - Resources::unload will deadlock if the resource isn't being loaded!
  107. - Maybe re-think how I handle ResourceHandle.isCreated?
  108. - Check D3D9/D3D11/GL resource usages. DX11 reports many unreleased objects. I'm guessing DX9 will as well. Not sure how to check OpenGL.
  109. - onMovedOrResized is still used by Viewport while that same callback is offered by RenderWindowManager. There is no need to have them in both places.
  110. - Texture "ScaleToFit" will cause the texture to repeat instead of clipping the image. e.g. a 50x20 texture placed on an 50x100 area will repeat 5x
  111. - When writing to mesh vertex buffer in Mesh::writeSubresource that requires a color flip I need to create a temporary copy of the
  112. entire buffer. It would be better to handle this differently. Same thing happens in MeshHeap
  113. - OpenGL also supports texture views using glTextureView but so far I only use them in DX11
  114. - I don't have a way to set Texture filtering or wrap modes, default ones are always set on initialization
  115. ----------------------------------------------------------------------------------------------
  116. Optional:
  117. - Need better handling for shader techniques. Some Materials are able to run on all renderers yet I can only specify one. This is problematic
  118. for Materials for things like text and sprites, which should run on all renderers, even if user adds a new one
  119. - Add precompiled headers to all projects
  120. - Serializable callbacks can't be null otherwise compiler complains
  121. - FBX importer can be greatly sped up by implementing a better allocator
  122. - Extend texture copy so it accepts different subregions & subresources (currently only entire resource can be copied)
  123. - Need a way to convert MSAA render texture into a normal render texture
  124. - Vertex buffer start offset is not supported when calling Draw methods
  125. - 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.
  126. - I should use point filtering for scale9grid, but that doesn't work in general case for stretched textures as they would look bad
  127. - Win32DropTarget: I need to be able to set drop DROPEFFECT when various IDropTarget methods are called. Otherwise the drag cursor always remains the same, whether the drag will be accepted or not.
  128. - Eventually make all math classes templates that work on both doubles and floats. (Very low priority)