Mercurial > pub > dyncall > bindings
diff R/rdyncall/demo/SDL.R @ 0:0cfcc391201f
initial from svn dyncall-1745
author | Daniel Adler |
---|---|
date | Thu, 19 Mar 2015 22:26:28 +0100 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/R/rdyncall/demo/SDL.R Thu Mar 19 22:26:28 2015 +0100 @@ -0,0 +1,146 @@ +# Package: rdyncall +# File: demo/SDL.R +# Description: 3D Rotating Cube Demo using SDL,OpenGL and GLU. (dynport demo) + +dynport(SDL) +dynport(GL) +dynport(GLU) + +# Globals. + +surface <- NULL + +# Init. + +init <- function() +{ + err <- SDL_Init(SDL_INIT_VIDEO) + if (err != 0) error("SDL_Init failed") + surface <<- SDL_SetVideoMode(512,512,32,SDL_DOUBLEBUF+SDL_OPENGL) +} + +# GL Display Lists + +makeCubeDisplaylist <- function() +{ + vertices <- as.double(c( + -1,-1,-1, + 1,-1,-1, + -1, 1,-1, + 1, 1,-1, + -1,-1, 1, + 1,-1, 1, + -1, 1, 1, + 1, 1, 1 + )) + + colors <- as.raw( col2rgb( rainbow(8) ) ) + + triangleIndices <- as.integer(c( + 0, 2, 1, + 2, 3, 1, + 1, 3, 7, + 1, 7, 5, + 4, 5, 7, + 4, 7, 6, + 6, 2, 0, + 6, 0, 4, + 2, 7, 3, + 2, 6, 7, + 4, 0, 5, + 0, 1, 5 + )) + + glEnableClientState(GL_VERTEX_ARRAY) + glVertexPointer(3, GL_DOUBLE, 0, vertices ) + + glEnableClientState(GL_COLOR_ARRAY) + glColorPointer(3, GL_UNSIGNED_BYTE, 0, colors ) + + displaylistId <- glGenLists(1) + glNewList( displaylistId, GL_COMPILE ) + glPushAttrib(GL_ENABLE_BIT) + glEnable(GL_DEPTH_TEST) + glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, triangleIndices) + glPopAttrib() + glEndList() + + glDisableClientState(GL_VERTEX_ARRAY) + glDisableClientState(GL_COLOR_ARRAY) + + + return(displaylistId) +} + +# Mainloop. + +mainloop <- function() +{ + displaylistId <- makeCubeDisplaylist() + evt <- new.struct(SDL_Event) + blink <- 0 + tbase <- SDL_GetTicks() + quit <- FALSE + while(!quit) + { + tnow <- SDL_GetTicks() + tdemo <- ( tnow - tbase ) / 1000 + + glClearColor(0,0,blink,0) + glClear(GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT) + + glMatrixMode(GL_PROJECTION) + glLoadIdentity() + aspect <- 512/512 + gluPerspective(60, aspect, 3, 1000) + + glMatrixMode(GL_MODELVIEW) + glLoadIdentity() + gluLookAt(0,0,5,0,0,0,0,1,0) + glRotated(sin(tdemo)*60.0, 0, 1, 0); + glRotated(cos(tdemo)*90.0, 1, 0, 0); + + glCallList(displaylistId) + + glCallList(displaylistId) + + SDL_GL_SwapBuffers() + + SDL_WM_SetCaption(paste("time:", tdemo),NULL) + blink <- blink + 0.01 + while (blink > 1) blink <- blink - 1 + while( SDL_PollEvent(evt) != 0 ) + { + if ( evt$type == SDL_QUIT ) quit <- TRUE + else if (evt$type == SDL_MOUSEBUTTONDOWN ) + { + button <- evt$button + cat("button ",button$button," at ",button$x,",",button$y,"\n") + } + } + glerr <- glGetError() + if (glerr != 0) + { + cat("GL Error:", gluErrorString(glerr) ) + quit <- 1 + } + SDL_Delay(30) + } + glDeleteLists(displaylistId, 1) +} + +cleanup <- function() +{ + SDL_Quit() +} + +run <- function() +{ + init() + mainloop() + cleanup() +} + +run() + +