You are on page 1of 10

Ring Documentation, Release 1.

x += deltaMove * lx * 0.1
z += deltaMove * lz * 0.1

func renderScene

if deltaMove
computePos(deltaMove)
ok

// Clear Color and Depth Buffers


glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

// Reset transformations
glLoadIdentity()

// Set the camera


gluLookAt( x, 1.0, z,
x+lx, 1.0, z+lz,
0.0, 1.0, 0.0)

// Draw ground

glColor3f(0.9, 0.9, 0.9)


glBegin(GL_QUADS)
glVertex3f(-100.0, 0.0, -100.0)
glVertex3f(-100.0, 0.0, 100.0)
glVertex3f( 100.0, 0.0, 100.0)
glVertex3f( 100.0, 0.0, -100.0)
glEnd()

// Draw 9 SnowMen
for i = -3 to -1
for j = -3 to -1
glPushMatrix()
glTranslatef(i*10.0, 0.0, j * 10.0)
drawSnowMan()
number = (i+3)*3+(j+3)
renderBitmapString(0.0, 0.5, 0.0,font ,""+number)
glPopMatrix()
next
next

// Code to compute frames per second


frame++

time=glutGet(GLUT_ELAPSED_TIME)
if time - timebase > 1000
s = "RingFreeGLUT - FPS: " + (frame*1000.0/(time-timebase))
timebase = time
frame = 0
ok

// Code to display a string (fps) with bitmap fonts


setOrthographicProjection()

glPushMatrix()
glLoadIdentity()

5.10. RingFreeGLUT Extension 63


Ring Documentation, Release 1.6

renderBitmapString(5,30,0,GLUT_BITMAP_HELVETICA_18,s)
glPopMatrix()

restorePerspectiveProjection()

glutSwapBuffers()

// -----------------------------------
// KEYBOARD
// -----------------------------------

func processNormalKeys
key = glutEventKey()
xx = glutEventX()
yy = glutEventY()

switch key
on 27
glutDestroyMenu(mainMenu)
glutDestroyMenu(fillMenu)
glutDestroyMenu(colorMenu)
glutDestroyMenu(fontMenu)
Shutdown()
off

func pressKey

key = glutEventKey()
xx = glutEventX()
yy = glutEventY()

switch key
on GLUT_KEY_UP
deltaMove = 0.5
on GLUT_KEY_DOWN
deltaMove = -0.5
off

func releaseKey

key = glutEventKey()

switch key
on GLUT_KEY_UP
deltaMove = 0
on GLUT_KEY_DOWN
deltaMove = 0
off

// -----------------------------------
// MOUSE
// -----------------------------------

func mouseMove

5.10. RingFreeGLUT Extension 64


Ring Documentation, Release 1.6

xx = glutEventX()
yy = glutEventY()

// this will only be true when the left button is down


if xOrigin >= 0

// update deltaAngle
deltaAngle = (xx - xOrigin) * 0.001

// update camera's direction


lx = sin(angle + deltaAngle)
lz = -cos(angle + deltaAngle)
ok

func mouseButton

button = glutEventButton()
state = glutEventState()
xx = glutEventX()
yy = glutEventY()

// only start motion if the left button is pressed


if button = GLUT_LEFT_BUTTON
// when the button is released
if state = GLUT_UP
angle += deltaAngle
xOrigin = -1
else
// state = GLUT_DOWN
xOrigin = xx
ok
ok

// -----------------------------------
// MENUS
// -----------------------------------

func processMenuStatus

status = glutEventStatus()

if status = GLUT_MENU_IN_USE
menuFlag = 1
else
menuFlag = 0
ok

func processMainMenu

// nothing to do in here
// all actions are for submenus

func processFillMenu

5.10. RingFreeGLUT Extension 65


Ring Documentation, Release 1.6

option = glutEventValue()

switch option

on C_FILL
glPolygonMode(GL_FRONT, GL_FILL)
on C_LINE
glPolygonMode(GL_FRONT, GL_LINE)
off

func processFontMenu

option = glutEventValue()

