Camelot use case:
 Application::startUp("RenderSystem", "RenderManager") <- Initializes all modules. Provide Reference render system and render manager (Maybe directly provide .dll name here)
 RenderWindow* window = new RenderWindow(width, height, /*etc*/); <- Automatically registers with Application
 

 GameObject cameraObj = new GameObject("MainCamera"); // Automatically registers with SceneManager
 Camera* newCamera = new Camera(cameraObj, renderTarget (i.e. window), Rect area, aspect, FOV, iso/proj, /*etc*/); // Component
 
 Application::renderLoop();


 Application::shutDown()

------------------------------------------

 Application::renderLoop INTERNALS: // TODO - Most of this should be a part of a RenderManager, so we can employ better rendering 

techniques like deferred and forward rendering, transparently
  Query scene manager and get all cameras
  Sort cameras based on render targets
  For each render target
  Render cameras one by one
    - Each camera queries scene manager for all visible entities // Scene manager employs spatial partitioning and frustum culling to 

speed up the search
    - Objects are sorted according to a render queue
    - And sent to the render system one by one
      - Set object pass
      - Set object vertex/index buffer
      - Render
  Swap frame buffers if needed

--------------------------------------------

 Create shader simply by just providing source and setting parameters. No additional calls to createParameters and such shit.

--------------------------------------------

 Loading of mesh/texture/material should be a simple Resource.Load. Returns a ResourcePtr which is a managed ptr to resource. Resource 

holds a pointer to its source, and it can be in a loaded or unloaded state. If we try to use an unloaded resource, a dummy resource is 

provided.

--------------------------------------------

 IMPORTANT: Develop scene manager and rest of things mentioned here in CamelotRenderer project, and then port it all together to 
