lazarus-ccr/components/nvidia-widgets/src/glut/nvglutwidgets.pas
blaszijk 9769ec83c5 reorganized library sources to be more logical
updated project paths for examples

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2236 8e941d3f-bd1b-0410-a28a-d453659cc2b4
2012-01-06 20:32:26 +00:00

224 lines
5.1 KiB
ObjectPascal
Executable File

//
// nvGlutWidgets
//
// Adaptor classes to integrate the nvWidgets UI library with the GLUT windowing
// toolkit. The adaptors convert native GLUT UI data to native nvWidgets data. All
// adaptor classes are implemented as in-line code in this header. The adaptor
// defaults to using the standard OpenGL painter implementation.
//
// Author: Ignacio Castano, Samuel Gateau, Evan Hart
// Email: sdkfeedback@nvidia.com
//
// Copyright (c) NVIDIA Corporation. All rights reserved.
////////////////////////////////////////////////////////////////////////////////////////////////////
unit nvGlutWidgets;
{$mode objfpc}{$H+}
interface
uses
SysUtils, nvWidgets;
type
{ GlutUIContext }
GlutUIContext = class(UIContext)
public
//
// Default UI constructor
//
// Creates private OpenGL painter
//////////////////////////////////////////////////////////////////
constructor Create;
//
// Alternate UI constructor
//
// Allows for overriding the standard painter
//////////////////////////////////////////////////////////////////
constructor Create(painter: UIPainter);
//
// UI destructor
//
// Destroy painter if it is private
//////////////////////////////////////////////////////////////////
destructor Destroy; override;
//
// One time initialization
//
//////////////////////////////////////////////////////////////////
function init(w, h: integer): boolean;
//
// UI method for processing GLUT mouse button events
//
// Call this method from the glutMouseFunc callback, the
// modifier parameter maps to glutGetModifiers.
//////////////////////////////////////////////////////////////////
procedure mouse(button, state, modifier, x, y: integer);
procedure mouse(button, state, x, y: integer);
//
// UI method for processing key events
//
// Call this method from the glutReshapeFunc callback
//////////////////////////////////////////////////////////////////
procedure specialKeyboard(k, x, y: integer);
private
m_ownPainter: boolean;
//
// Translate non-ascii keys from GLUT to nvWidgets
//////////////////////////////////////////////////////////////////
function translateKey(k: integer): byte;
end;
implementation
uses
GLut, GLext, nvGLWidgets;
{ GlutUIContext }
constructor GlutUIContext.Create;
begin
inherited Create(GLUIPainter.Create);
m_ownPainter := True;
end;
constructor GlutUIContext.Create(painter: UIPainter);
begin
inherited Create(painter);
m_ownPainter := False;
end;
destructor GlutUIContext.Destroy;
var
painter: UIPainter;
begin
if m_ownPainter then
begin
painter := getPainter;
FreeAndNil(painter);
end;
inherited;
end;
function GlutUIContext.init(w, h: integer): boolean;
begin
Result := False;
if not Load_GL_version_2_0 then
begin
writeln('OpenGL version 2.0 not loaded properly');
exit;
end;
if not glext_ExtensionSupported('GL_ARB_vertex_program', '') or
not glext_ExtensionSupported('GL_ARB_fragment_program', '') then
exit;
reshape(w, h);
Result := True;
end;
procedure GlutUIContext.mouse(button, state, modifier, x, y: integer);
var
modifierMask: integer = 0;
begin
if button = GLUT_LEFT_BUTTON then
button := MouseButton_Left
else
if button = GLUT_MIDDLE_BUTTON then
button := MouseButton_Middle
else
if button = GLUT_RIGHT_BUTTON then
button := MouseButton_Right;
if (modifier and GLUT_ACTIVE_ALT) = GLUT_ACTIVE_ALT then
modifierMask := modifierMask or (ButtonFlags_Alt);
if (modifier and GLUT_ACTIVE_SHIFT) = GLUT_ACTIVE_SHIFT then
modifierMask := modifierMask or (ButtonFlags_Shift);
if (modifier and GLUT_ACTIVE_CTRL) = GLUT_ACTIVE_CTRL then
modifierMask := modifierMask or (ButtonFlags_Ctrl);
if state = GLUT_DOWN then
state := 1
else
state := 0;
inherited mouse(button, state, modifierMask, x, y);
end;
procedure GlutUIContext.mouse(button, state, x, y: integer);
begin
mouse(button, state, glutGetModifiers(), x, y);
end;
procedure GlutUIContext.specialKeyboard(k, x, y: integer);
begin
inherited keyboard(translateKey(k), x, y);
end;
function GlutUIContext.translateKey(k: integer): byte;
begin
case k of
GLUT_KEY_F1:
Result := Key_F1;
GLUT_KEY_F2:
Result := Key_F2;
GLUT_KEY_F3:
Result := Key_F3;
GLUT_KEY_F4:
Result := Key_F4;
GLUT_KEY_F5:
Result := Key_F5;
GLUT_KEY_F6:
Result := Key_F6;
GLUT_KEY_F7:
Result := Key_F7;
GLUT_KEY_F8:
Result := Key_F8;
GLUT_KEY_F9:
Result := Key_F9;
GLUT_KEY_F10:
Result := Key_F10;
GLUT_KEY_F11:
Result := Key_F11;
GLUT_KEY_F12:
Result := Key_F12;
GLUT_KEY_LEFT:
Result := Key_Left;
GLUT_KEY_UP:
Result := Key_Up;
GLUT_KEY_RIGHT:
Result := Key_Right;
GLUT_KEY_DOWN:
Result := Key_Down;
GLUT_KEY_PAGE_UP:
Result := Key_PageUp;
GLUT_KEY_PAGE_DOWN:
Result := Key_PageDown;
GLUT_KEY_HOME:
Result := Key_Home;
GLUT_KEY_END:
Result := Key_End;
GLUT_KEY_INSERT:
Result := Key_Insert;
else
Result := 0;
end;
end;
end.