SceneView.txt 4.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. TODO:
  2. - Core thread gets stuck on shutdown when OpenGL is used...Somewhere in kernel
  3. Weekend:
  4. - Set up grid material and hook it up to renderer (+ actually instantiate it in EditorApplication)
  5. - Fix up shader so I can reference two different gpu vars with a single shader var (e.g. DX11 sampler variables will have different names than DX9 or GL sampler variables)
  6. - When unloading unused resources I should do it recursively so it unloads any new ones that might have been released during the first unload
  7. - Think about picking implementation and possibly Handles implementation
  8. TODO - Think about:
  9. - How will I allow user from C# to draw gizmos and handles?
  10. - Unity uses immediate mode
  11. - I should probably focus more on implementing a nice C# drawing interface so I don't constantly have to go and use C++
  12. - Although this might be overkill for this point - I think even Unitys handles/gizmos are C++ in the end
  13. ----------------------------------------------------------------------
  14. Handles
  15. - Make a few different base handle types:
  16. - Slider 1D (e.g. for movement using an arrow cap)
  17. - Slider 2D (e.g. for movement in 2D using a plane render)
  18. - Similar for scale/rotation handles (see Unity for its implementations of those)
  19. Handles should have colliders which will be queries whenever user input is detected in scene view
  20. If any handle is hit the input will not proceed further (e.g. no picking will be done) and that handle control
  21. will become active.
  22. Base handle types should just be positioned in space and then return value every frame as user moves them.
  23. - This way they can also easily be used from C# for custom user-made stuff
  24. TODO - Think about this
  25. See for inspiration: http://docs.unity3d.com/ScriptReference/Handles.html
  26. ----------------------------------------------------------------------
  27. Picking
  28. TODO - Think about this
  29. Picking
  30. - Create core thread class that accepts a screen coordinate and a camera and it determines object at its position
  31. - System then renders all visible objects with diferent colors
  32. - Image then needs to be read back to determine what was hit
  33. - Result is returned via async op
  34. - Needs to support multi-select where I draw a rectangle on screen
  35. - NOTE: I will also need to render gizmos which I assume will all be within a single buffer. This might require special care since normally I can color each buffer with a different color, which won't work in this case.
  36. - Similar issue might happen with particles and other systems
  37. ----------------------------------------------------------------------
  38. Rendering selection
  39. Get the mesh from the selected Renderable
  40. Draw that same mesh again using a shader that grays out the original
  41. The second mesh will likely need to use depth bias (sloped depth bias too?)
  42. ----------------------------------------------------------------------
  43. Grid
  44. Generate grid of X size around Y point
  45. Normally Y is (0, 0, 0) but we should be able to move it with camera
  46. There will be minor and major axes with slightly different color (and thickness?)
  47. Instead of pixel perfect lines draw 2D quads (Using DrawHelper which has thick line support)
  48. Mesh can be static, I can just move its origin by length of the major line (+ maybe have a fadeout in shader with 1 invisible major line so the movement is not noticeable)
  49. Material is retrieved from builtin materials list
  50. This can be drawn directly using the draw list and not a renderable
  51. ----------------------------------------------------------------------
  52. Gizmos
  53. GizmoSetups
  54. - Determines what to display for a certain component (or a SceneObject) itself
  55. GizmoManager
  56. - Every frame goes through all game objects and create/removes their gizmos. It keeps a cached version of all gizmos
  57. - It keeps a list of gizmo descriptors
  58. - A "diff" of this list is sent to Core thread every frame
  59. GizmosRenderer
  60. - Batches all gizmos into a single buffer and renders them with a single call
  61. - It might be a bit problematic if custom textures are used for gizmos
  62. - Just don't batch those?
  63. When picking GizmosRenderer can draw the gizmos as normal but using a special shader.
  64. --------
  65. Need to allow the user to specify custom gizmos.
  66. - Have a set of methods like Gizmos.DrawSphere, DrawIcon, DrawLine, DrawCube, DrawFrustum, etc.
  67. - Have a CustomGizmo attribute which you can attach to a method
  68. - That method can then call above methods
  69. - Additionally in the attribute you can specify when is the gizmo displayed: Active, Selected, NotSelected, SelectedOrChild
  70. - And an option if gizmo can be picked or not
  71. - These methods will somehow automatically be registered with the GizmoSetups