GLFW 304 wrapper 1.03 (Win/Lin/OSX x86/x64 Static/Dynamic)

Share your advanced PureBasic knowledge/code with the community.
User avatar
luis
Addict
Addict
Posts: 3893
Joined: Wed Aug 31, 2005 11:09 pm
Location: Italy

Re: GLFW 304 wrapper 1.03 (Win/Lin/OSX x86/x64 Static/Dynami

Post by luis »

You could try SDL 2.x, from the docs seems it has an event for attached/removed joystick.
You could try to wrap only the the minimal set of functions required to test that out.

http://wiki.libsdl.org/SDL_JoyDeviceEve ... yEvents%29


EDIT: I was looking at the PB joystick lib. You don't have a way to know the number of buttons or axes supported by a certain joystick ? How configure the controls in a game ?
You can't say "press a key or a joystick button for fire" and wait.
If the user press a joystick button, you don't get an event specifying the button pressed.
You don't know the number of buttons and so you can't frantically poll all of them to see if one is pressed.
So what you are supposed to do ? Put up an arbitrary top number of buttons you want to support, let's say 8 and poll for them ?
I suppose that's the only way (tested it and doesn't crash polling for a non-existing button), or ask the user how many buttons has his joystick :o
Well, ok. Knowing in advance the advertised properties of the joystick would be a lot better though.
"Have you tried turning it off and on again ?"
A little PureBasic review
Poshu
Enthusiast
Enthusiast
Posts: 459
Joined: Tue Jan 25, 2005 7:01 pm
Location: Canada

