diff --git a/Diya/DiyaBoot.class.st b/Diya/DiyaBoot.class.st index c8eafb8..5086bc2 100644 --- a/Diya/DiyaBoot.class.st +++ b/Diya/DiyaBoot.class.st @@ -1,34 +1,148 @@ Class { #name : #DiyaBoot, #superclass : #DiyaBaseObject, - #category : #'Diya-Runtime' + #instVars : [ + 'running', + 'window', + 'renderer' + ], + #classVars : [ + 'singleton' + ], + #pools : [ + 'SDL2Constants', + 'SDL2Types' + ], + #category : #'Diya-Core' } -{ #category : #'system startup' } -DiyaBoot class >> getLoadedClasses [ - ^ SessionManager default startupList - collect: [ :c | - (c respondsTo: #registeredClass) - ifTrue: [ c registeredClass ] - ifFalse: [ c ] ] -] - -{ #category : #'system startup' } +{ #category : #'instance creation' } DiyaBoot class >> startUp: status [ - " - As is the entry point for Diya, it need to be disabled - when inside the SDK image. - " - ((Smalltalk globals at:#codeName ifAbsent:[nil]) = 'diya') ifFalse: [^self]. - self getLoadedClasses - do: [ :c | - Transcript - show: c className; - cr ]. self startx. ] -{ #category : #'system startup' } +{ #category : #'instance creation' } DiyaBoot class >> startx [ - DiyaInit uniqueInstance eventLoop + self uniqueInstance eventLoop +] + +{ #category : #'instance creation' } +DiyaBoot class >> uniqueInstance [ + singleton ifNil: [ singleton := self new ]. + ^ singleton +] + +{ #category : #events } +DiyaBoot >> checkDrivers [ + |ndriver usableDrivers| + ndriver := SDL2 SDLGetNumVideoDrivers. + usableDrivers := OrderedCollection new. + Transcript show: 'Available drivers: '. + 0 to: ndriver - 1 do: [ :i | |dname| + dname := SDL2 SDLGetVideoDriver: i. + Transcript show: dname, ' '. + (SDL2 SDLVideoInit: dname) = 0 ifTrue:[ + usableDrivers add: dname. + SDL2 SDLVideoQuit + ] + ]. + Transcript cr. + +] + +{ #category : #events } +DiyaBoot >> createRenderer [ + |numdriver rinfo| + numdriver := SDL2 SDLGetNumRenderDrivers. + Transcript show: 'SDL_RENDER_DRIVER available:'. + rinfo := SDL_RendererInfo externalNew autoRelease. + 0 to: numdriver - 1 do:[:i| + SDL2 SDLGetRendererDriverInfo: rinfo from: i. + Transcript show: rinfo name readString, ' '. + ]. + Transcript cr. + renderer := window primCreateRenderer: -1 flags: SDL_RENDERER_ACCELERATED. + renderer ifNil: [ ^self error: SDL2 getErrorMessage ]. + renderer primGetRendererInfo: rinfo. + Transcript show: 'SDL_RENDER_DRIVER selected: ', rinfo name readString;cr. + ^renderer + +] + +{ #category : #events } +DiyaBoot >> createWindow [ + |handle| + handle := SDL2 createWindow: 'Diya test' + x: 0 + y: 0 + width: 480 + height: 640 + flags: SDL_WINDOW_SHOWN. + handle ifNil: [ ^self error: SDL2 getErrorMessage ]. + "handle fullscreen: SDL_WINDOW_FULLSCREEN." + ^handle +] + +{ #category : #events } +DiyaBoot >> eventLoop [ + | dm| + self init. + Transcript show: 'Current selected video driver ', (SDL2 SDLGetCurrentVideoDriver); cr. + dm := SDL_DisplayMode externalNew autoRelease. + SDL2 SDLGetCurrentDisplayMode: dm from:0. + Transcript show: dm w asString, 'x',dm h asString;cr. + window := self createWindow. + renderer := self createRenderer. + self render: renderer. + renderer destroy. + window destroy. + SDL2 quit. + Transcript show: 'System quit' +] + +{ #category : #events } +DiyaBoot >> init [ + | tmp1 | + tmp1 := SDL2 init: SDL_INIT_EVERYTHING. + tmp1 = 0 + ifFalse: [ ^ self error: SDL2 getErrorMessage ] +] + +{ #category : #events } +DiyaBoot >> initialize [ + running := true +] + +{ #category : #events } +DiyaBoot >> processEvent: event [ + |mappedEvt| + mappedEvt := event mapped. + mappedEvt type = SDL_KEYDOWN ifTrue: [ Transcript show: 'keydown...'. running := false. ]. + mappedEvt type = SDL_QUIT ifTrue:[ running:= false ]. + mappedEvt type = SDL_FINGERDOWN ifTrue:[window warpMouseX:((mappedEvt x)* 480 )Y: ((mappedEvt y) * 640)]. + mappedEvt type = SDL_FINGERMOTION ifTrue:[window warpMouseX:((mappedEvt x)* 480 )Y: ((mappedEvt y) * 640)]. +] + +{ #category : #events } +DiyaBoot >> randomColorChannel [ + | rand | + rand := Random new. + rand := (rand next) * 255. + rand := rand asInteger. + ^ rand +] + +{ #category : #events } +DiyaBoot >> render: renderer [ + |event| + event := SDL_Event new. + [ running ] whileTrue: [ + [ (SDL2 pollEvent: event) > 0 ] whileTrue: [ + self processEvent: event + ]. + renderer drawColorR: self randomColorChannel g: self randomColorChannel b: self randomColorChannel a: 255. + renderer clear. + renderer present. + SDL2 delay: 50. + ]. ] diff --git a/Diya/DiyaInit.class.st b/Diya/DiyaInit.class.st deleted file mode 100644 index 2dd5d03..0000000 --- a/Diya/DiyaInit.class.st +++ /dev/null @@ -1,51 +0,0 @@ -Class { - #name : #DiyaInit, - #superclass : #Object, - #classVars : [ - 'singleton' - ], - #pools : [ - 'SDL2Constants', - 'SDL2Types' - ], - #category : #'Diya-Core' -} - -{ #category : #'instance creation' } -DiyaInit class >> uniqueInstance [ - singleton ifNil: [ singleton := self new ]. - ^ singleton -] - -{ #category : #events } -DiyaInit >> checkDrivers [ - |ndriver usableDrivers| - ndriver := SDL2 SDLGetNumVideoDrivers. - usableDrivers := OrderedCollection new. - Transcript show: 'Available drivers: '. - 0 to: ndriver - 1 do: [ :i | |dname| - dname := SDL2 SDLGetVideoDriver: i. - Transcript show: dname, ' '. - (SDL2 SDLVideoInit: dname) = 0 ifTrue:[ - usableDrivers add: dname. - SDL2 SDLVideoQuit - ] - ]. - Transcript cr. - -] - -{ #category : #events } -DiyaInit >> eventLoop [ - |status dm| - self checkDrivers. - status := SDL2 init: SDL_INIT_EVERYTHING. - status = 0 ifFalse:[ - ^ self error: SDL2 getErrorMessage. - ]. - Transcript show: 'Current selected video driver ', (SDL2 SDLGetCurrentVideoDriver); cr. - dm := SDL_DisplayMode new. - SDL2 SDLGetCurrentDisplayMode: dm from:0. - Transcript show: dm w asString, 'x',dm h asString;cr. - SDL2 quit -] diff --git a/Diya/ImageInitializer.class.st b/Diya/ImageInitializer.class.st index a4e0338..60435cc 100644 --- a/Diya/ImageInitializer.class.st +++ b/Diya/ImageInitializer.class.st @@ -89,7 +89,7 @@ ImageInitializer >> preloadSystem: loaded [ ImageInitializer >> snap [ Smalltalk globals at: #codeName put: 'diya'. self class removeFromSystem. - Smalltalk addToShutDownList: DiyaBoot. + Smalltalk addToStartUpList: DiyaBoot. Smalltalk garbageCollect. Smalltalk snapshot: true andQuit: true. diff --git a/Diya/SDL2.extension.st b/Diya/SDL2.extension.st index a41ae4c..aade18a 100644 --- a/Diya/SDL2.extension.st +++ b/Diya/SDL2.extension.st @@ -30,6 +30,11 @@ SDL2 class >> SDLGetNumVideoDrivers [ ] +{ #category : #'*Diya' } +SDL2 class >> SDLGetRendererDriverInfo: info from: index [ + ^self ffiCall: #(int SDL_GetRenderDriverInfo(int index, SDL_RendererInfo * info)) +] + { #category : #'*Diya' } SDL2 class >> SDLGetVideoDriver: index [ ^self ffiCall: #(const char* SDL_GetVideoDriver(int index)) diff --git a/Diya/SDL_Window.extension.st b/Diya/SDL_Window.extension.st new file mode 100644 index 0000000..15e4f1f --- /dev/null +++ b/Diya/SDL_Window.extension.st @@ -0,0 +1,13 @@ +Extension { #name : #'SDL_Window' } + +{ #category : #'*Diya' } +SDL_Window >> destroy [ + self primDestroy. + handle beNull +] + +{ #category : #'*Diya' } +SDL_Window >> warpMouseX:x Y:y [ + ^self ffiCall: #(void SDL_WarpMouseInWindow(self,int x, int y)) + +]