Thomas, you can attach a script in email here now if you first rename it with suffix “.txt” then attach that.
This allows readier save and execute by those wanting to run it. Just fyi…/Rob > On 2 Dec 2020, at 3:06 am, Thomas McGuire <[email protected]> wrote: > > That is the complete script > > Run sdlbmpevtex’’ after loading it. > If you mean the SDL2 dll mappings here they are (it’s not complete just what > I have done so far): > > NB. SDL utilities for OpenGL > require 'dll' > > void=: 0$'' > null=: <0 > > SDLDLL =: '/usr/local/lib/libSDL2.dylib' > > NB. SDL Constants > SDL_INIT_TIMER=: 16b00000001 > SDL_INIT_AUDIO=: 16b00000010 > SDL_INIT_VIDEO=: 16b00000020 NB. SDL_INIT_VIDEO implies SDL_INIT_EVENTS */ > SDL_INIT_JOYSTICK=: 16b00000200 NB. SDL_INIT_JOYSTICK implies SDL_INIT_EVENTS > */ > SDL_INIT_HAPTIC=: 16b00001000 > SDL_INIT_GAMECONTROLLER=: 16b00002000 NB. SDL_INIT_GAMECONTROLLER implies > SDL_INIT_JOYSTICK */ > SDL_INIT_EVENTS=: 16b00004000 > SDL_INIT_SENSOR=: 16b00008000 > SDL_INIT_NOPARACHUTE=: 16b00100000 NB. compatibility; this flag is ignored. */ > SDL_INIT_EVERYTHING=: SDL_INIT_TIMER +. SDL_INIT_AUDIO +. SDL_INIT_VIDEO | > SDL_INIT_EVENTS +. SDL_INIT_JOYSTICK +. SDL_INIT_HAPTIC +. > SDL_INIT_GAMECONTROLLER +. SDL_INIT_SENSOR > > SDL_WINDOW_OPENGL =: 16b00000002 > SDL_WINDOW_RESIZABLE =: 0x00000020 > > SDL_FIRSTEVENT =: 0 > SDL_QUIT =: 16b100 > SDL_APP_TERMINATING =: 16b101 > SDL_APP_LOWMEMORY =: 16b102 > SDL_APP_WILLENTERBACKGROUND =: 16b103 > SDL_APP_DIDENTERBACKGROUND =: 16b104 > SDL_APP_WILLENTERFOREGROUND =: 16b105 > SDL_APP_DIDENTERFOREGROUND =: 16b106 > > NB. Display events > SDL_DISPLAYEVENT=: 16b150 > NB. Window events > SDL_WINDOWEVENT =: 16b200 > SDL_SYSWMEVENT =: 16b201 > > NB. Keyboard events > SDL_KEYDOWN =: 16b300 > SDL_KEYUP =: 16b301 > SDL_TEXTEDITING =: 16b302 > SDL_TEXTINPUT =: 16b303 > SDL_KEYMAPCHANGED =: 16b304 > > NB. Mouse events > SDL_MOUSEMOTION =: 16b400 > SDL_MOUSEBUTTONDOWN =: 16b401 > SDL_MOUSEBUTTONUP =: 16b402 > SDL_MOUSEWHEEL =: 16b403 > > NB. Joystick events > SDL_JOYAXISMOTION =: 16b600 > SDL_JOYBALLMOTION =: 16b601 > SDL_JOYHATMOTION =: 16b602 > SDL_JOYBUTTONDOWN =: 16b603 > SDL_JOYBUTTONUP =: 16b604 > SDL_JOYDEVICEADDED =: 16b605 > SDL_JOYDEVICEREMOVED =: 16b606 > > NB. Controller events > SDL_CONTROLLERAXISMOTION =: 16b650 > SDL_CONTROLLERBUTTONDOWN =: 16b651 > SDL_CONTROLLERBUTTONUP =: 16b652 > SDL_CONTROLLERDEVICEADDED =: 16b653 > SDL_CONTROLLERDEVICEREMOVED =: 16b654 > SDL_CONTROLLERDEVICEREMAPPED =: 16b655 > > NB. Touch events > SDL_FINGERDOWN =: 16b700 > SDL_FINGERUP =: 16b701 > SDL_FINGERMOTION =: 16b702 > > NB. Gesture events > SDL_DOLLARGESTURE =: 16b800 > SDL_DOLLARRECORD =: 16b801 > SDL_MULTIGESTURE =: 16b802 > > NB. Clipboard events > SDL_CLIPBOARDUPDATE =: 16b900 > > NB. Drag and drop events > SDL_DROPFILE =: 16b1000 > SDL_DROPTEXT =: 16b1001 > SDL_DROPBEGIN =: 16b1002 > SDL_DROPCOMPLETE =: 16b1003 > > NB. Audio hotplug events > SDL_AUDIODEVICEADDED =: 16b1100 > SDL_AUDIODEVICEREMOVED =: 16b1101 > > NB. Sensor events > SDL_SENSORUPDATE =: 16b1200 > > NB. Render events > SDL_RENDER_TARGETS_RESET =: 16b2000 > SDL_RENDER_DEVICE_RESET =: 16b2001 > > NB. These are for your use, and should be allocated with SDL_RegisterEvents() > SDL_USEREVENT =: 16b8000 > SDL_LASTEVENT =: 16bffff > > NB. extern DECLSPEC int SDLCALL SDL_Init(Uint32 flags); > SDL_Init =: (SDLDLL, ' SDL_Init > i i')&cd > > NB. extern DECLSPEC int SDLCALL SDL_InitSubSystem(Uint32 flags); > SDL_InitSubSystem =: (SDLDLL, ' SDL_InitSubSystem i i')&cd > > NB. extern DECLSPEC void SDLCALL SDL_QuitSubSystem(Uint32 flags); > SDL_QuitSubSystem =: (SDLDLL, ' SDL_QuitSubSystem n i')&cd > > NB. extern DECLSPEC Uint32 SDLCALL SDL_WasInit(Uint32 flags); > SDL_WasInit =: (SDLDLL, ' SDL_WasInit i i')&cd > > NB. extern DECLSPEC void SDLCALL SDL_Quit(void); > SDL_Quit =: (SDLDLL, ' SDL_Quit n')&cd > > SDL_Delay =: (SDLDLL, ' SDL_Delay n i')&cd > > SDL_WINDOWPOS_UNDEFINED_MASK =: 16b1fff0000 > SDL_WINDOWPOS_UNDEFINED =: SDL_WINDOWPOS_UNDEFINED_MASK +. 0 > > NB. extern DECLSPEC SDL_Window * SDLCALL SDL_CreateWindow(const char *title, > NB. int x, int y, int w, > NB. int h, Uint32 flags); > SDL_CreateWindow =: (SDLDLL, ' SDL_CreateWindow * &c i i i i i')&cd > > NB. extern DECLSPEC SDL_Renderer * SDLCALL SDL_CreateRenderer(SDL_Window * > window, int index, Uint32 flags); > SDL_CreateRenderer =: (SDLDLL, ' SDL_CreateRenderer * * i i')&cd > > > SDL_SetRenderDrawColor =: (SDLDLL, ' SDL_SetRenderDrawColor n * i i i i')&cd > > SDL_RenderCopy =: (SDLDLL, ' SDL_RenderCopy n * * * *')&cd > > SDL_RenderClear =: (SDLDLL, ' SDL_RenderClear n *')&cd > > SDL_RenderPresent =: (SDLDLL, ' SDL_RenderPresent n *')&cd > > SDL_RenderDrawLine =: (SDLDLL, ' SDL_RenderDrawLine n * i i i i')&cd > SDL_DestroyRenderer =: (SDLDLL, ' SDL_DestroyRenderer n *')&cd > SDL_DestroyWindow =: (SDLDLL, ' SDL_DestroyWindow n *')&cd > SDL_DestroyTexture =: (SDLDLL, ' SDL_DestroyTexture n *')&cd > SDL_FreeSurface =: (SDLDLL, ' SDL_FreeSurface n *')&cd > > SDL_CreateTextureFromSurface =: (SDLDLL, ' SDL_CreateTextureFromSurface * * > *')&cd > > SDL_GL_CreateContext =: (SDLDLL, ' SDL_GL_CreateContext * *')&cd > SDL_GetWindowSurface =: (SDLDLL, ' SDL_GetWindowSurface * *')&cd > SDL_RWFromFile =: (SDLDLL, ' SDL_RWFromFile * *c *c')&cd > SDL_LoadBMP_RW =: (SDLDLL, ' SDL_LoadBMP_RW * * i')&cd > SDL_BlitSurface =: (SDLDLL, ' SDL_UpperBlit > i * * * *')&cd > SDL_GL_SwapWindow =: (SDLDLL, ' SDL_GL_SwapWindow n *')&cd > SDL_GL_DeleteContext =: (SDLDLL, ' SDL_GL_DeleteContext n *')&cd > SDL_GL_SwapInterval =: (SDLDLL, ' SDL_GL_SwapInterval n i')&cd > SDL_UpdateWindowSurface =: (SDLDLL, ' SDL_UpdateWindowSurface * *')&cd > > SDL_PollEvent =: (SDLDLL, ' SDL_PollEvent > i *')&cd > NB. SDL_LoadBMP is a macro to call 2 lower level routines > NB. The following will not work: > NB. SDL_LoadBMP =: (SDLDLL, ' SDL_LoadBMP * &c')&cd > NB. instead, it is recreated in J as a function call: > NB. it expects a boxed string fully qualified path and filename > NB. this keeps the calling convention of the dll consistent > SDL_LoadBMP =: 3 : 0 > Rwops =. {. SDL_RWFromFile y,<'rb' > SDL_LoadBMP_RW Rwops;1 > ) > >> On Dec 1, 2020, at 10:49 AM, bill lam <[email protected]> wrote: >> >> Can you attach a complete script for demo? Thanks >> >> On Tue, Dec 1, 2020, 6:42 PM Thomas McGuire <[email protected]> wrote: >> >>> Here is my code again so it stays within thread context >>> >>> NB. sdlbmpevtex.ijs - example of setting up a bitmap displayed in window >>> NB. under SDL with QUIT event processing >>> >>> load '~/j902-user/temp/sdl2.ijs' >>> >>> NB. SDL_Init <SDL_INIT_VIDEO >>> >>> >>> >>> >>> sdlbmpevtex =: 3 : 0 >>> NB. to handle events SDL needs 56 bytes of space to fit the >>> NB. event into. This is passed as a pointer. Defined globally >>> NB. needs to be freed when you quit the application >>> NB. Event loop variables >>> ev =: mema 56 >>> >>> NB. initialized pointer variables to be used with SDL2 dll >>> window =: null >>> bmpsurf =: null >>> texture =: null >>> renderer =: null >>> >>> NB. calls to setup SDL2 and create a window with bitmap >>> SDL_Init <SDL_INIT_EVERYTHING >>> >>> window =: {. SDL_CreateWindow 'SDL2 from J'; >>> SDL_WINDOWPOS_UNDEFINED;SDL_WINDOWPOS_UNDEFINED;660;480;0 >>> if. window = null do. >>> smoutput 'ERROR: failed to create window' >>> return. >>> end. >>> renderer =: {. SDL_CreateRenderer window; _1; 0 >>> if. renderer = null do. >>> smoutput 'ERROR: failed to create renderer' >>> return. >>> end. >>> >>> SDL_SetRenderDrawColor renderer; 0; 0; 0; 255 >>> SDL_RenderClear<renderer >>> NB. The SDL2 API call SDL_LoadBMP is a macro of 2 lower level >>> NB. calls. It is created as a Jfunction in this >>> bmpsurf=: {. SDL_LoadBMP >>> <'/Applications/j902/addons/graphics/bmp/toucan.bmp' >>> if. bmpsurf = null do. >>> smoutput 'ERROR: failed to load bitmap' >>> return. >>> end. >>> >>> texture =: {. SDL_CreateTextureFromSurface renderer; <bmpsurf >>> if. texture = null do. >>> smoutput 'ERROR: failed to create texture' >>> return. >>> end. >>> >>> SDL_FreeSurface <bmpsurf >>> bmpsurf =: null >>> >>> NB. Copy the texture to the renderer and present to the window >>> SDL_RenderCopy renderer;texture;null;<null >>> SDL_RenderPresent<renderer >>> >>> NB. set timer handler and start timer >>> sys_timer_z_ =: sdleventhdlr_base_ >>> wd 'timer 1000' >>> ) >>> >>> sdleventhdlr =: 3 : 0 >>> NB. Look for a quit event and call sdlfullquit and exit >>> NB. Stop the timer while we process (it avoid forever errors) >>> wd 'timer 0' >>> while. 0 ~: SDL_PollEvent <<ev do. >>> evtype =: {. 0 (3!:4) memr ev,0,32 >>> NB. smoutput 'evtype = ',":evtype >>> if. evtype = SDL_QUIT do. >>> NB. quit and return timer stays off >>> sdlfullquit'' >>> return. >>> end. >>> end. >>> >>> NB. restart the timer >>> wd 'timer 1000' >>> ) >>> >>> sdlfullquit =: 3 : 0 >>> SDL_DestroyTexture<texture >>> texture =: null >>> SDL_DestroyRenderer<renderer >>> renderer =: null >>> SDL_DestroyWindow <window >>> window =: null >>> SDL_Quit '' >>> memf ev >>> ev =: 0 >>> ) >>> >>> >>>> On Dec 1, 2020, at 5:33 AM, emacstheviking <[email protected]> wrote: >>>> >>>> For me, I have settled for being able to stop the event loop, edit the >>> code >>>> then resume the event loop where I left off and that's working well for >>> me. >>>> >>>> basically I have u (for UI!) -routines >>>> uprep'' >>>> ugo 0 means when SDL_QUIT is received, leave everything up, ugo 1 will >>>> call sdl_destroywindow and sdl_quit >>>> uend'' >>>> >>>> and some basic run./stop code: >>>> >>>> uend=: 3 : 0 >>>> sdl_freesurface sfc >>>> sdl_destroyrenderer^:(appr>0) appr >>>> sdl_destroywindow^:(appw>0) appw >>>> sdl_quit'' >>>> smoutput 'sdl shut down' >>>> 'appw appr'=: 0 0 >>>> ) >>>> >>>> ugo =: 3 : 0 >>>> sdlprep SCREEN_X_MAX;SCREEN_Y_MAX >>>> urun'' >>>> uend^:y '' >>>> ) >>>> >>>> On Tue, 1 Dec 2020 at 07:25, Thomas McGuire <[email protected]> >>> wrote: >>>> >>>>> I was glad to see some renewed interest in SDL2 and thank you to Raul >>>>> Miller for the suggestion of setting timer to run an event loop. I >>> haven’t >>>>> had the chance to try Bill Lam’s suggestion of creating a tight event >>> loop >>>>> under Jconsole yet. >>>>> >>>>> I have attached my code for a simple example that: >>>>> opens a window, >>>>> displays the toucan.bmp that comes with J, >>>>> and then allows you to quit by pressing the close window control on the >>>>> displayed window. >>>>> >>>>> The only gotcha at this point is that a subsequent rerun under Jqt, the >>>>> event system in SDL2 doesn’t register any events. So the app will hang >>> and >>>>> the window stays open. I have to quit Jqt entirely and restart to rerun >>> the >>>>> application properly. This is minimally annoying from a debugging stand >>>>> point. Jqt comes back up quickly enough after a shut down and coding >>> using >>>>> a dll library can cause its share of hanging the entire Jqt interface >>> when >>>>> mistakes in the dll wrapper are made. >>>>> >>>>> I presume I am running into threading/Jqt state issues or perhaps the >>> call >>>>> to SDL_Quit is not running like I think it is. At any rate for my >>> purposes >>>>> I am pretty happy with the result. It has been enhancing my >>> understanding >>>>> of Graphics/Game programming issues while I continue to work in J. >>>>> >>>>> >>>>> ---------------------------------------------------------------------- >>>>> For information about J forums see http://www.jsoftware.com/forums.htm >>>>> >>>> ---------------------------------------------------------------------- >>>> For information about J forums see http://www.jsoftware.com/forums.htm >>> >>> ---------------------------------------------------------------------- >>> For information about J forums see http://www.jsoftware.com/forums.htm >>> >> ---------------------------------------------------------------------- >> For information about J forums see http://www.jsoftware.com/forums.htm > > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm
