2019-02-14 07:04:30 +01:00
using System ;
using System.Windows.Forms ;
using System.Windows ;
using SharpGL.Enumerations ;
using SharpGL.Version ;
using SharpGL ;
using System.ComponentModel ;
using Graphics ;
using Graphics.Objects ;
using System.Numerics ;
using System.Drawing ;
namespace JuicyGraphics {
class canvas : Control , ISupportInitialize {
OpenGL GL = new OpenGL ( ) ;
renderCam rc ;
public canvas ( ) {
SetStyle ( ControlStyles . AllPaintingInWmPaint , true ) ;
SetStyle ( ControlStyles . UserPaint , true ) ;
InitializeOpenGL ( ) ;
rc = new renderCam ( GL , this ) ;
}
void InitializeOpenGL ( ) {
GL . Create ( OpenGLVersion . OpenGL4_3 , RenderContextType . NativeWindow , Width , Height , 32 , this . Handle ) ;
GL . ShadeModel ( OpenGL . GL_SMOOTH ) ;
GL . ClearDepth ( 1.0f ) ;
GL . Enable ( OpenGL . GL_DEPTH_TEST ) ;
GL . DepthFunc ( OpenGL . GL_LEQUAL ) ;
GL . Hint ( OpenGL . GL_PERSPECTIVE_CORRECTION_HINT , OpenGL . GL_NICEST ) ;
GL . Viewport ( 0 , 0 , Width , Height ) ;
}
bool renderingForDesigner ( ) {
if ( this = = null )
return false ;
if ( LicenseManager . UsageMode = = LicenseUsageMode . Designtime )
return true ;
Control p = this . Parent ;
while ( p ! = null ) {
if ( p . GetType ( ) . FullName . Contains ( ".DesignerFrame" ) )
return true ;
p = p . Parent ;
}
return false ;
}
protected override void OnPaintBackground ( PaintEventArgs e ) {
if ( renderingForDesigner ( ) ) { base . OnPaintBackground ( e ) ; }
return ;
}
protected override void OnPaint ( PaintEventArgs e ) {
if ( renderingForDesigner ( ) ) {
SetStyle ( ControlStyles . AllPaintingInWmPaint , true ) ;
SetStyle ( ControlStyles . UserPaint , true ) ;
InitializeOpenGL ( ) ;
}
GL . LoadIdentity ( ) ;
GL . Ortho ( - ( Width / 2160.0 ) , Width / 2160.0 ,
- ( Height / 2160.0 ) , Height / 2160.0 ,
- 1 , 1 ) ;
if ( rc ! = null )
rc . attacheMatrix ( ) ;
GL . MakeCurrent ( ) ;
GL . ClearColor ( 0.3f , 0.35f , 0.7f , 1f ) ;
GL . Clear ( OpenGL . GL_COLOR_BUFFER_BIT | OpenGL . GL_DEPTH_BUFFER_BIT ) ;
GL . Begin ( BeginMode . Triangles ) ;
GL . Color ( 0.9 , 0.83 , 0.1 ) ;
GL . Vertex ( 1.0 , 1.0 ) ;
GL . Vertex ( - 1.0 , - 1.0 ) ;
GL . Vertex ( - 1.0 , 1.0 ) ;
GL . Color ( 0 , 0 , 0 ) ;
line testLine = new line ( new Vector2 ( - 0.4f , 0.4f ) , new Vector2 ( 0.4f , - 0.4f ) ) ;
testLine . render ( rc ) ;
GL . End ( ) ;
GL . Flush ( ) ;
var handleDeviceContext = e . Graphics . GetHdc ( ) ;
GL . Blit ( handleDeviceContext ) ;
e . Graphics . ReleaseHdc ( handleDeviceContext ) ;
}
protected override void OnSizeChanged ( EventArgs e ) {
if ( GL . RenderContextProvider = = null )
return ;
GL . SetDimensions ( Width , Height ) ;
GL . Viewport ( 0 , 0 , Width , Height ) ;
Invalidate ( ) ;
}
enum mouseInteractionMode { none , left , middle , right } ;
mouseInteractionMode pressedMouseButton = mouseInteractionMode . none ;
Point prevMousePosition = Point . Empty ;
protected override void OnMouseDown ( MouseEventArgs e ) {
switch ( e . Button ) {
case MouseButtons . Left :
pressedMouseButton = mouseInteractionMode . left ;
break ;
case MouseButtons . Middle :
pressedMouseButton = mouseInteractionMode . middle ;
break ;
case MouseButtons . Right :
pressedMouseButton = mouseInteractionMode . right ;
break ;
}
prevMousePosition = MousePosition ;
2019-02-14 15:46:16 +01:00
this . Focus ( ) ;
2019-02-14 07:04:30 +01:00
}
protected override void OnMouseMove ( MouseEventArgs e ) {
switch ( pressedMouseButton ) {
case mouseInteractionMode . left :
break ;
case mouseInteractionMode . middle :
rc . translation + = new Vector2 ( MousePosition . X - prevMousePosition . X ,
prevMousePosition . Y - MousePosition . Y ) / 1080.0f ;
Invalidate ( ) ;
break ;
case mouseInteractionMode . right :
break ;
}
prevMousePosition = MousePosition ;
}
protected override void OnMouseUp ( MouseEventArgs e ) {
switch ( e . Button ) {
case MouseButtons . Left :
if ( pressedMouseButton = = mouseInteractionMode . left )
pressedMouseButton = mouseInteractionMode . none ;
break ;
case MouseButtons . Middle :
if ( pressedMouseButton = = mouseInteractionMode . middle )
pressedMouseButton = mouseInteractionMode . none ;
break ;
case MouseButtons . Right :
if ( pressedMouseButton = = mouseInteractionMode . right )
pressedMouseButton = mouseInteractionMode . none ;
break ;
}
}
2019-02-14 15:46:16 +01:00
Control prevFocused = null ;
protected override void OnMouseEnter ( EventArgs e ) {
prevFocused = Form . ActiveForm . ActiveControl ;
this . Focus ( ) ;
}
protected override void OnMouseLeave ( EventArgs e ) {
prevFocused . Focus ( ) ;
}
2019-02-14 07:04:30 +01:00
protected override void OnMouseWheel ( MouseEventArgs e ) {
2019-02-14 15:46:16 +01:00
Form . ActiveForm . Text = e . Delta . ToString ( ) ;
2019-02-14 07:04:30 +01:00
rc . scale * = Math . Pow ( 1.0008 , e . Delta ) ;
Invalidate ( ) ;
}
public void BeginInit ( ) { }
public void EndInit ( ) {
InitializeOpenGL ( ) ;
OnSizeChanged ( null ) ;
}
}
}