/// <summary>
        /// Setup constructor
        /// </summary>
        /// <param name="mainRenderingThread">Main rendering thread</param>
        /// <param name="mainRenderingThreadMarshaller">Marshaller for the main rendering thread</param>
        public RendererBase( Thread mainRenderingThread, DelegateMarshaller mainRenderingThreadMarshaller )
        {
            Arguments.CheckNotNull( mainRenderingThread, "mainRenderingThread" );
            Arguments.CheckNotNull( mainRenderingThreadMarshaller, "mainRenderingThreadMarshaller" );

            m_MainRenderingThread = mainRenderingThread;
            m_MainRenderingThreadMarshaller = mainRenderingThreadMarshaller;
        }
        /// <summary>
        /// Setup constructor
        /// </summary>
        /// <param name="uiProvider">UI provider. If null, no error messages are shown to the user</param>
        /// <param name="view">View to control</param>
        /// <param name="model">Animation model</param>
        /// <param name="workQueue">Work queue</param>
        public WaveAnimatorController( IMessageUiProvider uiProvider, IWaveAnimatorView view, WaveAnimationParameters model, IWorkItemQueue workQueue )
        {
            Arguments.CheckNotNull( view, "view" );
            Arguments.CheckNotNull( model, "model" );
            Arguments.CheckNotNull( workQueue, "workQueue" );

            view.Model = model;
            view.GenerateAnimation += OnGenerateAnimation;

            m_View = view;
            m_WorkQueue = workQueue;
            m_Marshaller = new DelegateMarshaller( );
            m_UiProvider = uiProvider;
        }
 /// <summary>
 /// Sets up the renderer
 /// </summary>
 /// <param name="mainRenderingThread">Main rendering thread</param>
 /// <param name="mainRenderingThreadMarshaller">Marshaller for the main rendering thread</param>
 /// <remarks>
 /// OpenGL works within a single thread, and any resources (textures, display lists,...) must
 /// be created and destroyed on the same thread.
 ///  </remarks>
 public OpenGlRenderer( Thread mainRenderingThread, DelegateMarshaller mainRenderingThreadMarshaller )
     : base(mainRenderingThread, mainRenderingThreadMarshaller)
 {
     for ( int stackIndex = 0; stackIndex < m_LocalToWorldModifierStack.Length; ++stackIndex )
     {
         m_LocalToWorldModifierStack[ stackIndex ] = InvariantMatrix44.Identity;
     }
     for ( int stackIndex = 0; stackIndex < m_WorldToViewModifierStack.Length; ++stackIndex )
     {
         m_WorldToViewModifierStack[ stackIndex ] = InvariantMatrix44.Identity;
     }
     for ( int stackIndex = 0; stackIndex < m_LocalToWorldStack.Length; ++stackIndex )
     {
         m_LocalToWorldStack[ stackIndex ] = new Matrix44( );
     }
     for ( int stackIndex = 0; stackIndex < m_WorldToViewStack.Length; ++stackIndex )
     {
         m_WorldToViewStack[ stackIndex ] = new Matrix44( );
     }
 }