switch (option) {
on C_INT_GLUT_BITMAP_8_BY_13
font = GLUT_BITMAP_8_BY_13
on C_INT_GLUT_BITMAP_9_BY_15
font = GLUT_BITMAP_9_BY_15
on C_INT_GLUT_BITMAP_TIMES_ROMAN_10
font = GLUT_BITMAP_TIMES_ROMAN_10
on C_INT_GLUT_BITMAP_TIMES_ROMAN_24
font = GLUT_BITMAP_TIMES_ROMAN_24
on C_INT_GLUT_BITMAP_HELVETICA_10
font = GLUT_BITMAP_HELVETICA_10
on C_INT_GLUT_BITMAP_HELVETICA_12
font = GLUT_BITMAP_HELVETICA_12
on C_INT_GLUT_BITMAP_HELVETICA_18
font = GLUT_BITMAP_HELVETICA_18
off

func processColorMenu

option = glutEventValue()

switch option
on C_RED
red = 1.0
green = 0.0
blue = 0.0
on C_GREEN
red = 0.0
green = 1.0
blue = 0.0
on C_BLUE
red = 0.0
green = 0.0
blue = 1.0
on C_ORANGE
red = 1.0
green = 0.5
blue = 0.5
off

func createPopupMenus

5.10. RingFreeGLUT Extension 66


Ring Documentation, Release 1.6

fontMenu = glutCreateMenu(:processFontMenu)

glutAddMenuEntry("BITMAP_8_BY_13 ",C_INT_GLUT_BITMAP_8_BY_13 )
glutAddMenuEntry("BITMAP_9_BY_15",C_INT_GLUT_BITMAP_9_BY_15 )
glutAddMenuEntry("BITMAP_TIMES_ROMAN_10 ",C_INT_GLUT_BITMAP_TIMES_ROMAN_10 )
glutAddMenuEntry("BITMAP_TIMES_ROMAN_24",C_INT_GLUT_BITMAP_TIMES_ROMAN_24 )
glutAddMenuEntry("BITMAP_HELVETICA_10 ",C_INT_GLUT_BITMAP_HELVETICA_10 )
glutAddMenuEntry("BITMAP_HELVETICA_12",C_INT_GLUT_BITMAP_HELVETICA_12 )
glutAddMenuEntry("BITMAP_HELVETICA_18",C_INT_GLUT_BITMAP_HELVETICA_18 )

fillMenu = glutCreateMenu(:processFillMenu)

glutAddMenuEntry("Fill",C_FILL)
glutAddMenuEntry("Line",C_LINE)

colorMenu = glutCreateMenu(:processColorMenu)
glutAddMenuEntry("Red",C_RED);
glutAddMenuEntry("Blue",C_BLUE);
glutAddMenuEntry("Green",C_GREEN);
glutAddMenuEntry("Orange",C_ORANGE);

mainMenu = glutCreateMenu(:processMainMenu)

glutAddSubMenu("Polygon Mode", fillMenu)


glutAddSubMenu("Color", colorMenu)
glutAddSubMenu("Font",fontMenu)
// attach the menu to the right button
glutAttachMenu(GLUT_RIGHT_BUTTON)

// this will allow us to know if the menu is active


glutMenuStatusFunc(:processMenuStatus)

// -----------------------------------
// MAIN
// -----------------------------------

func main

// init GLUT and create window


glutInit()
glutInitDisplayMode(GLUT_DEPTH | GLUT_DOUBLE | GLUT_RGBA)
glutInitWindowPosition(100,100)
glutInitWindowSize(320,320)
glutCreateWindow("RingFreeGLUT - Test - 9 SnowMan")

// register callbacks
glutDisplayFunc(:renderScene)
glutReshapeFunc(:changeSize)
glutIdleFunc(:renderScene)

glutIgnoreKeyRepeat(1)
glutKeyboardFunc(:processNormalKeys)
glutSpecialFunc(:pressKey)
glutSpecialUpFunc(:releaseKey)

// here are the two new functions


glutMouseFunc(:mouseButton)

5.10. RingFreeGLUT Extension 67


Ring Documentation, Release 1.6

glutMotionFunc(:mouseMove)

// OpenGL init
glEnable(GL_DEPTH_TEST)
glEnable(GL_CULL_FACE)

// init Menus
createPopupMenus()

// enter GLUT event processing cycle


glutMainLoop()

Screen Shots:

5.10. RingFreeGLUT Extension 68


Ring Documentation, Release 1.6

5.11 RingOpenGL Extension

Ring 1.5 comes with RingOpenGL and support for the next versions
• OpenGL 1.1
• OpenGL 1.2
• OpenGL 1.3
• OpenGL 1.4
• OpenGL 1.5
• OpenGL 2.0
• OpenGL 2.1
• OpenGL 3.0
• OpenGL 3.2
• OpenGL 3.3
• OpenGL 4.0
• OpenGL 4.1
• OpenGL 4.2
• OpenGL 4.3
• OpenGL 4.4
• OpenGL 4.5
• OpenGL 4.6
Example:
/*
This sample is based on C Tutorials
from :
http://www.wikihow.com/Make-a-Cube-in-OpenGL
*/

load "freeglut.ring"
load "opengl21lib.ring"

// ----------------------------------------------------------
// Global Variables
// ----------------------------------------------------------
rotate_y=0
rotate_x=0

// ----------------------------------------------------------
// display() Callback function
// ----------------------------------------------------------
func display

// Clear screen and Z-buffer


glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)

// Reset transformations

5.11. RingOpenGL Extension 69


Ring Documentation, Release 1.6

glLoadIdentity()

// Rotate when user changes rotate_x and rotate_y


glRotatef( rotate_x, 1.0, 0.0, 0.0 )
glRotatef( rotate_y, 0.0, 1.0, 0.0 )

