--------- ALL LONG TERM TASKS / FIXES BELONG TO GOOGLE DOCS: ImplementationTODO OR PossibleImprovements ----------

----------------------------------------------------------------------
Assembly refresh

When serializing Camera I cannot save the reference to RenderTexture. Make it a Resource?
Possibly set up automatic refresh in debug mode after initialization? As an ad-hoc unit test

Modal windows are set up as persistent but I don't serialize their internal data anywhere

----------------------------------------------------------------------
C# Material/Shader:

TODO - Implement param block and sampler support
TODO - When creating a Material without a shader, a default one should be used, at least in editor
TODO - Setting Material array parameters isn't possible from C#

GUIResourceField doesn't distinguish between tex2d, tex3d and texcube.

---------------------------------------------------------------------
ProjectLibrary import

I'm not sure if queued dependencies are handled properly. They're handled on an internal ProjectLibrary loop but perhaps I should
return them in checkForModifications?

---------------------------------------------------------------------
Prefab diff

Add "dirty object" system to C#. Each ScriptResource and ScriptGameObject should have a dirty flag.
 - It should be toggle-able via EditorUtility.SetDirty or similar. (Possibly make this part of ProjectLibrary)
 - There should also be a method to check if something is dirty via EditorUtility.IsDirty or similar. (Possibly make this part of ProjectLibrary)
  - Hook this up to Scene.IsModified because it is currently not implemented (Might need to keep a link to active Prefab in scene to do this)
 - Add a "Save Project" button that automatically saves all dirty assets. Do this automatically when user quits the editor.
 - Call SetDirty manually whenever:
  - A new object or component is added to the scene
  - An object or component is removed from the scene
  - An object is reparented
  - When component or resource is modified from inspector
 - Record all portions where objects & components get modified so I can mark them dirty, will likely need
    to use those some points for undo/redo

 Test (likely later once I have more editor functionality working):
  - Game object handle compare
  - ID restore systems 
  - Native+Managed diff (only the link between the two)

