![]() |
| Red et OpenGL | |
| ldci | 16-Dec-2013/13:55:36+1:00 |
| Bonjour à tous Voici mon cadeau de Noël avant l'heure! J'ai décidé de donner des ailes à Red Vous trouverez ici https://www.wuala.com/fjouen/Code/GLFW/ le portage de la bibliothèque GLFW (http://www.glfw.org/) Ceci permet de donner à Red une gestion des fenêtres graphiques, des événements clavier, souris, joystick, du son, du multi-threading et l'accès à OpenGL Cette version est pour Mac OSX 10.9 mais elle est adaptable sans problème. Je vais mettre des exemples dans les jours qui viennent, mais pour commencer une démo très simple: <code> Red/System [ Title: "GLFW Binding: test1" Author: "François Jouen" Rights: "Copyright (c) 2013 François Jouen. All rights reserved." License: "BSD-3 - https://github.com/dockimbel/Red/blob/master/BSD-3-License.txt" ] #include %../glfw.reds print newline Print ["Red is talking to GLFW and OpenGL" newline] t: glfwInit if t = 1 [print "GLFW Library successfully initialized" newline] print newline print ["Time elapsed since GLFW Library initialization : " glfwGetTime newline] mj: declare pointer! [integer!] ; or declare int-ptr! mn: declare pointer! [integer!] re: declare pointer! [integer!] glfwGetVersion mj mn re print ["Version: "mj/value "." mn/value "." re/value newline] print [glfwGetVersionString newline] monitors: declare pointer! [integer!] glfwGetMonitors monitors print ["Number of monitors: " monitors/value newline] monitor: glfwGetPrimaryMonitor xpos: declare pointer! [integer!] ypos: declare pointer! [integer!] width: declare pointer! [integer!] height: declare pointer! [integer!] count: declare pointer! [integer!] glfwGetMonitorPos monitor xpos ypos glfwGetMonitorPhysicalSize monitor width height print ["Default window position: " xpos/value " " ypos/value newline] print ["Default window size: "width/value " " height/value newline] print ["Main monitor name: " glfwGetMonitorName monitor newline] mode: glfwGetVideoModes monitor count print [count/value " possible modes" newline] print ["First Mode : " mode/width " " mode/height " " mode/redBits " " mode/greenBits " " mode/blueBits " " mode/refreshRate newline] currentMode: glfwGetVideoMode monitor print ["Current Mode: " currentMode/width " " currentMode/height " " currentMode/redBits " " currentMode/greenBits " " currentMode/blueBits " " currentMode/refreshRate newline] gamma: glfwGetGammaRamp monitor print ["Current Gamma: " gamma/red " " gamma/green " " gamma/blue " "gamma/size newline] print ["Time elapsed since GLFW Library initialization : " glfwGetTime newline] glfwTerminate </code> et le résultat dans la console Red is talking to GLFW and OpenGL GLFW Library successfully initialized Time elapsed since GLFW Library initialization : 0.025423469 Version: 3.0.3 3.0.3 Cocoa NSGL chdir menubar dynamic Number of monitors: 2 Default window position: 0 0 Default window size: 596 335 Main monitor name: iMac 24 possible modes First Mode : 640 480 5 5 5 0 Current Mode: 2560 1440 8 8 8 0 Current Gamma: 00851600 00853600 00853800 256 Time elapsed since GLFW Library initialization : 0.026012882 Allez bon code ! | |
| ldci | 16-Dec-2013/14:19:16+1:00 |
| et voila comment créer et afficher une fenêtre graphique afin de gérer les événements <code> Red/System [ Title: "GLFW Binding: test2" Author: "François Jouen" Rights: "Copyright (c) 2013 François Jouen. All rights reserved." License: "BSD-3 - https://github.com/dockimbel/Red/blob/master/BSD-3-License.txt" ] #include %../glfw.reds glfwInit ;Create a windowed mode window and its OpenGL context window: glfwCreateWindow 640 480 "Hello World" NULL NULL ;Make the window's context current glfwMakeContextCurrent window ;Loop until the user closes the window while [(glfwWindowShouldClose window) = 0] [ ;Render here ;Swap front and back buffers ; glfwSwapBuffers window ;Poll for and process events glfwPollEvents ] glfwTerminate </code> et le résultat graphique ici : http://www.wuala.com/fjouen/Code/GLFW/images/ | |
| ldci | 16-Dec-2013/14:21:39+1:00 |
Désolé c'est mieux comme ça
Red/System [
Title: "GLFW Binding: test2"
Author: "François Jouen"
Rights: "Copyright (c) 2013 François Jouen. All rights reserved."
License: "BSD-3 - https://github.com/dockimbel/Red/blob/master/BSD-3-License.txt"
]
#include %../glfw.reds
glfwInit
;Create a windowed mode window and its OpenGL context
window: glfwCreateWindow 640 480 "Hello World" NULL NULL
;Make the window's context current
glfwMakeContextCurrent window
;Loop until the user closes the window
while [(glfwWindowShouldClose window) = 0] [
;Render here
;Swap front and back buffers ;
glfwSwapBuffers window
;Poll for and process events
glfwPollEvents
]
glfwTerminate
| |
| GreG | 16-Dec-2013/15:50:14+1:00 |
| Merci, super cadeau | |
| ldci | 18-Dec-2013/10:26+1:00 |
| Merci Greg, Bonne nouvelle, glwf marche parfaitement, mais comme cette lib s'interface avec OpenGL, j'ai commencé le portage d'OPenGL pour Red/System ... Ca va être long, car il y a un paquet de fonction, mais ca marche déjà.
glViewport: "glViewport" [
x [GLint]
y [GLint]
width [GLsizei]
height [GLsizei]
]
Affaire à suivre | |
| ldci | 18-Dec-2013/19:58:07+1:00 |
| Bien Une petite démo: Red sait parler OpenGL maintenant
Red/System [
Title: "GLFW Binding: test3"
Author: "François Jouen"
Rights: "Copyright (c) 2013 François Jouen. All rights reserved."
License: "BSD-3 - https://github.com/dockimbel/Red/blob/master/BSD-3-License.txt"
]
#include %../glfw.reds
glfwInit
window: glfwCreateWindow 800 600 "A Simple OpenGL Triangle with Red" NULL NULL
glfwMakeContextCurrent window
while [(glfwWindowShouldClose window) = GL_FALSE] [
glClearColor 0.0 0.0 0.0 0.0
glClear GL_COLOR_BUFFER_BIT
glBegin GL_TRIANGLES
glColor3ub 255 0 0 glVertex2d -0.75 -0.75
glColor3ub 0 255 0 glVertex2d 0.0 0.75
glColor3ub 0 0 255 glVertex2d 0.75 -0.75
glEnd
glFlush
glfwSwapBuffers window
glfwPollEvents
]
glfwDestroyWindow window
glfwTerminate
et bien sûr l'image qui correspond http://www.wuala.com/fjouen/Code/GLFW/images/simple1.jpg/ | |
| ldci | 19-Dec-2013/10:14:29+1:00 |
| Bonjour à tous Red peut utiliser les fonctions d'animation d'OpenGL Un exemple aussi de la façon d'utiliser des pointeurs sur fonction avec Red/S (le callback)
Red/System [
Title: "GLFW Binding: Animated triangle"
Author: "François Jouen"
Rights: "Copyright (c) 2013 François Jouen. All rights reserved."
License: "BSD-3 - https://github.com/dockimbel/Red/blob/master/BSD-3-License.txt"
]
#include %../glfw.reds
#include %../user.reds
ratio: 0.0
width: 0
height: 0
angle: 0.0
&width: :width; pointer!
&height: :height ;pointer!
error_callback: func [[cdecl] error [integer!] description [c-string!]] [
print [ description " " stderr]
]
key_callback: func [
[cdecl]
window [GLFWwindow]
key [integer!]
scancode [integer!]
action [integer!]
mods [integer!]] [
if (key = GLFW_KEY_ESCAPE) and (action = GLFW_PRESS) [glfwSetWindowShouldClose window GL_TRUE ]
]
if glfwInit = 0 [glfwTerminate] ; exit
window: glfwCreateWindow 640 480 "Animated OpenGL Triangle with Red [ESC to Quit]" NULL NULL
if window = null [glfwTerminate]
glfwMakeContextCurrent window
glfwSetErrorCallback :error_callback
glfwSetKeyCallback window :key_callback
while [(glfwWindowShouldClose window) = GL_FALSE] [
glfwGetFramebufferSize window &width &height
ratio: (int-to-float width) / (int-to-float height)
glViewport 0 0 width height
glClearColor 0.0 0.0 0.0 0.0
glClear GL_COLOR_BUFFER_BIT
glMatrixMode GL_PROJECTION
glLoadIdentity
glOrtho 0.0 - ratio ratio -1.0 1.0 1.0 -1.0
glMatrixMode GL_MODELVIEW
glLoadIdentity
angle: glfwGetTime * 50.00
glRotatef as float32! angle 0.0 0.0 1.0
glBegin GL_TRIANGLES
glColor3f 1.0 0.0 0.0 glVertex3f -0.6 -0.4 0.0 ;first point of triangle is red
glColor3f 0.0 1.0 0.0 glVertex3f 0.6 -0.4 0.0 ;second point of triangle is green
glColor3f 0.0 0.0 1.0 glVertex3f 0.0 0.6 0.0 ;third point of triangle is blue
glEnd
glfwSwapBuffers window
glfwPollEvents
]
glfwDestroyWindow window
glfwTerminate
![]() | |
| ldci | 19-Dec-2013/10:15:23+1:00 |
| Bonjour à tous Red peut utiliser les fonctions d'animation d'OpenGL Un exemple aussi de la façon d'utiliser des pointeurs sur fonction avec Red/S (le callback)
Red/System [
Title: "GLFW Binding: Animated triangle"
Author: "François Jouen"
Rights: "Copyright (c) 2013 François Jouen. All rights reserved."
License: "BSD-3 - https://github.com/dockimbel/Red/blob/master/BSD-3-License.txt"
]
#include %../glfw.reds
#include %../user.reds
ratio: 0.0
width: 0
height: 0
angle: 0.0
&width: :width; pointer!
&height: :height ;pointer!
error_callback: func [[cdecl] error [integer!] description [c-string!]] [
print [ description " " stderr]
]
key_callback: func [
[cdecl]
window [GLFWwindow]
key [integer!]
scancode [integer!]
action [integer!]
mods [integer!]] [
if (key = GLFW_KEY_ESCAPE) and (action = GLFW_PRESS) [glfwSetWindowShouldClose window GL_TRUE ]
]
if glfwInit = 0 [glfwTerminate] ; exit
window: glfwCreateWindow 640 480 "Animated OpenGL Triangle with Red [ESC to Quit]" NULL NULL
if window = null [glfwTerminate]
glfwMakeContextCurrent window
glfwSetErrorCallback :error_callback
glfwSetKeyCallback window :key_callback
while [(glfwWindowShouldClose window) = GL_FALSE] [
glfwGetFramebufferSize window &width &height
ratio: (int-to-float width) / (int-to-float height)
glViewport 0 0 width height
glClearColor 0.0 0.0 0.0 0.0
glClear GL_COLOR_BUFFER_BIT
glMatrixMode GL_PROJECTION
glLoadIdentity
glOrtho 0.0 - ratio ratio -1.0 1.0 1.0 -1.0
glMatrixMode GL_MODELVIEW
glLoadIdentity
angle: glfwGetTime * 50.00
glRotatef as float32! angle 0.0 0.0 1.0
glBegin GL_TRIANGLES
glColor3f 1.0 0.0 0.0 glVertex3f -0.6 -0.4 0.0 ;first point of triangle is red
glColor3f 0.0 1.0 0.0 glVertex3f 0.6 -0.4 0.0 ;second point of triangle is green
glColor3f 0.0 0.0 1.0 glVertex3f 0.0 0.6 0.0 ;third point of triangle is blue
glEnd
glfwSwapBuffers window
glfwPollEvents
]
glfwDestroyWindow window
glfwTerminate
![]() | |
| ldci | 20-Dec-2013/17:26:13+1:00 |
| Nenad est vraiment le meilleur ! Sur la base de la doc de Jocko et Pierre, voici comment intégrer aisément un portage de librairies externes (écrites en Red/System) à l'intérieur d'un code Red. Bon j'attends avec impatience le support des flottants avec Red Red [ Title: "GLFW Binding: Triangle" Author: "Francois Jouen" Rights: "Copyright (c) 2013 Francois Jouen. All rights reserved." License: "BSD-3 - https://github.com/dockimbel/Red/blob/master/BSD-3-License.txt" ] ; how to use Red/System code inside Red #system [library] to make import ; then func is replace by routine because we are using Red/S code inside dthe function ; Unfortunately Red does not support yet floating values ... #system [ #include %../glfw.reds ; this lib includes opgl.reds ; for error callback code pointer error_callback: func [[cdecl] error [integer!] description [c-string!]] [ print [ description " " stderr] ] ] initgl: routine [return: [integer!]] [ if glfwInit = 0 [glfwTerminate] window: glfwCreateWindow 800 600 "A Simple OpenGL Triangle with Red" NULL NULL glfwMakeContextCurrent window glfwSetErrorCallback :error_callback return 1 ] closegl: routine [] [ glfwDestroyWindow window glfwTerminate ] render: routine [ /local rep [integer!]] [ rep: 0 until [ ;glClearColor 0.0 0.0 0.0 0.0 glClear GL_COLOR_BUFFER_BIT glBegin GL_TRIANGLES glColor3ub 255 0 0 ;glVertex2d -0.75 -0.75 glColor3ub 0 255 0 ;glVertex2d 0.0 0.75 glColor3ub 0 0 255 ;glVertex2d 0.75 -0.75 glEnd glFlush glfwSwapBuffers window glfwPollEvents rep: glfwWindowShouldClose window rep = 1 ] ] ;Main program initgl render closegl quit Pour le fun, ce code en Red met Compiling to native code... ...compilation time : 9973 ms ...linking time : 119 ms ...output file size : 208896 bytes et en Red/System Compiling to native code... ...compilation time : 1563 ms ...linking time : 10 ms ...output file size : 20480 bytes Bon coding | |
| PierreCh | 28-Dec-2013/0:07:35+1:00 |
| Impressionnant. Bravo! Ça me rappelle vaguement une discussion qui avait eu lieu par ici, et où, de mémoire, il était question d'implémenter une interface graphique en openGL. | |
| ldci | 28-Dec-2013/13:39:24+1:00 |
| Quand je vous dis que Red est génial! Voici comment implémenter des listes contenant des types différents avec red/s La base (en c)
typedef struct
{
int attrib;
const char* ext;
const char* name;
} AttribGL;
static AttribGL gl_attribs[] =
{
{ GL_RED_BITS, NULL, "red bits" },
{ GL_GREEN_BITS, NULL, "green bits" },
{ GL_BLUE_BITS, NULL, "blue bits" },
{ GL_ALPHA_BITS, NULL, "alpha bits" },
{ GL_DEPTH_BITS, NULL, "depth bits" },
{ GL_STENCIL_BITS, NULL, "stencil bits" },
{ GL_STEREO, NULL, "stereo" },
{ GL_SAMPLES_ARB, "GL_ARB_multisample", "FSAA samples" },
{ 0, NULL, NULL }
};
comment ce gérer avec Red/S 1°) créer un alias de structure
AttribGL!: alias struct! [
attrib [integer!]
ext [c-string!]
name [c-string!]
]
2°) Créer une liste des alias via une structure
gl_attribs: declare struct! [
gl1 [AttribGL!]
gl2 [AttribGL!]
gl3 [AttribGL!]
gl4 [AttribGL!]
gl5 [AttribGL!]
gl6 [AttribGL!]
gl7 [AttribGL!]
gl8 [AttribGL!]
gl9 [AttribGL!]
]
Bien maintenant comment utiliser tout ça
; on déclare les éléments de la liste et on reserve l'espace mémoire
gl_attribs/gl1: declare AttribGL!
gl_attribs/gl2: declare AttribGL!
gl_attribs/gl3: declare AttribGL!
gl_attribs/gl4: declare AttribGL!
gl_attribs/gl5: declare AttribGL!
gl_attribs/gl6: declare AttribGL!
gl_attribs/gl7: declare AttribGL!
gl_attribs/gl8: declare AttribGL!
gl_attribs/gl9: declare AttribGL!
; on affecte les valeurs aux éléments de la liste
gl_attribs/gl1/attrib: GL_RED_BITS
gl_attribs/gl1/ext: null
gl_attribs/gl1/name: "red bits"
gl_attribs/gl2/attrib: GL_GREEN_BITS
gl_attribs/gl2/ext: null
gl_attribs/gl2/name: "green bits"
gl_attribs/gl3/attrib: GL_BLUE_BITS
gl_attribs/gl3/ext: null
gl_attribs/gl3/name: "blue bits"
gl_attribs/gl4/attrib: GL_ALPHA_BITS
gl_attribs/gl4/ext: null
gl_attribs/gl4/name: "alpha bits"
gl_attribs/gl5/attrib: GL_DEPTH_BITS
gl_attribs/gl5/ext: null
gl_attribs/gl5/name: "depth bits"
gl_attribs/gl6/attrib: GL_STENCIL_BITS
gl_attribs/gl6/ext: null
gl_attribs/gl6/name: "stencil bits"
gl_attribs/gl7/attrib: GL_STEREO
gl_attribs/gl7/ext: null
gl_attribs/gl7/name: "stereo"
gl_attribs/gl8/attrib: 000080A9h;GL_SAMPLES_ARB
gl_attribs/gl8/ext: null
gl_attribs/gl8/name: "GL_ARB_multisample FSAA samples"
gl_attribs/gl9/attrib: 0
gl_attribs/gl9/ext: null
gl_attribs/gl9/name: " "
; pour accéder aux éléments de la liste il nous faut un simple pointeur sur le premier élément de la liste
p: as int-ptr! gl_attribs/gl1
; ensuite l'arithmétique des pointeurs de Nénad fait le reste :)
c: 1
until [
print [ as integer! p ": " p/1 " " p/2 " " as c-string! p/3 newline]
p: p + 3
c: c + 1
c = 10
]
et voila le résultat adresse de la structure: 12376 adresse des alias: 12440 12452 12464 12476 12488 12500 12512 12524 12440: 3410 0 red bits 12452: 3411 0 green bits 12464: 3412 0 blue bits 12476: 3413 0 alpha bits 12488: 3414 0 depth bits 12500: 3415 0 stencil bits 12512: 3123 0 stereo 12524: 32937 0 GL_ARB_multisample FSAA samples 12536: 0 0 | |
| ldci | 28-Dec-2013/13:45:35+1:00 |
| Quand je vous dis que Red est génial! Voici comment implémenter des listes contenant des types différents avec red/s La base (en c)
typedef struct
{
int attrib;
const char* ext;
const char* name;
} AttribGL;
static AttribGL gl_attribs[] =
{
{ GL_RED_BITS, NULL, "red bits" },
{ GL_GREEN_BITS, NULL, "green bits" },
{ GL_BLUE_BITS, NULL, "blue bits" },
{ GL_ALPHA_BITS, NULL, "alpha bits" },
{ GL_DEPTH_BITS, NULL, "depth bits" },
{ GL_STENCIL_BITS, NULL, "stencil bits" },
{ GL_STEREO, NULL, "stereo" },
{ GL_SAMPLES_ARB, "GL_ARB_multisample", "FSAA samples" },
{ 0, NULL, NULL }
};
comment ce gérer avec Red/S 1°) créer un alias de structure
AttribGL!: alias struct! [
attrib [integer!]
ext [c-string!]
name [c-string!]
]
2°) Créer une liste des alias via une structure
gl_attribs: declare struct! [
gl1 [AttribGL!]
gl2 [AttribGL!]
gl3 [AttribGL!]
gl4 [AttribGL!]
gl5 [AttribGL!]
gl6 [AttribGL!]
gl7 [AttribGL!]
gl8 [AttribGL!]
gl9 [AttribGL!]
]
Bien maintenant comment utiliser tout ça
; on déclare les éléments de la liste et on reserve l'espace mémoire
gl_attribs/gl1: declare AttribGL!
gl_attribs/gl2: declare AttribGL!
gl_attribs/gl3: declare AttribGL!
gl_attribs/gl4: declare AttribGL!
gl_attribs/gl5: declare AttribGL!
gl_attribs/gl6: declare AttribGL!
gl_attribs/gl7: declare AttribGL!
gl_attribs/gl8: declare AttribGL!
gl_attribs/gl9: declare AttribGL!
; on affecte les valeurs aux éléments de la liste
gl_attribs/gl1/attrib: GL_RED_BITS
gl_attribs/gl1/ext: null
gl_attribs/gl1/name: "red bits"
gl_attribs/gl2/attrib: GL_GREEN_BITS
gl_attribs/gl2/ext: null
gl_attribs/gl2/name: "green bits"
gl_attribs/gl3/attrib: GL_BLUE_BITS
gl_attribs/gl3/ext: null
gl_attribs/gl3/name: "blue bits"
gl_attribs/gl4/attrib: GL_ALPHA_BITS
gl_attribs/gl4/ext: null
gl_attribs/gl4/name: "alpha bits"
gl_attribs/gl5/attrib: GL_DEPTH_BITS
gl_attribs/gl5/ext: null
gl_attribs/gl5/name: "depth bits"
gl_attribs/gl6/attrib: GL_STENCIL_BITS
gl_attribs/gl6/ext: null
gl_attribs/gl6/name: "stencil bits"
gl_attribs/gl7/attrib: GL_STEREO
gl_attribs/gl7/ext: null
gl_attribs/gl7/name: "stereo"
gl_attribs/gl8/attrib: 000080A9h;GL_SAMPLES_ARB
gl_attribs/gl8/ext: null
gl_attribs/gl8/name: "GL_ARB_multisample FSAA samples"
gl_attribs/gl9/attrib: 0
gl_attribs/gl9/ext: null
gl_attribs/gl9/name: " "
; pour accéder aux éléments de la liste il nous faut un simple pointeur sur le premier élément de la liste
p: as int-ptr! gl_attribs/gl1
; ensuite l'arithmétique des pointeurs de Nénad fait le reste :)
c: 1
until [
print [ as integer! p ": " p/1 " " p/2 " " as c-string! p/3 newline]
; on incrémente le pointeur par le nombre d'éléments de l'alias (ici 3)
p: p + 3
c: c + 1
c = 10
]
et voila le résultat adresse de la structure: 12376 adresse des alias: 12440 12452 12464 12476 12488 12500 12512 12524 12440: 3410 0 red bits 12452: 3411 0 green bits 12464: 3412 0 blue bits 12476: 3413 0 alpha bits 12488: 3414 0 depth bits 12500: 3415 0 stencil bits 12512: 3123 0 stereo 12524: 32937 0 GL_ARB_multisample FSAA samples 12536: 0 0 Pas mal, non? On a les moyens avec les pointeurs de se promener dans la liste et de faire tout ce que l'on veut (lire, écrire, modifier ...) . Le principe est le même pour un array ou une liste d'objets. Great Job DocKimbel | |
| ldci | 30-Dec-2013/20:50:24+1:00 |
| Salut à tous, Le code GLFW est maintenant disponible sur github https://github.com/ldci/gflw-red Bonne Année à tous | |
| ldci | 1-Jan-2014/19:50:41+1:00 |
| Bonjour à tous Le code GLFW sur github est maintenant compatible avec le OpenGL Utility Toolkit. Amicalement | |
|
Login required to Post. | |