//Multi-colored side - FRONT


glBegin(GL_POLYGON)

glColor3f( 1.0, 0.0, 0.0 ) glVertex3f( 0.5, -0.5, -0.5 ) # P1 is red


glColor3f( 0.0, 1.0, 0.0 ) glVertex3f( 0.5, 0.5, -0.5 ) # P2 is green
glColor3f( 0.0, 0.0, 1.0 ) glVertex3f( -0.5, 0.5, -0.5 ) # P3 is blue
glColor3f( 1.0, 0.0, 1.0 ) glVertex3f( -0.5, -0.5, -0.5 ) # P4 is purple

glEnd()

// White side - BACK


glBegin(GL_POLYGON)
glColor3f( 1.0, 1.0, 1.0 )
glVertex3f( 0.5, -0.5, 0.5 )
glVertex3f( 0.5, 0.5, 0.5 )
glVertex3f( -0.5, 0.5, 0.5 )
glVertex3f( -0.5, -0.5, 0.5 )
glEnd()

// Purple side - RIGHT


glBegin(GL_POLYGON)
glColor3f( 1.0, 0.0, 1.0 )
glVertex3f( 0.5, -0.5, -0.5 )
glVertex3f( 0.5, 0.5, -0.5 )
glVertex3f( 0.5, 0.5, 0.5 )
glVertex3f( 0.5, -0.5, 0.5 )
glEnd()

// Green side - LEFT


glBegin(GL_POLYGON)
glColor3f( 0.0, 1.0, 0.0 )
glVertex3f( -0.5, -0.5, 0.5 )
glVertex3f( -0.5, 0.5, 0.5 )
glVertex3f( -0.5, 0.5, -0.5 )
glVertex3f( -0.5, -0.5, -0.5 )
glEnd()

// Blue side - TOP


glBegin(GL_POLYGON)
glColor3f( 0.0, 0.0, 1.0 )
glVertex3f( 0.5, 0.5, 0.5 )
glVertex3f( 0.5, 0.5, -0.5 )
glVertex3f( -0.5, 0.5, -0.5 )
glVertex3f( -0.5, 0.5, 0.5 )
glEnd()

// Red side - BOTTOM


glBegin(GL_POLYGON)
glColor3f( 1.0, 0.0, 0.0 )
glVertex3f( 0.5, -0.5, -0.5 )
glVertex3f( 0.5, -0.5, 0.5 )
glVertex3f( -0.5, -0.5, 0.5 )

5.11. RingOpenGL Extension 70


Ring Documentation, Release 1.6

glVertex3f( -0.5, -0.5, -0.5 )


glEnd()

glFlush()
glutSwapBuffers()

// ----------------------------------------------------------
// specialKeys() Callback Function
// ----------------------------------------------------------
func specialKeys

key = glutEventKey()

// Right arrow - increase rotation by 5 degree


switch Key

on GLUT_KEY_RIGHT
rotate_y += 5

// Left arrow - decrease rotation by 5 degree


on GLUT_KEY_LEFT
rotate_y -= 5

on GLUT_KEY_UP
rotate_x += 5

on GLUT_KEY_DOWN
rotate_x -= 5

off

// Request display update


glutPostRedisplay()

// ----------------------------------------------------------
// main() function
// ----------------------------------------------------------
func main

// Initialize GLUT and process user parameters


glutInit()

// Request double buffered true color window with Z-buffer


glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH)

// Create window
glutCreateWindow("Awesome Cube")

// Enable Z-buffer depth test


glEnable(GL_DEPTH_TEST)

// Callback functions
glutDisplayFunc(:display)
glutSpecialFunc(:specialKeys)

5.11. RingOpenGL Extension 71


Ring Documentation, Release 1.6

// Pass control to GLUT for events


glutMainLoop()

// Return to OS

Screen Shot:

5.12 Better Code Generator for Extensions

The Code Generator is updated to support <constant> type, So we can have constants other than numbers, for example
: Strings and Pointers.
When we have pointers we can determine the pointer type. To use this feature, before <constant> and </constant> we
can use
$nDefaultConstantType = C_CONSTANT_TYPE_POINTER
$cDefaultConstantPointerType = "void *"

The next example from the RingFreeGLUT extension


<runcode>
$nDefaultConstantType = C_CONSTANT_TYPE_POINTER
$cDefaultConstantPointerType = "void"
</runcode>
<constant>
GLUT_STROKE_ROMAN
GLUT_STROKE_MONO_ROMAN
GLUT_BITMAP_9_BY_15
GLUT_BITMAP_8_BY_13
GLUT_BITMAP_TIMES_ROMAN_10
GLUT_BITMAP_TIMES_ROMAN_24
GLUT_BITMAP_HELVETICA_10
GLUT_BITMAP_HELVETICA_12

5.12. Better Code Generator for Extensions 72

You might also like