1
0
mirror of https://github.com/lxsang/Diya-API.git synced 2024-12-27 03:48:21 +01:00

example of working SDL window

This commit is contained in:
Dany LE 2021-12-19 12:32:23 +01:00
parent 48fe04d362
commit 03d3a59560
5 changed files with 156 additions and 75 deletions

View File

@ -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.
].
]

View File

@ -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
]

View File

@ -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.

View File

@ -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))

View File

@ -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))
]