/*=============================================================================
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();
}
}
}