/// <summary> /// Renders this object /// </summary> /// <param name="context">Rendering context</param> public void Render( IRenderContext context ) { ICamera3 camera = Graphics.Renderer.Camera as ICamera3; if ( camera == null ) { throw new InvalidOperationException( "Expected ICamera3 to be attached to renderer" ); } ReflectionsRenderContext reflectionsContext = new ReflectionsRenderContext( context, m_Reflections ); RenderPlanarReflections( reflectionsContext, camera ); // Render the scene as usual reflectionsContext.RenderingReflections = false; RenderSceneObjects( reflectionsContext ); }
/// <summary> /// Renders reflections on the first <see cref="ReflectionPlane"/> found in the scene /// </summary> private void RenderPlanarReflections( ReflectionsRenderContext reflectionsContext, ICamera3 camera ) { ReflectionPlane plane = ReflectionPlane; if ( plane == null ) { return; } // Matrix44 reflectionMatrix = Matrix44.MakeReflectionMatrix( new Point3( 0, -10, 0 ), new Vector3( 0, 1, 0 ) ); Matrix44 reflectionMatrix = plane.CreateReflectionMatrix( ); Matrix44 reflectedCameraMatrix = new Matrix44( camera.InverseFrame * reflectionMatrix ); // reflectedCameraMatrix.YAxis = -reflectedCameraMatrix.YAxis; // Restore handedness Graphics.Renderer.PushTransform( TransformType.WorldToView ); Graphics.Renderer.SetTransform( TransformType.WorldToView, reflectedCameraMatrix ); Graphics.Renderer.PushTransform( TransformType.ViewToScreen ); IProjectionCamera projCamera = ( IProjectionCamera )camera; Graphics.Renderer.SetPerspectiveProjectionTransform( projCamera.PerspectiveFovDegrees, 1, projCamera.PerspectiveZNear, projCamera.PerspectiveZFar ); m_ReflectionMatrixDataSource.Value = Graphics.Renderer.GetTransform( TransformType.ViewToScreen ) * reflectedCameraMatrix; // TODO: AP: Reflect camera position System.Drawing.Rectangle viewport = Graphics.Renderer.Viewport; Graphics.Renderer.SetViewport( 0, 0, m_Reflections.Width, m_Reflections.Height ); reflectionsContext.RenderingReflections = true; m_Reflections.Begin( ); Graphics.Renderer.ClearDepth( 1.0f ); Graphics.Renderer.ClearColour( Color.SteelBlue ); RenderSceneObjects( reflectionsContext ); m_Reflections.End( ); Graphics.Renderer.SetViewport( viewport.X, viewport.Y, viewport.Width, viewport.Height ); Graphics.Renderer.PopTransform( TransformType.WorldToView ); Graphics.Renderer.PopTransform( TransformType.ViewToScreen ); }