Mercurial > pub > dyncall > bindings
comparison R/rdc/demo/sdl.R @ 0:0cfcc391201f
initial from svn dyncall-1745
author | Daniel Adler |
---|---|
date | Thu, 19 Mar 2015 22:26:28 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:0cfcc391201f |
---|---|
1 library(rdc) | |
2 # ---------------------------------------------------------------------------- | |
3 # Platform specific issues | |
4 | |
5 if (.Platform$OS.type == "windows") { | |
6 OS <- "windows" | |
7 } else if ( Sys.info()[["sysname"]] == "Darwin" ) { | |
8 OS <- "darwin" | |
9 } else { | |
10 OS <- "unix" | |
11 } | |
12 | |
13 # ---------------------------------------------------------------------------- | |
14 # dynbind environment | |
15 | |
16 .cdecl <- dcNewCallVM(1024) | |
17 .stdcall <- dcNewCallVM(1024) | |
18 dcMode(.stdcall, rdc:::DC_CALL_C_X86_WIN32_STD ) | |
19 | |
20 # ---------------------------------------------------------------------------- | |
21 # C memory allocation | |
22 .callC <- .cdecl | |
23 .callSDL <- .cdecl | |
24 .callGL <- .cdecl | |
25 .callGLU <- .cdecl | |
26 .callR <- .cdecl | |
27 if (OS == "windows") { | |
28 .libC <- "/windows/system32/msvcrt" | |
29 .libSDL <- "/dll/sdl" | |
30 .libGL <- "/windows/system32/OPENGL32" | |
31 .libGLU <- "/windows/system32/GLU32" | |
32 .libR <- "R" | |
33 .callGL <- .stdcall | |
34 } else if (OS == "darwin") { | |
35 .libCocoa <- "/System/Library/Frameworks/Cocoa.framework/Cocoa" | |
36 dyn.load(.libCocoa) | |
37 .NSApplicationLoad <- getNativeSymbolInfo("NSApplicationLoad")$address | |
38 NSApplicationLoad <- function() rdcCall(.NSApplicationLoad, ")B" ) | |
39 # dyn.load("rdc") | |
40 .newPool <- getNativeSymbolInfo("newPool")$address | |
41 .releasePool <- getNativeSymbolInfo("releasePool")$address | |
42 releasePool <- function(x) | |
43 { | |
44 rdcCall( .releasePool, "p)v", x ) | |
45 } | |
46 newPool <- function() | |
47 { | |
48 x <- rdcCall( .newPool, ")p" ) | |
49 reg.finalizer( x, releasePool ) | |
50 return(x) | |
51 } | |
52 .pool <- newPool() | |
53 .libC <- "/usr/lib/libc.dylib" | |
54 .libSDL <- "/Library/Framworks/SDL.framework/SDL" | |
55 .libGL <- "/System/Library/Frameworks/OpenGL.framework/Libraries/libGL.dylib" | |
56 .libGLU <- "/System/Library/Frameworks/OpenGL.framework/Libraries/libGLU.dylib" | |
57 .libR <- Sys.getenv("R_HOME") | |
58 .libR <- paste(.libR,"/lib/libR.dylib",sep="") | |
59 } else { # unix | |
60 .libC <- "/lib/libc.so.6" | |
61 .libSDL <- "/usr/lib/libSDL.so" | |
62 .libGL <- "/usr/lib/libGL.so" | |
63 .libGLU <- "/usr/lib/libGLU.so" | |
64 .libR <- paste(R.home(),"/lib/libR.so",sep="") | |
65 } | |
66 | |
67 #dyn.load(.libC) | |
68 #.malloc <- getNativeSymbolInfo("malloc")$address | |
69 #.free <- getNativeSymbolInfo("free")$free | |
70 #malloc <- function(size) rdcCall(.malloc, "i)p", as.integer(size) ) | |
71 #free <- function(ptr) rdcCall(.free, "p)v", ptr) | |
72 | |
73 .importsR <- " | |
74 R_chk_calloc(ii)p; | |
75 R_chk_realloc(ii)p; | |
76 R_chk_free(p)v; | |
77 " | |
78 | |
79 rdcBind(.libR,.importsR,.callR) | |
80 | |
81 malloc <- function(size) R_chk_calloc(as.integer(size),1L) | |
82 free <- function(ptr) R_chk_free(ptr) | |
83 | |
84 | |
85 # ---------------------------------------------------------------------------- | |
86 # SDL library | |
87 dyn.load(.libSDL) | |
88 | |
89 .SDL_Init <- getNativeSymbolInfo("SDL_Init")$address | |
90 .SDL_Quit <- getNativeSymbolInfo("SDL_Quit")$address | |
91 .SDL_SetVideoMode <- getNativeSymbolInfo("SDL_SetVideoMode")$address | |
92 .SDL_WM_SetCaption <- getNativeSymbolInfo("SDL_WM_SetCaption")$address | |
93 .SDL_GL_SwapBuffers <- getNativeSymbolInfo("SDL_GL_SwapBuffers")$address | |
94 .SDL_PollEvent <- getNativeSymbolInfo("SDL_PollEvent")$address | |
95 .SDL_GetTicks <- getNativeSymbolInfo("SDL_GetTicks")$address | |
96 .SDL_Delay <- getNativeSymbolInfo("SDL_Delay")$address | |
97 # init flags: | |
98 SDL_INIT_TIMER = 0x00000001L | |
99 SDL_INIT_AUDIO = 0x00000010L | |
100 SDL_INIT_VIDEO = 0x00000020L | |
101 SDL_INIT_CDROM = 0x00000100L | |
102 SDL_INIT_JOYSTICK = 0x00000200L | |
103 SDL_INIT_NOPARACHUTE = 0x00100000L | |
104 SDL_INIT_EVENTTHREAD = 0x01000000L | |
105 SDL_INIT_EVERYTHING = 0x0000FFFFL | |
106 # SDL_Init(flags): | |
107 SDL_Init <- function(flags) rdcCall(.SDL_Init, "i)i", as.integer(flags) ) | |
108 # SDL_Quit(): | |
109 SDL_Quit <- function() rdcCall(.SDL_Quit, ")v" ) | |
110 # video flags: | |
111 SDL_SWSURFACE = 0x00000000L | |
112 SDL_HWSURFACE = 0x00000001L | |
113 SDL_ASYNCBLIT = 0x00000004L | |
114 SDL_ANYFORMAT = 0x10000000L | |
115 SDL_HWPALETTE = 0x20000000L | |
116 SDL_DOUBLEBUF = 0x40000000L | |
117 SDL_FULLSCREEN = 0x80000000 | |
118 SDL_OPENGL = 0x00000002L | |
119 SDL_OPENGLBLIT = 0x0000000AL | |
120 SDL_RESIZABLE = 0x00000010L | |
121 SDL_NOFRAME = 0x00000020L | |
122 SDL_HWACCEL = 0x00000100L | |
123 SDL_SRCCOLORKEY = 0x00001000L | |
124 SDL_RLEACCELOK = 0x00002000L | |
125 SDL_RLEACCEL = 0x00004000L | |
126 SDL_SRCALPHA = 0x00010000L | |
127 SDL_PREALLOC = 0x01000000L | |
128 # SDL_SetVideoMode(): | |
129 SDL_SetVideoMode <- function(width,height,bpp,flags) rdcCall(.SDL_SetVideoMode,"iiii)p",width,height,bpp,flags) | |
130 SDL_WM_SetCaption <- function(title, icon) rdcCall(.SDL_WM_SetCaption,"SS)v",as.character(title), as.character(icon)) | |
131 SDL_PollEvent <- function(eventptr) rdcCall(.SDL_PollEvent,"p)i", eventptr) | |
132 SDL_GL_SwapBuffers <- function() rdcCall(.SDL_GL_SwapBuffers,")v") | |
133 SDL_GetTicks <- function() rdcCall(.SDL_GetTicks,")i") | |
134 SDL_Delay <- function(ms) rdcCall(.SDL_Delay,"i)v",ms) | |
135 | |
136 SDL_NOEVENT = 0 | |
137 SDL_ACTIVEEVENT = 1 | |
138 SDL_KEYDOWN = 2 | |
139 SDL_KEYUP = 3 | |
140 SDL_MOUSEMOTION = 4 | |
141 SDL_MOUSEBUTTONDOWN = 5 | |
142 SDL_MOUSEBUTTONUP = 6 | |
143 SDL_JOYAXISMOTION = 7 | |
144 SDL_JOYBALLMOTION = 8 | |
145 SDL_JOYHATMOTION = 9 | |
146 SDL_JOYBUTTONDOWN = 10 | |
147 SDL_JOYBUTTONUP = 11 | |
148 SDL_QUIT = 12 | |
149 SDL_SYSWMEVENT = 13 | |
150 SDL_EVENT_RESERVEDA = 14 | |
151 SDL_EVENT_RESERVEDB = 15 | |
152 SDL_VIDEORESIZE = 16 | |
153 SDL_VIDEOEXPOSE = 17 | |
154 SDL_EVENT_RESERVED2 = 18 | |
155 SDL_EVENT_RESERVED3 = 19 | |
156 SDL_EVENT_RESERVED4 = 20 | |
157 SDL_EVENT_RESERVED5 = 21 | |
158 SDL_EVENT_RESERVED6 = 22 | |
159 SDL_EVENT_RESERVED7 = 23 | |
160 SDL_USEREVENT = 24 | |
161 SDL_NUMEVENTS = 32 | |
162 | |
163 | |
164 SDL_EventType <- function(event) offset(event, 0, "integer", 1) | |
165 | |
166 | |
167 | |
168 # ---------------------------------------------------------------------------- | |
169 # OpenGL bindings | |
170 dyn.load(.libGL) | |
171 | |
172 .importsGL <- " | |
173 glGetError()i; | |
174 glClearColor(ffff)v; | |
175 glClear(i)v; | |
176 glMatrixMode(i)v; | |
177 glLoadIdentity()v; | |
178 glBegin(i)v; | |
179 glEnd()v; | |
180 glVertex3d(ddd)v; | |
181 glRotated(dddd)v; | |
182 glGenLists(i)i; | |
183 glNewList(ii)v; | |
184 glEnableClientState(i)v; | |
185 glVertexPointer(iiip)v; | |
186 glColorPointer(iiip)v; | |
187 glDrawElements(iiip)v; | |
188 glDisableClientState(i)v; | |
189 glEndList()v; | |
190 glCallList(i)v; | |
191 " | |
192 | |
193 if (OS == "windows") { | |
194 .callGL <- .stdcall | |
195 .callGLU <- .stdcall | |
196 } else { | |
197 .callGL <- .cdecl | |
198 .callGLU <- .cdecl | |
199 } | |
200 | |
201 # Import OpenGL symbols | |
202 rdcBind(.libGL,.importsGL, .callGL) | |
203 | |
204 GL_FALSE = 0x0L | |
205 GL_TRUE = 0x1L | |
206 | |
207 GL_BYTE = 0x1400L | |
208 GL_UNSIGNED_BYTE = 0x1401L | |
209 GL_SHORT = 0x1402L | |
210 GL_UNSIGNED_SHORT = 0x1403L | |
211 GL_INT = 0x1404L | |
212 GL_UNSIGNED_INT = 0x1405L | |
213 GL_FLOAT = 0x1406L | |
214 GL_DOUBLE = 0x140AL | |
215 GL_2_BYTES = 0x1407L | |
216 GL_3_BYTES = 0x1408L | |
217 GL_4_BYTES = 0x1409L | |
218 | |
219 | |
220 GL_COMPILE = 0x1300L | |
221 GL_COMPILE_AND_EXECUTE = 0x1301L | |
222 GL_LIST_BASE = 0x0B32L | |
223 GL_LIST_INDEX = 0x0B33L | |
224 GL_LIST_MODE = 0x0B30L | |
225 | |
226 GL_VERTEX_ARRAY = 0x8074L | |
227 GL_NORMAL_ARRAY = 0x8075L | |
228 GL_COLOR_ARRAY = 0x8076L | |
229 GL_INDEX_ARRAY = 0x8077L | |
230 GL_TEXTURE_COORD_ARRAY = 0x8078L | |
231 GL_EDGE_FLAG_ARRAY = 0x8079L | |
232 GL_VERTEX_ARRAY_SIZE = 0x807AL | |
233 GL_VERTEX_ARRAY_TYPE = 0x807BL | |
234 GL_VERTEX_ARRAY_STRIDE = 0x807CL | |
235 GL_NORMAL_ARRAY_TYPE = 0x807EL | |
236 GL_NORMAL_ARRAY_STRIDE = 0x807FL | |
237 GL_COLOR_ARRAY_SIZE = 0x8081L | |
238 GL_COLOR_ARRAY_TYPE = 0x8082L | |
239 GL_COLOR_ARRAY_STRIDE = 0x8083L | |
240 GL_INDEX_ARRAY_TYPE = 0x8085L | |
241 GL_INDEX_ARRAY_STRIDE = 0x8086L | |
242 GL_TEXTURE_COORD_ARRAY_SIZE = 0x8088L | |
243 GL_TEXTURE_COORD_ARRAY_TYPE = 0x8089L | |
244 GL_TEXTURE_COORD_ARRAY_STRIDE = 0x808AL | |
245 GL_EDGE_FLAG_ARRAY_STRIDE = 0x808CL | |
246 GL_VERTEX_ARRAY_POINTER = 0x808EL | |
247 GL_NORMAL_ARRAY_POINTER = 0x808FL | |
248 GL_COLOR_ARRAY_POINTER = 0x8090L | |
249 GL_INDEX_ARRAY_POINTER = 0x8091L | |
250 GL_TEXTURE_COORD_ARRAY_POINTER = 0x8092L | |
251 GL_EDGE_FLAG_ARRAY_POINTER = 0x8093L | |
252 GL_V2F = 0x2A20L | |
253 GL_V3F = 0x2A21L | |
254 GL_C4UB_V2F = 0x2A22L | |
255 GL_C4UB_V3F = 0x2A23L | |
256 GL_C3F_V3F = 0x2A24L | |
257 GL_N3F_V3F = 0x2A25L | |
258 GL_C4F_N3F_V3F = 0x2A26L | |
259 GL_T2F_V3F = 0x2A27L | |
260 GL_T4F_V4F = 0x2A28L | |
261 GL_T2F_C4UB_V3F = 0x2A29L | |
262 GL_T2F_C3F_V3F = 0x2A2AL | |
263 GL_T2F_N3F_V3F = 0x2A2BL | |
264 GL_T2F_C4F_N3F_V3F = 0x2A2CL | |
265 GL_T4F_C4F_N3F_V4F = 0x2A2DL | |
266 | |
267 | |
268 GL_COLOR_BUFFER_BIT = 0x00004000L | |
269 | |
270 GL_MODELVIEW = 0x1700L | |
271 GL_PROJECTION = 0x1701L | |
272 GL_TEXTURE = 0x1702L | |
273 | |
274 GL_POINTS = 0x0000L | |
275 GL_LINES = 0x0001L | |
276 GL_LINE_LOOP = 0x0002L | |
277 GL_LINE_STRIP = 0x0003L | |
278 GL_TRIANGLES = 0x0004L | |
279 GL_TRIANGLE_STRIP = 0x0005L | |
280 GL_TRIANGLE_FAN = 0x0006L | |
281 GL_QUADS = 0x0007L | |
282 GL_QUAD_STRIP = 0x0008L | |
283 GL_POLYGON = 0x0009L | |
284 | |
285 # ---------------------------------------------------------------------------- | |
286 # OpenGL utility library | |
287 | |
288 .importsGLU <- " | |
289 gluLookAt(ddddddddd)v; | |
290 gluPerspective(dddd)v; | |
291 " | |
292 rdcBind(.libGLU,.importsGLU, .callGLU) | |
293 | |
294 #dyn.load(.libGLU) | |
295 #.gluLookAt <- getNativeSymbolInfo("gluLookAt")$address | |
296 #.gluPerspective <- getNativeSymbolInfo("gluPerspective")$address | |
297 #luLookAt <- function(eyeX,eyeY,eyeZ,centerX,centerY,centerZ,upX,upY,upZ) | |
298 # rdcCall(.gluLookAt,"ddddddddd)v", eyeX,eyeY,eyeZ,centerX,centerY,centerZ,upX,upY,upZ) | |
299 #gluPerspective <- function(fovy,aspect,znear,zfar) | |
300 # rdcCall(.gluPerspective,"dddd)v",fovy,aspect,znear,zfar) | |
301 | |
302 # ---------------------------------------------------------------------------- | |
303 # demo | |
304 init <- function() | |
305 { | |
306 if (OS == "darwin") | |
307 { | |
308 NSApplicationLoad() | |
309 } | |
310 err <- SDL_Init(SDL_INIT_VIDEO) | |
311 if (err != 0) error("SDL_Init failed") | |
312 surface <- SDL_SetVideoMode(512,512,32,SDL_DOUBLEBUF+SDL_OPENGL) | |
313 } | |
314 | |
315 makeCubeDisplaylist <- function() | |
316 { | |
317 vertices <- c( | |
318 -1,-1,-1, | |
319 1,-1,-1, | |
320 -1, 1,-1, | |
321 1, 1,-1, | |
322 -1,-1, 1, | |
323 1,-1, 1, | |
324 -1, 1, 1, | |
325 1, 1, 1 | |
326 ) | |
327 | |
328 colors <- as.raw( col2rgb( rainbow(8) ) ) | |
329 | |
330 triangleIndices <- as.integer(c( | |
331 0, 2, 1, | |
332 2, 3, 1, | |
333 1, 3, 7, | |
334 1, 7, 5, | |
335 4, 5, 7, | |
336 4, 7, 6, | |
337 6, 2, 0, | |
338 6, 0, 4, | |
339 2, 7, 3, | |
340 2, 6, 7, | |
341 4, 0, 5, | |
342 0, 1, 5 | |
343 )) | |
344 | |
345 glEnableClientState(GL_VERTEX_ARRAY) | |
346 glVertexPointer(3, GL_DOUBLE, 0, rdcDataPtr(vertices) ) | |
347 | |
348 glEnableClientState(GL_COLOR_ARRAY) | |
349 glColorPointer(3, GL_UNSIGNED_BYTE, 0, rdcDataPtr(colors) ) | |
350 | |
351 displaylistId <- glGenLists(1) | |
352 glNewList( displaylistId, GL_COMPILE ) | |
353 glDrawElements(GL_TRIANGLES, 36L, GL_UNSIGNED_INT, rdcDataPtr(triangleIndices)) | |
354 glEndList() | |
355 | |
356 glDisableClientState(GL_VERTEX_ARRAY) | |
357 glDisableClientState(GL_COLOR_ARRAY) | |
358 | |
359 return(displaylistId) | |
360 } | |
361 #buffers <- integer(2) | |
362 #glGenBuffersARG(length(buffers), rdcDataPtr(buffers)) | |
363 #glBindBufferARB(GL_ARRAY_BUFFER_ARB, buffers[[1]] ) | |
364 #glBufferDataARB(GL_ARRAY_BUFFER_ARB, rdcSizeOf(typeof(vertices)) * length(vertices) , rdcDataPtr(vertices) ) | |
365 | |
366 | |
367 mainloop <- function() | |
368 { | |
369 displaylistId <- makeCubeDisplaylist() | |
370 eventobj <- malloc(256) | |
371 blink <- 0 | |
372 tbase <- SDL_GetTicks() | |
373 quit <- FALSE | |
374 while(!quit) | |
375 { | |
376 tnow <- SDL_GetTicks() | |
377 tdemo <- ( tnow - tbase ) / 1000 | |
378 | |
379 glClearColor(0,0,blink,0) | |
380 glClear(GL_COLOR_BUFFER_BIT) | |
381 | |
382 glMatrixMode(GL_PROJECTION) | |
383 glLoadIdentity() | |
384 aspect <- 512/512 | |
385 gluPerspective(60, aspect, 3, 1000) | |
386 | |
387 glMatrixMode(GL_MODELVIEW) | |
388 glLoadIdentity() | |
389 gluLookAt(0,0,5,0,0,0,0,1,0) | |
390 glRotated(sin(tdemo)*60.0, 0, 1, 0); | |
391 glRotated(cos(tdemo)*90.0, 1, 0, 0); | |
392 | |
393 glCallList(displaylistId) | |
394 | |
395 #glBegin(GL_TRIANGLES) | |
396 #glVertex3d(-1,-1,-1) | |
397 #glVertex3d( 1,-1,-1) | |
398 #glVertex3d( 1, 1,-1) | |
399 #glVertex3d(-1,-1,-1) | |
400 #glVertex3d( 1, 1,-1) | |
401 #glVertex3d(-1, 1,-1) | |
402 #glEnd() | |
403 | |
404 SDL_GL_SwapBuffers() | |
405 | |
406 SDL_WM_SetCaption(paste("time:", tdemo),0) | |
407 blink <- blink + 0.01 | |
408 while (blink > 1) blink <- blink - 1 | |
409 while( SDL_PollEvent(eventobj) != 0 ) | |
410 { | |
411 eventType <- rdcUnpack1(eventobj, 0L, "c") | |
412 if (eventType == SDL_QUIT) | |
413 quit <- TRUE | |
414 else if (eventType == SDL_MOUSEBUTTONDOWN) | |
415 { | |
416 button <- rdcUnpack1(eventobj, 1L, "c") | |
417 cat("button down: ",button,"\n") | |
418 } | |
419 } | |
420 glerr <- glGetError() | |
421 if (glerr != 0) | |
422 { | |
423 cat("GL Error:", glerr) | |
424 quit <- 1 | |
425 } | |
426 SDL_Delay(30) | |
427 } | |
428 free(eventobj) | |
429 #glDeleteLists(displaylistId, 1) | |
430 } | |
431 | |
432 cleanup <- function() | |
433 { | |
434 SDL_Quit() | |
435 } | |
436 | |
437 run <- function() | |
438 { | |
439 init() | |
440 mainloop() | |
441 } | |
442 # run() | |
443 |