Re: GLFW 304 wrapper 1.03 (Win/Lin/OSX x86/x64 Static/Dynami

Post by Poshu »

Yup, you need to poll all the buttons, it's usually between 12 and 16 :/

Edit: I've checked SDL and it seems perfect. Will you release your wrapper?
User avatar
luis
Addict
Addict
Posts: 3893
Joined: Wed Aug 31, 2005 11:09 pm
Location: Italy

Re: GLFW 304 wrapper 1.03 (Win/Lin/OSX x86/x64 Static/Dynami

Post by luis »

I've just started it to verify the application menu problem discussed in this thread.
I could go on but if I do it will not a complete wrapper, just the parts I need (screen, keyboard, mouse) at least initially and maybe forever.

I could give you what I written but it's really some functions and a bunch of constants...
"Have you tried turning it off and on again ?"
A little PureBasic review
User avatar
luis
Addict
Addict
Posts: 3893
Joined: Wed Aug 31, 2005 11:09 pm
Location: Italy

Re: GLFW 304 wrapper 1.03 (Win/Lin/OSX x86/x64 Static/Dynami

Post by luis »

EDIT: link removed

It's just a starting point, if you'll ever complete it, it would be nice if you could share it :wink:

Tell me when you got it.

BTW: the libraries are compiled by me, I don't remember if I altered them in some way, just use them for testing and then get the official ones.
Last edited by luis on Sun Jan 19, 2014 1:03 am, edited 1 time in total.
"Have you tried turning it off and on again ?"
A little PureBasic review
Poshu
Enthusiast
Enthusiast
Posts: 459
Joined: Tue Jan 25, 2005 7:01 pm
Location: Canada

Re: GLFW 304 wrapper 1.03 (Win/Lin/OSX x86/x64 Static/Dynami

Post by Poshu »

Thanks a lot!
I doubt I will ever complete them: I've got enough to do with csfml, and I'm just looking for a complete joystick solution :p

Edit : Well, you did most of the work so I could get some of the joysticks function in quite quicky. It does work, thanks :D
User avatar
luis
Addict
Addict
Posts: 3893
Joined: Wed Aug 31, 2005 11:09 pm
Location: Italy

Re: GLFW 304 wrapper 1.03 (Win/Lin/OSX x86/x64 Static/Dynami

Post by luis »

So just to be clear you tested the hot plug on all the platforms and it works everywhere ?
Thanks
"Have you tried turning it off and on again ?"
A little PureBasic review
Poshu
Enthusiast
Enthusiast
Posts: 459
Joined: Tue Jan 25, 2005 7:01 pm
Location: Canada

Re: GLFW 304 wrapper 1.03 (Win/Lin/OSX x86/x64 Static/Dynami

Post by Poshu »

Not tested yet (I'm still toying with the fact that the tactile overlay of the ps4 controller is recognized as an pov hat...), I'll report as soon as I've tested it on multiple platform.
Poshu
Enthusiast
Enthusiast
Posts: 459
Joined: Tue Jan 25, 2005 7:01 pm
Location: Canada

Re: GLFW 304 wrapper 1.03 (Win/Lin/OSX x86/x64 Static/Dynami

Post by Poshu »

So yeah, tested it on both OSX and Windows and IT WOOOOOORKS \o/ plus it has a much better compatibility, so everything is fine but I had to recompile it to meet my needs, and I doubt I'll be able to do it on windows (unless it's really easy >.<; )
User avatar
luis
Addict
Addict
Posts: 3893
Joined: Wed Aug 31, 2005 11:09 pm
Location: Italy

Re: GLFW 304 wrapper 1.03 (Win/Lin/OSX x86/x64 Static/Dynami

Post by luis »

I've decided for option 1. Not an easy decision but with many reasons supporting it
Anyway, I'll work on a Windows only version keeping portability in mind and if in time this request will be implemented -> http://www.purebasic.fr/english/viewtop ... 82#p429182 I will be able to support the other two platforms with a lot less work, and without resorting to a third party library now, something I've decided to avoid after long consideration and much, and I mean *much* testing.
Or if any of those third party library improve enough to work in a coherent and polished way on all platforms, or at least OSX and Linux, I could plug them in later on thanks to the fact the library is structured to support this option.

And that's all for now!
"Have you tried turning it off and on again ?"
A little PureBasic review
nathan78
New User
New User
Posts: 4
Joined: Fri Feb 07, 2014 10:38 am

Re: GLFW 304 wrapper 1.03 (Win/Lin/OSX x86/x64 Static/Dynami

Post by nathan78 »

Hi i´m new here and i would ask if its possible to see an example wich use the wglgetprocadress function to load functions for opengl version upper v3.3.

Another question: what is the best way to use 2d(sprites i.e.), sound and input(keyboard, mouse, joypad) with glfw?
Works the internal pb resources?
eesau
Enthusiast
Enthusiast
Posts: 589
Joined: Fri Apr 27, 2007 12:38 pm
Location: Finland

Re: GLFW 304 wrapper 1.03 (Win/Lin/OSX x86/x64 Static/Dynami

Post by eesau »

nathan78 wrote:Another question: what is the best way to use 2d(sprites i.e.), sound and input(keyboard, mouse, joypad) with glfw?
Hi! This is a really generic question, I think you'll need to be more specific before getting an answer. I'm not sure what you're asking.
Works the internal pb resources?
Depends on the resource, you can load textures in OpenGL using PB images but that's about it.
User avatar
luis
Addict
Addict
Posts: 3893
Joined: Wed Aug 31, 2005 11:09 pm
Location: Italy

Re: GLFW 304 wrapper 1.03 (Win/Lin/OSX x86/x64 Static/Dynami

Post by luis »

nathan78 wrote: way to use 2d(sprites i.e.)
you can't use the PB commands obviously, you need to build them for yourself, glfw is not a complete solution, it's just a wrapper for the bare minimum required to start using opengl without having to interface yourself with the os.
It provides a window, a context, keyboard, mouse and now joysticks.
nathan78 wrote: sound
You can use PB sound commands.
nathan78 wrote: and input(keyboard, mouse, joypad) with glfw?
Those are present in glfw.

For the other question, that is a generic opengl question. Just refer to the glfw docs to see how to request the appropriate GL context (legacy compatible or 3.0 or greater only) and then get the list of extensions strings, check if the one you want is available, define a prototype for it in PB and then get its address with the appropriate glfw command.
google "use extensions with opengl".

BTW: what you mentioned is a "wiggle" function, for windows only. glfw offers the equivalent and crossplatform glfwGetProcAddress()

I've just remembered I used a couple of extensions in this old (2007) code -> http://www.purebasic.fr/english/viewtop ... 14&t=28835, maybe you can look at that. It's a little messy but you can see how to use prototypes and wglGetProcAddress().

OK, it's a lot messy.
"Have you tried turning it off and on again ?"
A little PureBasic review
nathan78
New User
New User
Posts: 4
Joined: Fri Feb 07, 2014 10:38 am

Re: GLFW 304 wrapper 1.03 (Win/Lin/OSX x86/x64 Static/Dynami

Post by nathan78 »

Okay thank you.Thats all very helpful.

I know that the context is depend from version of opengl and os.

I´m asking about the syntax of such context creation.
Maybe i´m dumb but is there any parameter like " set compatibility-mode"
Or is it handmade that i use only 3.3 functions i.e.

I don´t understand in wich way this works.


Sprites i can make with a textured plane with alpha?!?or not?
Animation could be a problem...maybe uv moving.
User avatar
luis
Addict
Addict
Posts: 3893
Joined: Wed Aug 31, 2005 11:09 pm
Location: Italy

Re: GLFW 304 wrapper 1.03 (Win/Lin/OSX x86/x64 Static/Dynami

Post by luis »

You have to specify hints before creating the window

http://www.glfw.org/docs/latest/window. ... ndow_hints

I've not tested it with glfw, but usually you request 1 for the major version (GLFW_CONTEXT_VERSION_MAJOR) and 0 for the minor (GLFW_CONTEXT_VERSION_MINOR).
This should create a context potentially >= 3.0 but backward compatible with opengl 1.0, depending on the driver.
Maybe it's also required to hint for GLFW_OPENGL_PROFILE = GLFW_OPENGL_COMPAT_PROFILE, I'm not sure, you have to try.

To get a context not legacy compatible (deprecating all the immediate mode stuff and losing compatibility with older drivers), I suppose you have to hint GLFW_OPENGL_PROFILE = GLFW_OPENGL_CORE_PROFILE and set the major/minor version to 3.3.

Sprites ? A textured quad to start with, yes probably with alpha. And then your ingenuity is the limit :wink:
"Have you tried turning it off and on again ?"
A little PureBasic review
benmalartre
User
User
Posts: 27
Joined: Thu Mar 14, 2013 11:24 am
Location: paris
Contact:

Re: GLFW 304 wrapper 1.03 (Win/Lin/OSX x86/x64 Static/Dynami

Post by benmalartre »

Hello,
I encouter linker problems when importing GLFW3 static lib since PB5.4 on linux(ubuntu)
Anyone having the same problem?

Code: Select all

; /************************************************************************
;  * GLFW - An OpenGL framework
;  * API version: 3.0
;  * WWW:         http://www.glfw.org/
;  *------------------------------------------------------------------------
;  * Copyright (c) 2002-2006 Marcus Geelnard
;  * Copyright (c) 2006-2010 Camilla Berglund
;  *
;  * This software is provided 'as-is', without any express Or implied
;  * warranty. In no event will the authors be held liable For any damages
;  * arising from the use of this software.
;  *
;  * Permission is granted To anyone To use this software For any purpose,
;  * including commercial applications, And To alter it And redistribute it
;  * freely, subject To the following restrictions:
;  *
;  * 1. The origin of this software must Not be misrepresented; you must not
;  *    claim that you wrote the original software. If you use this software
;  *    in a product, an acknowledgment in the product documentation would
;  *    be appreciated but is Not required.
;  *
;  * 2. Altered source versions must be plainly marked As such, And must Not
;  *    be misrepresented As being the original software.
;  *
;  * 3. This notice may Not be removed Or altered from any source
;  *    distribution.
;  *
;  *************************************************************************/
XIncludeFile "OpenGL.pbi"

DeclareModule GLFW
  UseModule OpenGL
  #USE_GLFW = #True
  ; /*************************************************************************
  ;  * GLFW version 
  ;  *************************************************************************/
  
  #GLFW_VERSION_MAJOR  =  3
  #GLFW_VERSION_MINOR =   0
  #GLFW_VERSION_REVISION= 0
  
  
  ; /*************************************************************************
  ;  * Input handling definitions
  ;  *************************************************************************/
  
  ;/* Key And button state/action definitions */
  #GLFW_RELEASE =  0
  #GLFW_PRESS  =  1
  #GLFW_REPEAT = 2
  
  ;/* The unknown key */
  #GLFW_KEY_UNKNOWN           = -1
  
  ;/* Printable keys */
  #GLFW_KEY_SPACE             = 32
  #GLFW_KEY_APOSTROPHE        = 39  ;/* ' */
  #GLFW_KEY_COMMA             = 44  ;/* , */
  #GLFW_KEY_MINUS             = 45  ;/* - */
  #GLFW_KEY_PERIOD            = 46  ;/* . */
  #GLFW_KEY_SLASH             = 47  ;/* / */
  #GLFW_KEY_0                 = 48
  #GLFW_KEY_1                 = 49
  #GLFW_KEY_2                 = 50
  #GLFW_KEY_3                 = 51
  #GLFW_KEY_4                 = 52
  #GLFW_KEY_5                 = 53
  #GLFW_KEY_6                 = 54
  #GLFW_KEY_7                 = 55
  #GLFW_KEY_8                 = 56
  #GLFW_KEY_9                 = 57
  #GLFW_KEY_SEMICOLON         = 59  ;/*  */
  #GLFW_KEY_EQUAL             = 61  ;/* = */
  #GLFW_KEY_A                 = 65
  #GLFW_KEY_B                 = 66
  #GLFW_KEY_C                 = 67
  #GLFW_KEY_D                 = 68
  #GLFW_KEY_E                 = 69
  #GLFW_KEY_F                 = 70
  #GLFW_KEY_G                 = 71
  #GLFW_KEY_H                 = 72
  #GLFW_KEY_I                 = 73
  #GLFW_KEY_J                 = 74
  #GLFW_KEY_K                 = 75
  #GLFW_KEY_L                 = 76
  #GLFW_KEY_M                 = 77
  #GLFW_KEY_N                 = 78
  #GLFW_KEY_O                 = 79
  #GLFW_KEY_P                 = 80
  #GLFW_KEY_Q                 = 81
  #GLFW_KEY_R                 = 82
  #GLFW_KEY_S                 = 83
  #GLFW_KEY_T                 = 84
  #GLFW_KEY_U                 = 85
  #GLFW_KEY_V                 = 86
  #GLFW_KEY_W                 = 87
  #GLFW_KEY_X                 = 88
  #GLFW_KEY_Y                 = 89
  #GLFW_KEY_Z                 = 90
  #GLFW_KEY_LEFT_BRACKET      = 91  ;/* [ */
  #GLFW_KEY_BACKSLASH         = 92  ;/* \ */
  #GLFW_KEY_RIGHT_BRACKET     = 93  ;/* ] */
  #GLFW_KEY_GRAVE_ACCENT      = 96  ;/* ` */
  #GLFW_KEY_WORLD_1           = 161 ;/* non-US #1 */
  #GLFW_KEY_WORLD_2           = 162 ;/* non-US #2 */
  
  ;/* Function keys */
  #GLFW_KEY_ESCAPE            = 256
  #GLFW_KEY_ENTER             = 257
  #GLFW_KEY_TAB               = 258
  #GLFW_KEY_BACKSPACE         = 259
  #GLFW_KEY_INSERT            = 260
  #GLFW_KEY_DELETE            = 261
  #GLFW_KEY_RIGHT             = 262
  #GLFW_KEY_LEFT              = 263
  #GLFW_KEY_DOWN              = 264
  #GLFW_KEY_UP                = 265
  #GLFW_KEY_PAGE_UP           = 266
  #GLFW_KEY_PAGE_DOWN         = 267
  #GLFW_KEY_HOME              = 268
  #GLFW_KEY_END               = 269
  #GLFW_KEY_CAPS_LOCK         = 280
  #GLFW_KEY_SCROLL_LOCK       = 281
  #GLFW_KEY_NUM_LOCK          = 282
  #GLFW_KEY_PRINT_SCREEN      = 283
  #GLFW_KEY_PAUSE             = 284
  #GLFW_KEY_F1                = 290
  #GLFW_KEY_F2                = 291
  #GLFW_KEY_F3                = 292
  #GLFW_KEY_F4                = 293
  #GLFW_KEY_F5                = 294
  #GLFW_KEY_F6                = 295
  #GLFW_KEY_F7                = 296
  #GLFW_KEY_F8                = 297
  #GLFW_KEY_F9                = 298
  #GLFW_KEY_F10               = 299
  #GLFW_KEY_F11               = 300
  #GLFW_KEY_F12               = 301
  #GLFW_KEY_F13               = 302
  #GLFW_KEY_F14               = 303
  #GLFW_KEY_F15               = 304
  #GLFW_KEY_F16               = 305
  #GLFW_KEY_F17               = 306
  #GLFW_KEY_F18               = 307
  #GLFW_KEY_F19               = 308
  #GLFW_KEY_F20               = 309
  #GLFW_KEY_F21               = 310
  #GLFW_KEY_F22               = 311
  #GLFW_KEY_F23               = 312
  #GLFW_KEY_F24               = 313
  #GLFW_KEY_F25               = 314
  #GLFW_KEY_KP_0              = 320
  #GLFW_KEY_KP_1              = 321
  #GLFW_KEY_KP_2              = 322
  #GLFW_KEY_KP_3              = 323
  #GLFW_KEY_KP_4              = 324
  #GLFW_KEY_KP_5              = 325
  #GLFW_KEY_KP_6              = 326
  #GLFW_KEY_KP_7              = 327
  #GLFW_KEY_KP_8              = 328
  #GLFW_KEY_KP_9              = 329
  #GLFW_KEY_KP_DECIMAL        = 330
  #GLFW_KEY_KP_DIVIDE         = 331
  #GLFW_KEY_KP_MULTIPLY       = 332
  #GLFW_KEY_KP_SUBTRACT       = 333
  #GLFW_KEY_KP_ADD            = 334
  #GLFW_KEY_KP_ENTER          = 335
  #GLFW_KEY_KP_EQUAL          = 336
  #GLFW_KEY_LEFT_SHIFT        = 340
  #GLFW_KEY_LEFT_CONTROL      = 341
  #GLFW_KEY_LEFT_ALT          = 342
  #GLFW_KEY_LEFT_SUPER        = 343
  #GLFW_KEY_RIGHT_SHIFT       = 344
  #GLFW_KEY_RIGHT_CONTROL     = 345
  #GLFW_KEY_RIGHT_ALT         = 346
  #GLFW_KEY_RIGHT_SUPER       = 347
  #GLFW_KEY_MENU              = 348
  #GLFW_KEY_LAST              = #GLFW_KEY_MENU
  
  ;/* Modifiers Keys */s
  #GLFW_MOD_SHIFT           = $0001
  #GLFW_MOD_CONTROL         = $0002
  #GLFW_MOD_ALT             = $0004
  #GLFW_MOD_SUPER           = $0008
  
  ;/* Mouse button definitions */
  #GLFW_MOUSE_BUTTON_1   =    0
  #GLFW_MOUSE_BUTTON_2   =   1
  #GLFW_MOUSE_BUTTON_3   =   2
  #GLFW_MOUSE_BUTTON_4   =   3
  #GLFW_MOUSE_BUTTON_5   =   4
  #GLFW_MOUSE_BUTTON_6   =   5
  #GLFW_MOUSE_BUTTON_7   =   6
  #GLFW_MOUSE_BUTTON_8    =  7
  #GLFW_MOUSE_BUTTON_LAST  = #GLFW_MOUSE_BUTTON_8
  
  ;/* Mouse button aliases */
  #GLFW_MOUSE_BUTTON_LEFT   = #GLFW_MOUSE_BUTTON_1
  #GLFW_MOUSE_BUTTON_RIGHT  = #GLFW_MOUSE_BUTTON_2
  #GLFW_MOUSE_BUTTON_MIDDLE  = #GLFW_MOUSE_BUTTON_3
  
  
  ;/* Joystick identifiers */
  #GLFW_JOYSTICK_1   =       0
  #GLFW_JOYSTICK_2   =       1
  #GLFW_JOYSTICK_3    =      2
  #GLFW_JOYSTICK_4    =      3
  #GLFW_JOYSTICK_5    =      4
  #GLFW_JOYSTICK_6    =      5
  #GLFW_JOYSTICK_7    =      6
  #GLFW_JOYSTICK_8    =      7
  #GLFW_JOYSTICK_9    =      8
  #GLFW_JOYSTICK_10   =      9
  #GLFW_JOYSTICK_11    =     10
  #GLFW_JOYSTICK_12    =     11
  #GLFW_JOYSTICK_13    =     12
  #GLFW_JOYSTICK_14    =     13
  #GLFW_JOYSTICK_15    =     14
  #GLFW_JOYSTICK_16     =    15
  #GLFW_JOYSTICK_LAST    =   #GLFW_JOYSTICK_16
  
  ;/*************************************************************************
  ;  * Errors
  ;*************************************************************************/
  #GLFW_NOT_INITIALIZED       = $00010001
  #GLFW_NO_CURRENT_CONTEXT    = $00010002
  #GLFW_INVALID_ENUM          = $00010003
  #GLFW_INVALID_VALUE         = $00010004
  #GLFW_OUT_OF_MEMORY         = $00010005
  #GLFW_API_UNAVAILABLE       = $00010006
  #GLFW_VERSION_UNAVAILABLE   = $00010007
  #GLFW_PLATFORM_ERROR        = $00010008
  #GLFW_FORMAT_UNAVAILABLE    = $00010009
  
  ;/*************************************************************************
  ;  * Other definitions
  ;  *************************************************************************/
  
  ;/* glfwOpenWindow modes */
  #GLFW_FOCUSED              =  $00020001
  #GLFW_ICONIFIED            =  $00020002
  #GLFW_RESIZABLE            =  $00020003
  #GLFW_VISIBLE              =  $00020004
  #GLFW_DECORATED            =  $00020005
  #GLFW_AUTO_ICONIFY         =  $00020006
  #GLFW_FLOATING             =  $00020007
  
  #GLFW_RED_BITS             =  $00021001
  #GLFW_GREEN_BITS           =  $00021002
  #GLFW_BLUE_BITS            =  $00021003
  #GLFW_ALPHA_BITS           =  $00021004
  #GLFW_DEPTH_BITS           =  $00021005
  #GLFW_STENCIL_BITS         =  $00021006
  #GLFW_ACCUM_RED_BITS       =  $00021007
  #GLFW_ACCUM_GREEN_BITS     =  $00021008
  #GLFW_ACCUM_BLUE_BITS      =  $00021009
  #GLFW_ACCUM_ALPHA_BITS     =  $0002100A
  #GLFW_AUX_BUFFERS          =  $0002100B
  #GLFW_STEREO               =  $0002100C
  #GLFW_SAMPLES              =  $0002100D
  #GLFW_SRGB_CAPABLE         =  $0002100E
  #GLFW_REFRESH_RATE         =  $0002100F
  #GLFW_DOUBLEBUFFER         =  $00021010
  
  #GLFW_CLIENT_API           =  $00022001
  #GLFW_CONTEXT_VERSION_MAJOR = $00022002
  #GLFW_CONTEXT_VERSION_MINOR = $00022003
  #GLFW_CONTEXT_REVISION      = $00022004
  #GLFW_CONTEXT_ROBUSTNESS    = $00022005
  #GLFW_OPENGL_FORWARD_COMPAT = $00022006
  #GLFW_OPENGL_DEBUG_CONTEXT  = $00022007
  #GLFW_OPENGL_PROFILE        = $00022008
  
  #GLFW_OPENGL_API            = $00030001
  #GLFW_OPENGL_ES_API         = $00030002
  
  #GLFW_NO_ROBUSTNESS          =         0
  #GLFW_NO_RESET_NOTIFICATION  = $00031001
  #GLFW_LOSE_CONTEXT_ON_RESET  = $00031002
  
  #GLFW_OPENGL_ANY_PROFILE     =         0
  #GLFW_OPENGL_CORE_PROFILE    = $00032001
  #GLFW_OPENGL_COMPAT_PROFILE  = $00032002
  
  #GLFW_CURSOR                = $00033001
  #GLFW_STICKY_KEYS           = $00033002
  #GLFW_STICKY_MOUSE_BUTTONS  = $00033003
  
  #GLFW_CURSOR_NORMAL         = $00034001
  #GLFW_CURSOR_HIDDEN         = $00034002
  #GLFW_CURSOR_DISABLED       = $00034003
  
  #GLFW_ANY_RELEASE_BEHAVIOR  =        0
  #GLFW_RELEASE_BEHAVIOR_FLUSH= $00035001
  #GLFW_RELEASE_BEHAVIOR_NONE = $00035002
  
  ; Cursors
  #GLFW_ARROW_CURSOR          = $00036001
  #GLFW_GLFW_IBEAM_CURSOR     = $00036002
  #GLFW_CROSSHAIR_CURSOR      = $00036003
  #GLFW_HAND_CURSOR           = $00036004
  #GLFW_HRESIZE_CURSOR        = $00036005
  #GLFW_VRESIZE_CURSOR        = $00036006
  
  #GLFW_CONNECTED             = $00040001
  #GLFW_DISCONNECTED          = $00040002
  
  #GLFW_DONT_CARE             = -1
  
  ;/* Time spans longer than this (seconds) are considered To be infinity */
  #GLFW_INFINITY = 100000.0
  
  ;---------------------------------------------------------------------------
  ; Macros
  ;---------------------------------------------------------------------------
  ;{
  ;-----------------------------------------
  ; Get Pseudotype(unicode/ascii)
  ;-----------------------------------------
  CompilerIf #PB_Compiler_Unicode
    Macro GLFWPSEUDOTYPE
      p-utf8
    EndMacro
  CompilerElse
    Macro GLFWPSEUDOTYPE
      p-ascii
    EndMacro
  CompilerEndIf
  
  ;}
  
  ;---------------------------------------------------------------------------
  ; Structures
  ;---------------------------------------------------------------------------
  ;{
  ;--------------------------------------
  ; Monitor (Opaque Structure)
  ;--------------------------------------
  Structure GLFWmonitor : EndStructure
  
  ;--------------------------------------
  ; Window (Opaque Structure)
  ;--------------------------------------
  Structure GLFWwindow : EndStructure
  
  ;--------------------------------------
  ; Cursor (Opaque Structure)
  ;--------------------------------------
  Structure GLFWcursor : EndStructure
  
  ;--------------------------------------
  ; Video Mode
  ;--------------------------------------
  Structure GLFWvidmode
    Width.l
    Height.l
    RedBits.l
    BlueBits.l
    GreenBits.l
  EndStructure
  
  ;--------------------------------------
  ; Gamma Ramp
  ;--------------------------------------
  Structure GLFWgammaramp
    *red      ; pointer to array of unsigned short
    *green    ; pointer to array of unsigned short
    *blue     ; pointer to array of unsigned short
    size.l
  EndStructure
  
  ;--------------------------------------
  ; Image
  ;--------------------------------------
  Structure GLFWimage
    width.i
    height.i
    *pixels; pointer to unsigned char*
  EndStructure
  ;}
  
  
  ;---------------------------------------------------------------------------
  ; Prototypes
  ;---------------------------------------------------------------------------
  ;{
  PrototypeC PGLFWGLPROC()
  PrototypeC PGLFWERROR(err_code.i,description.GLFWPSEUDOTYPE)
  PrototypeC PGLFWCREATEWINDOWPROC(w.i,h.i,name.GLFWPSEUDOTYPE,*monitor.GLFWmonitor=#Null,*parent.GLFWwindow=#Null)
  PrototypeC PGLFWWINDOWPOS(*window.GLFWwindow,posx.i,posy.i)
  PrototypeC PGLFWWINDOWSIZE(*window.GLFWwindow,width.i,height.i)
  PrototypeC PGLFWWINDOWCLOSE(*window.GLFWwindow)
  PrototypeC PGLFWWINDOWREFRESH(*window.GLFWwindow)
  PrototypeC PGLFWWINDOWFOCUS(*window.GLFWwindow)
  PrototypeC PGLFWKEY(*window.GLFWwindow,key.i,scancode.i,action.i,modifier.i)    ; Key Pressed/Released Callback Function
  PrototypeC PGLFWCHAR(*window.GLFWwindow,character.l)                            ; Unicode Character Input Callback Function
  PrototypeC PGLFWMOUSEBUTTON(*window.GLFWwindow,button.i,action.i,modifier.i)    ; Mouse Button  Pressed/Released Callback Function
  PrototypeC PGLFWMOUSEPOS(*window.GLFWwindow,posx.d,posy.d)                      ; Mouse Position Callback Function
  PrototypeC PGLFWMOUSEENTER(*window.GLFWwindow,entered.i)                        ; Mouse Enter/Leave Callback Function 
  PrototypeC PGLFWMOUSESCROLL(*window.GLFWwindow,xoffset.d,yoffset.d)             ; Mouse Scroll(Wheel) Callback Function 
  PrototypeC PGLFWFRAMEBUFFERSIZE(*window.GLFWwindow)
  ;}
    
  ;---------------------------------------------------------------------------
  ; Import Functions
  ;---------------------------------------------------------------------------
  ;{
  CompilerIf #PB_Compiler_OS = #PB_OS_Windows
    ;___________________________________________________________________________
    ;  Windows
    ;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    ImportC "libs\x64\windows\glfw3.lib"
  
  CompilerElse
      
    ;___________________________________________________________________________
    ;  Linux/MacOSX
    ;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
    ImportC "libs/x64/linux/glfw3.a" : EndImport
      
    ImportC "-lGL" : EndImport
    ImportC "-lGLU" : EndImport
    ImportC "-lX11" : EndImport  
    ImportC "-lXinerama" : EndImport  
    ImportC "-lXi" : EndImport  
    ImportC "-lXrandr" : EndImport 
    ImportC "-lXcursor" : EndImport
    ImportC "-lXxf86vm" : EndImport 
    ImportC "libs/x64/linux/glfw3.a"
  
  CompilerEndIf
      
  
  	;/* GLFW initialization, termination And version querying */
  	glfwInit()
  	glfwTerminate()
  	glfwGetVersion(*major, *minor, *rev)                                           ;(*major.i,*minor.i,*rev.i) 
  	glfwGetVersionString()                                                         ; return const char*
  
  	;/* GLFW monitors */
  	glfwGetMonitors(*count)                                                        ;(*count.i) ; return a **GLFWmonitor
  	glfwGetPrimaryMonitor()                                                        ; return a *GLFWmonitor
  	glfwGetMonitorPos(*monitor.GLFWmonitor, *xpos, *ypos)                          ;(*monitor.GLFWmonitor,*xpos.i,*ypos.i)
  	glfwGetMonitorPhysicalSize(*monitor.GLFWmonitor, *width,*height)               ;(*monitor.GLFWmonitor,*xpos.i,*ypsos.i)
  	glfwGetMonitorName(*monitor.GLFWmonitor)                                       ;(*monitor.GLFWmonitor) return const char*
  	glfwSetMonitorCallback(*monitor.GLFWmonitor, callback.i)
  	
  	;/* Windows */
  	glfwGetVideoModes(*monitor.GLFWmonitor,*count);                                ;(*monitor.GLFWmonitor, *count.i)
  	glfwGetVideoMode(*monitor.GLFWmonitor);
  	glfwSetGamma(*monitor.GLFWmonitor, gamma.f);
  	glfwGetGammaRamp(*monitor.GLFWmonitor)                                         ; return a *GLFWgammaramp
  	glfwSetGammaRamp(*monitor.GLFWmonitor, *ramp.GLFWgammaramp);
  	glfwDefaultWindowHints()
  	glfwWindowHint(target.i, hint.i)
  	glfwCreateWindow(w.i,h.i,name.GLFWPSEUDOTYPE,*monitor.GLFWmonitor=#Null,*parent.GLFWwindow=#Null)
  
  	glfwDestroyWindow(*window.GLFWwindow)
  	glfwWindowShouldClose(*window.GLFWwindow)
  	glfwSetWindowShouldClose(*window.GLFWwindow, value.i)
  	glfwSetWindowTitle(*window.GLFWwindow,title.GLFWPSEUDOTYPE)
  	glfwGetWindowPos(*window.GLFWwindow, *xpos, *ypos)                       ;(*window.GLFWwindow,*xpos.i,*ypos.i)
  	glfwSetWindowPos(*window.GLFWwindow, xpos.i, ypos.i)
  	glfwGetWindowSize(*window.GLFWwindow, *width, *height)                   ;(*window.GLFWwindow,*width.i,*height.i)
  	glfwSetWindowSize(*window.GLFWwindow, width.i, height.i)
  	glfwGetFramebufferSize(*window.GLFWwindow, *width, *height)              ;(*window.GLFWwindow,*width.i,*height.i)
  	glfwGetWindowFrameSize(*window.GLFWwindow,*left, *top, *right, *bottom)  ;(*window.GLFWwindow,*left., *top.i, *right.i, *bottom.i);
  	glfwIconifyWindow(*window.GLFWwindow)
  	glfwRestoreWindow(*window.GLFWwindow)
  	glfwShowWindow(*window.GLFWwindow)
  	glfwHideWindow(*window.GLFWwindow)
  	glfwGetWindowMonitor(*window.GLFWwindow)                                 ; return a *GLFWmonitor
  	glfwGetWindowAttrib.i(*window.GLFWwindow, attrib.i)
  	glfwSetWindowUserPointer(*window.GLFWwindow, *ptr)                       ; set-up user pointer for the specified GLFW*window.GLFWwindow
  	glfwGetWindowUserPointer(*window.GLFWwindow)                             ; get user pointer
  	
  	
  	;/* Time */
  	glfwGetTime.d()
  	glfwSetTime(time.d)
  
  	;/* Events */
  	glfwPollEvents()
  	glfwWaitEvents()
  	glfwPostEmptyEvent()
  	
  	;/* Inputs */
  	glfwGetInputMode.i(*window.GLFWwindow, mode.i)                           ; Modes:#GLFW_CURSOR,#GLFW_STICKY_KEYS,#GLFW_STICKY_MOUSE_BUTTONS
  	glfwSetInputMode(*window.GLFWwindow, mode.i, value.i);
  	
    glfwGetKey.i(*window.GLFWwindow, key.i)                                  ; return #GLFW_PRESS or #GLFW_RELEASE
    
    ;/* Mouse */
    glfwGetMouseButton(*window.GLFWwindow, button.i)                         ; return #GLFW_PRESS or #GLFW_RELEASE
    glfwGetCursorPos(*window.GLFWwindow, *xpos, *ypos)                       ;(*window.GLFWwindow,*xpos.d, *ypos.d)
    glfwSetCursorPos(*window.GLFWwindow, xpos.d, ypos.d)
    
    ;/* Cursor */
    glfwCreateCursor(*image.GLFWimage, xhot.i, yhot.i)
    glfwCreateStandardCursor(shape.i)
    glfwDestroyCursor(*cursor.GLFWcursor)
    glfwSetCursor(*window.GLFWwindow,*cursor.GLFWcursor)
    
    ;/* Joystick (untested)*/
  	glfwJoystickPresent(joystick.i)               ; Joystick Is Present?
  	glfwGetJoystickAxes(joystick.i, *count)       ;(joystick.i, *count.i) return const float* describing axis values
  	glfwGetJoystickButtons(joystick.i, *count)    ;(joystick.i, *count.i) return const unsigned char* describing buttons values
  	glfwGetJoystickName(joystick.i)               ; return const char* containing joystick name
  	
  	;/* Clipboard */
  	glfwSetClipboardString(*window.GLFWwindow, string.GLFWPSEUDOTYPE)        ; Put String to Clipboard
  	glfwGetClipboardString(*window.GLFWwindow)                               ; return const char* from clipboard content
  	
  	;/* Callbacks */
    glfwSetErrorCallback(*cb.PGLFWERROR)                                     ; Set Error Callback
  	glfwSetWindowPosCallback(*window.GLFWwindow, *cb.PGLFWWINDOWPOS)         ; Set Window Pos Callback
  	glfwSetWindowSizeCallback(*window.GLFWwindow, *cb.PGLFWWINDOWSIZE)       ; Set Window Size Callback
  	glfwSetWindowCloseCallback(*window.GLFWwindow, *cb.PGLFWWINDOWCLOSE)     ; Set Window Close Callback
  	glfwSetWindowRefreshCallback(*window.GLFWwindow, *cb.PGLFWWINDOWREFRESH) ; Set Window Refresh Callback
  	glfwSetWindowFocusCallback(*window.GLFWwindow, *cb.PGLFWWINDOWFOCUS)     ; Set Window Focus Callback
  	glfwSetKeyCallback(*window.GLFWwindow, *cb.PGLFWKEY)                     ; Set Keyboard Key Callback
  	glfwSetCharCallback(*window.GLFWwindow, *cb.PGLFWCHAR)                   ; Set Keyboard Input Callback
  	glfwSetMouseButtonCallback(*window.GLFWwindow, *cb.PGLFWMOUSEBUTTON)     ; Mouse Button Callback
  	glfwSetCursorPosCallback(*window.GLFWwindow, *cb.PGLFWMOUSEPOS)          ; Mouse Move Callback
  	glfwSetCursorEnterCallback(*window.GLFWwindow, *cb.PGLFWMOUSEENTER)      ; Mouse Enter/Leave Window
  	glfwSetScrollCallback(*window.GLFWwindow, *cb.PGLFWMOUSESCROLL)          ; Mouse Scroll(wheel)
  	glfwSetFramebufferSizeCallback (*window.GLFWwindow, *cb.PGLFWFRAMEBUFFERSIZE); FrameBuffer Size CallBack
  	
  	
  	;/* Contexts */
  	glfwMakeContextCurrent(*window.GLFWwindow)
  	glfwGetCurrentContext()                                       ; return a *GLFWwindow
  	glfwSwapBuffers(*window.GLFWwindow)                           ; Swap Front/Back OpenGL Buffers
  	glfwSwapInterval(interval.i)                                  ; Vertical Retrace Synchronization(VSync)
  	
  	;/* Extensions */
  	glfwExtensionSupported(extension.GLFWPSEUDOTYPE)                           ; Extension Is Supported?
  	;glfwGetProcAddress(procname.GLFWPSEUDOTYPE)
  	glfwGetProcAddress(extname.GLFWPSEUDOTYPE)
  	
  	;/* Underlying Window */
  	CompilerSelect #PB_Compiler_OS
  	  CompilerCase #PB_OS_Windows
  	    glfwGetWin32Window(*window.GLFWwindow)                                 ; return underlying HWND
  	CompilerEndSelect
  
  EndImport
  
  Declare GLFW_Error_Callback(error.i,description.s)
  Declare GLFW_Key_Callback(*window.GLFWwindow,key.i,scancode.i,action.i,modifiers.i)
  Declare GLFW_MouseButton_Callback(*window.GLFWwindow,button.i,action.i,modifier.i)
  Declare GLFW_MouseEnter_Callback(*window.GLFWwindow,entered.i)
  Declare GLFW_MouseMove_Callback(*window.GLFWwindow,entered.i)
  Declare GLFW_WindowRefresh_Callback(*window.GLFWwindow)
  Declare glfwDebugVersion()
  Declare GLFWDLogCurrentMonitorInfo()
  Declare glfwSetParentWindow(*window.GLFWwindow,parentWindow)
  Declare glfwCreateFullScreenWindow()
  ;}
EndDeclareModule

Module GLFW
  UseModule OpenGL
  ;---------------------------------------------------------------------------
  ; Callbacks (exemples)
  ;---------------------------------------------------------------------------
  ;{
  ;-------------------------
  ; Error Callback
  ;-------------------------
  Procedure GLFW_Error_Callback(error.i,description.s)
    Debug description  
  EndProcedure
  
  ;-------------------------
  ; Keyboard Key Callback
  ;-------------------------
  Procedure GLFW_Key_Callback(*window.GLFWwindow,key.i,scancode.i,action.i,modifiers.i)
    If key = #GLFW_KEY_ESCAPE And action = #GLFW_PRESS
      glfwSetWindowShouldClose(*window.GLFWwindow,#True)
    ElseIf key = #GLFW_KEY_S And action = #GLFW_PRESS
      Debug "Activate Camera"
    EndIf
  EndProcedure
  
  ;--------------------------
  ; Mouse Button Callback
  ;--------------------------
  Procedure GLFW_MouseButton_Callback(*window.GLFWwindow,button.i,action.i,modifier.i)
    Debug "GLFW MouseButton Callback"
    If button = #GLFW_MOUSE_BUTTON_LEFT And action = #GLFW_PRESS
      Debug "Left Mouse Button Callback!!"
    EndIf
  EndProcedure
  
  ;--------------------------
  ; Mouse Enter/Leave Callback
  ;--------------------------
  Procedure GLFW_MouseEnter_Callback(*window.GLFWwindow,entered.i)
    If entered = #True
      Debug "Mouse Entered Window..."
    Else
      Debug "Mouse Leaved Window..."
    EndIf
  EndProcedure
  
  ;--------------------------
  ; Mouse Move Callback
  ;--------------------------
  Procedure GLFW_MouseMove_Callback(*window.GLFWwindow,entered.i)
    If entered = #True
      Debug "Mouse Entered Window..."
    Else
      Debug "Mouse Leaved Window..."
    EndIf
  EndProcedure
  
  ; glfwSetCursorEnterCallback(*window,@GLFW_MouseEnter_Callback())
  ; glfwSetWindowFocusCallback(*window,@GLFW_WindowFocusCallback())
  
  ;--------------------------
  ; Window Refresh Callback
  ;--------------------------
  Procedure GLFW_WindowRefresh_Callback(*window.GLFWwindow)
    Debug "GLFW Window Refresh Callback!!"
  EndProcedure
  
  ;}
  
  ;----------------------------------------------------------------------
  ; Debug
  ;----------------------------------------------------------------------
  ;{
  ;----------------------------
  ; Log GLFW Version
  ;----------------------------
  Procedure glfwDebugVersion()
    Protected *version = glfwGetVersionString()
    Debug "GLFW Version : "+ GLGETSTRINGOUTPUT(*version)
  EndProcedure
  
  
  ;-------------------------------------------------------------
  ; Log Current Monitor Infos
  ;-------------------------------------------------------------
  Procedure GLFWDLogCurrentMonitorInfo()
    Protected *monitor.GLFWmonitor = glfwGetPrimaryMonitor()
    Protected *name = glfwGetMonitorName(*monitor)
    Debug "GLFW Current Monitor : "+ GLGETSTRINGOUTPUT(*name)
    Protected width, height
    Debug glfwGetMonitorPhysicalSize(*monitor.GLFWmonitor,@width,@height)
    Debug "Monitor Physical Size ---> Width : "+Str(width)+", Height : "+Str(height)
  EndProcedure
  ;}
  
  ;--------------------------------------------------------------
  ;Set Parent Window
  ;--------------------------------------------------------------
  ;{
  Procedure glfwSetParentWindow(*window.GLFWwindow,parentWindow)
    CompilerIf #PB_Compiler_OS =  #PB_OS_Windows
      Protected HWND.i = glfwGetWin32Window(*window) 
      SetParent_(HWND,parentWindow)
      ;SetWindowPos_(HWND,#HWND_TOPMOST,0,0,0,0,#SWP_NOMOVE|#SWP_NOSIZE)
    CompilerElse
      Debug "GLFWParentWindow : No Solution for Linux/MacOS yet..."
    CompilerEndIf
  EndProcedure
  ;}
  
  ;--------------------------------------------------------------
  ;Open FullScreen Window
  ;--------------------------------------------------------------
  ;{
  Procedure glfwCreateFullScreenWindow()
    Protected *monitor.GLFWmonitor  = glfwGetPrimaryMonitor()
    Protected *mode.GLFWvidmode  = glfwGetVideoMode(*monitor)
  ;       glfwWindowHint(#GLFW_OPENGL_PROFILE,#GLFW_OPENGL_CORE_PROFILE)
    glfwWindowHint(#GLFW_RED_BITS,*mode\RedBits)
    glfwWindowHint(#GLFW_BLUE_BITS,*mode\BlueBits)
    glfwWindowHint(#GLFW_GREEN_BITS,*mode\GreenBits)
  
    Protected *window.GLFWwindow = glfwCreateWindow(*mode\Width,*mode\Height,"GLFW",*monitor,#Null)
  
    
    If Not *window
      MessageRequester("GLFW", "Fail To Open GLFW FullScreen Window!!")
      ProcedureReturn #False
    EndIf
  
   ;Print out GLFW, OpenGL version And GLEW Version:
    Protected iOpenGLMajor.i = glfwGetWindowAttrib(*window, #GLFW_CONTEXT_VERSION_MAJOR);
    Protected iOpenGLMinor.i = glfwGetWindowAttrib(*window, #GLFW_CONTEXT_VERSION_MINOR);
    Protected iOpenGLRevision.i = glfwGetWindowAttrib(*window, #GLFW_CONTEXT_REVISION)  ;
  
    Debug "Status: Using GLFW Version "+glfwGetVersionString()
    Debug "Status: Using OpenGL Version: "+Str(iOpenGLMajor)+","+Str(iOpenGLMinor)+", Revision : "+Str(iOpenGLRevision)
    glfwMakeContextCurrent(*window)
    ProcedureReturn *window
  EndProcedure
  ;}
EndModule

Post Reply