/*============================================================================= Project: SharpImage Module: siOpenGlRendererForm.cs Language: C# Author: Dan Mueller Date: $Date: 2007-07-06 10:57:00 +1000 (Fri, 06 Jul 2007) $ Revision: $Revision: 2 $ Copyright (c) Queensland University of Technology (QUT) 2007. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notices for more information. =============================================================================*/ using System; using System.Diagnostics; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Tao.OpenGl; using Tao.FreeGlut; using Tao.Platform.Windows; namespace SharpImage.Rendering { public partial class siOpenGlRendererForm : siRendererForm { bool HasSetSizeFirstTime = false; bool SuppressResizeEvent = false; /// /// Default constructor. /// public siOpenGlRendererForm() : base(new SimpleOpenGlControl()) { // Call the designer code InitializeComponent(); } /// /// Deconstructor. /// ~siOpenGlRendererForm() { if (this.RenderingControl != null) { (this.RenderingControl as SimpleOpenGlControl).DestroyContexts(); (this.RenderingControl as SimpleOpenGlControl).Dispose(); this.RenderingControl = null; } } /// /// Force the Control to repaint. /// public override void Repaint() { if (this.Renderer != null) { this.Renderer.RaiseModified(); (this.RenderingControl as SimpleOpenGlControl).Invalidate(); (this.RenderingControl as SimpleOpenGlControl).Refresh(); //(this.RenderingControl as SimpleOpenGlControl).SwapBuffers(); } } /// /// Initialise the RendererForm. /// public override void Initialise(siRenderer renderer) { base.Initialise(renderer); (this.RenderingControl as SimpleOpenGlControl).AutoCheckErrors = false; (this.RenderingControl as SimpleOpenGlControl).AutoFinish = false; (this.RenderingControl as SimpleOpenGlControl).AutoMakeCurrent = true; (this.RenderingControl as SimpleOpenGlControl).AutoSwapBuffers = true; (this.RenderingControl as SimpleOpenGlControl).AccumBits = ((System.Byte)(0)); (this.RenderingControl as SimpleOpenGlControl).ColorBits = ((System.Byte)(32)); (this.RenderingControl as SimpleOpenGlControl).DepthBits = ((System.Byte)(16)); (this.RenderingControl as SimpleOpenGlControl).StencilBits = ((System.Byte)(0)); (this.RenderingControl as SimpleOpenGlControl).InitializeContexts(); this.Renderer.RaiseModified(); } /// /// Get/set the size of the renderable area. /// public override Size ViewportSize { get { return base.ViewportSize; } set { this.SuppressResizeEvent = true; base.ViewportSize = value; this.HasSetSizeFirstTime = false; this.SuppressResizeEvent = false; this.ForceResize(); } } protected override void OnResize(EventArgs e) { // Check if the resize event is allowed if (this.SuppressResizeEvent) return; // Run the base base.OnResize(e); // Check we have been initialised if (!this.IsInitialised) return; if (!this.HasSetSizeFirstTime) { // Set window width/height values for the first time this.Renderer.Metadata["RenderingControlWidth"] = this.RenderingControl.ClientSize.Width; this.Renderer.Metadata["RenderingControlHeight"] = this.RenderingControl.ClientSize.Height; this.HasSetSizeFirstTime = true; } if (!this.Renderer.ContainsMetadata("FrustrumLeft", "FrustrumRight", "FrustrumBottom", "FrustrumTop", "FrustrumFront", "FrustrumBack", "RenderingControlWidth", "RenderingControlHeight")) { return; } // Change Viewport Gl.glViewport(0, 0, this.RenderingControl.ClientSize.Width, this.RenderingControl.ClientSize.Height); // Change Frustum Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glLoadIdentity(); double frustrumLeft = (double)this.Renderer.Metadata["FrustrumLeft"]; double frustrumRight = (double)this.Renderer.Metadata["FrustrumRight"]; double frustrumBottom = (double)this.Renderer.Metadata["FrustrumBottom"]; double frustrumTop = (double)this.Renderer.Metadata["FrustrumTop"]; frustrumLeft *= (double)this.RenderingControl.ClientSize.Width / (double)(int)this.Renderer.Metadata["RenderingControlWidth"]; frustrumRight *= (double)this.RenderingControl.ClientSize.Width / (double)(int)this.Renderer.Metadata["RenderingControlWidth"]; frustrumBottom *= (double)this.RenderingControl.ClientSize.Height / (double)(int)this.Renderer.Metadata["RenderingControlHeight"]; frustrumTop *= (double)this.RenderingControl.ClientSize.Height / (double)(int)this.Renderer.Metadata["RenderingControlHeight"]; // HACK: We currently assume the type of renderer is siVolumeRenderer // TODO: TOFIX: Get rid of the metadata stuff, add a concrete hierarchy siVolumeRenderer renderer = this.Renderer as siVolumeRenderer; renderer.Properties.FrustrumLeft = frustrumLeft; renderer.Properties.FrustrumRight = frustrumRight; renderer.Properties.FrustrumBottom = frustrumBottom; renderer.Properties.FrustrumTop = frustrumTop; Gl.glFrustum(renderer.Properties.FrustrumLeft, renderer.Properties.FrustrumRight, renderer.Properties.FrustrumBottom, renderer.Properties.FrustrumTop, renderer.Properties.FrustrumFront, renderer.Properties.FrustrumBack); Gl.glMatrixMode(Gl.GL_MODELVIEW); // Set new width/height values this.Renderer.Metadata["RenderingControlWidth"] = this.RenderingControl.ClientSize.Width; this.Renderer.Metadata["RenderingControlHeight"] = this.RenderingControl.ClientSize.Height; // Force a repaint this.Repaint(); } } }