Code quality improvements:
 - Modify BinarySerializer so that _encodeIntermediate outputs intermediate format directly without a full on encode
 - Consider making ManagedSerializable* array/list/dictionary method/field references static (right now each instance has its own instance
   but they're identical)

----------------------------------------------------------------------
Polish

Ribek use:
 - Hook up color picker to guicolor field
 - When drop down opens in a list box that is horizontally scrolled is opens are what feels like an incorrect offset
 - When hiding a component in inspector, it doesn't immediately reposition the components below it
 - Having en empty component in inspector shows a small empty background, it shouldn't show anything
 - Component inspectors for: Camera, Renderable, Point/Spot/Directional lights
 - Resource inspectors for: Material, Texture, Mesh, Font, Shader, Script Code, Plain Text, Sprite Texture, GUISkin, StringTable, Prefab (just something basic for now)
 - Test release mode
 - Order top-level menu entries according to priority and set valid priorities
 - Add temporary icon textures too all icon buttons currently containing only text so that Ribek can modify them
  - Also add dummy icons to toolbar (New Project, Open Project, Save Scene, Undo, Redo, Basic shapes, Camera, Renderable, Lights)

Other polish:
 - C# interface for Font and SpriteTexture
 - Add menu items:
  - Edit: Cut/Copy/Paste/Duplicate/Delete(need to make sure it works in Hierarchy, with shortcuts), View/Move/rotate/scale
  - Game Object (also add to context): Create(Empty, Empty Child, Camera, Renderable, Point/Spot/Directional Light), Apply prefab, Break prefab, Revert prefab
 - When I expand inspector elements and them come back to that object it should remember the previous state
   - Add a chaching mechanism to inspector (likely based on instance ID & property names)
   - This has to work not only when I come back to the object, but whenever inspector rebuilds (e.g. after removing element from array)
   - Consider saving this information with the serialized object
 - Need a proper way to detect when the scene was modified (and display it somewhere)

Stage 2 polish:
 - Prefabs
 - Game window
 - Game play/pause/step (+ save/restore objects on play/pause switch) (+ toolbar and menu play/pause/step entries)
 - Resource hotswap
 - C# script compiling in editor
 - VS integration
 - When managed exception happens log an error and continue execution
  - Doing a pass over all methods referencing Internal_ methods ensuring they do proper checking on C# side would be good
 - Game publishing (Build window, collect resources, output exe, default viewport) (described below)
 - Splash screen
 - Settings/Preferences window (+ menu entry)
 - Console window
 - About box - license info and other general info (+ menu entry)

Optional:
 - When starting drag from hierarchy tree view it tends to select another object (can't repro)
 - Handle seems to lag behind the selected mesh
 - When resizing library window while docked, selection area appears
 - Move all the code files into subfolders so their hierarchy is similar to VS filters
 - GUI tabbing to switch between elements
 - Better Prefab inspector - display SceneObject inspector of top-level object, and possibly prefab hierarchy?
 - GUI element that shows a multi-select drop down + an editor for Layers used in Camera and Renderable
 - Undo/Redo
  - CmdRecordSO records an SO and all its children but it should only record a single SO
  - CmdRecordSO should instead of recording the entire object record a diff
  - There should be a CmdRecordSO equivalent for resources (probably)
  - Add commands for breaking or reverting a scene object 
  - Test & finalize undo/redo system
  - Add Undo/Redo menu and toolbar entries to "Edit" menu
 - Add Range[] attribute to C# that forces a float/int to be displayed as a slider
 - Add "focus on object" key (F) - animate it: rotate camera towards then speed towards while zooming in (+ menu entry)
 - Ortographic camera views (+ gizmo in scene view corner that shows camera orientation)
 - Drag to select in scene view
 - MenuBar - will likely need a way to mark elements as disabled when not appropriate (e.g. no "frame selected unless scene is focused")
   - Likely use a user-provided callback to trigger when populating the menus (I already added a callback to MenuItem, just need to implement it)
 - Need to list all script components in the Components menu

Finalizing:
 - Add copyright notices in all files & change license to GPL
 - Documentation
 - Need to generate a proper merge of dev and preview branches
   - Use "git revert --no-commit <COMMITID>..HEAD" to reverse anything on the preview branch that was done after the branch creation, then merge
----------------------------------------------------------------------
Build system
 - Test Resources (if loading works and if they're properly packaged in build)
 - The final build procedure for the game should be:
   - Copy all the prebuilt binaries (Banshee libraries, Banshee assemblies, 3rd party libraries and prebuilt executable) from Editor install folder to output folder
    - Which set of binaries is used depends on selected platform (e.g. win/mac/linux or 32/64bit)
   - Recompile script assemblies if needed and copy them from project Internal folder to output folder
   - Copy the Builtin resources for engine from Editor install folder to output folder
   - Copy all the resources marked with the flag mentioned above to \Data subfolder in the output folder, preserving the same asset structure
   - Make sure to go over texture resources and ensure they are saved in the valid format
     as we don't want to do format conversion at runtime (Not cruical, but it should be done eventually)
     - This should something similar to Unity where when changing the platform all resources get reimported
   - Make sure to clear all prefab diffs (possibly store them elsewhere in the first place)
	 - And all prefab instances should have updateFromPrefab called on them.

----------------------------------------------------------------------
Other

There is a memory corruption happening. Haven't determined where exactly but it's possible it has something
to do with the opening of ColorPicker window. One time I got a heap read after delete error caused by GUIManager
attempting to allocate a new transient mesh, and another time I got a hang when inserting a script object into a std::set.

/*********************************************************************/
/************************ LESS IMPORTANT *****************************/
/*********************************************************************/

----------------------------------------------------------------------
Mono notes

I can get mono errors by checking g_print calls in goutput.c
 - Calling thunks incorrectly can cause those weird errors with no real callstack

Running embedded mono with VS attached causes managed null refs to be registered as access violations

There seems to be a bug in Mono when passing complex structs from C# to C++. e.g. passing Rect3 as a parameter
will corrupt the parameter after it, even if layout and size is exact as the C++ version. 
Rect3 has child structs (Vector3) which could be the reason. Be aware of other similar problems.

Mono cannot marshal structures? Taken from their documentation:
 Internal calls do not provide support for marshalling structures. This means that any API calls that take a structure 
 (excluding the system types like int32, int64, etc) must be passed as a pointer, in C# this means passing the value as a "ref" or "out" parameter.

Mono has problems with returning a struct from an internal C++ method. Returned value might end up being corrupted. It works weirdly as
I am able (for example) return a Rect2 with no problems, but it doesn't work when returning a Degree struct. Returning the value as input
parameter solves the problem (presumably boxing the return value would also work).

Sometimes exceptions cause a crash in Event, although this is due to an exception triggering a dialog box which triggers
the message loop and causes another exception. Make sure to look for the original exception.

----------------------------------------------------------------------
MenuItem

 - Add keyboard controls to GUIMenuBar (left/right arrows should move between entries if user is not browsing a sub-menu)
  - esc should cancel out of the menu bar
  - alt should focus the menu bar

----------------------------------------------------------------------
VisualStudio integration

 - VS integration will likely not work with VSExpress or Community edition
  - VSExpress doesn't support EnvDTE so the only option is to open it using a shell command which doesn't seem to offer precise parameters
  - Community edition should work similarily to Pro, but might have a different executable and/or registry paths
 - Make sure that 3rd party assemblies can be imported in the project, and that they are properly referenced in VS project generation and compilation

----------------------------------------------------------------------
Script compilation

 - I need to hook up script compilation with assembly refresh, and the build system.
   - e.g. when recompiling inside the editor it should automatically start compiling when changes are detected,
     show some kind of visual indicator and refresh assemblies when its done. When publishing it should recompile
	 assemblies for release. Also hook up console to compiler output?

----------------------------------------------------------------------
Library window

 - Might need to improve search (need to test). Do multiple search keywords work properly?
 - Consider delaying search until user stops pressing keys (so not to have thousands of search results in the initial stages)
 - Save & restore scroll position when Refresh happens

----------------------------------------------------------------------
Handles

 - Ideally free scale handle indicator should always render and be interactable and never be hidden by axis scale indicators (Not high priority)
 - Raycast snapping Ribek suggested

----------------------------------------------------------------------
Include files:

 - Test if default values work
 - Test project library dependant resources (e.g. changing an include and seeing if shader is reimported)

----------------------------------------------------------------------
Scene View

Test:
 - Custom handles from C#
 - Handle snapping
 - Multi-select Move/Rotate/scale