1
0
mirror of https://github.com/lxsang/Diya-API.git synced 2024-12-27 20:08:22 +01:00
Diya-API/Diya/DiyaBoot.class.st

290 lines
7.6 KiB
Smalltalk
Raw Normal View History

2021-12-18 02:02:16 +01:00
Class {
#name : #DiyaBoot,
2022-02-15 18:04:54 +01:00
#superclass : #DiyaSingleton,
2021-12-19 12:32:23 +01:00
#instVars : [
'running',
'window',
2021-12-20 01:14:35 +01:00
'context',
2022-02-15 18:04:54 +01:00
'display',
'clock'
2021-12-19 12:32:23 +01:00
],
#pools : [
2021-12-20 01:14:35 +01:00
'OpenGLConstants',
'OpenGLTypes',
2021-12-19 12:32:23 +01:00
'SDL2Constants',
'SDL2Types'
],
2021-12-19 16:15:10 +01:00
#category : #'Diya-Runtime'
2021-12-18 02:02:16 +01:00
}
2022-03-06 18:33:10 +01:00
{ #category : #'instance creation' }
DiyaBoot class >> maxFPS [
^60
]
2021-12-19 12:32:23 +01:00
{ #category : #'instance creation' }
2021-12-18 02:02:16 +01:00
DiyaBoot class >> startUp: status [
2021-12-18 22:49:03 +01:00
self startx.
2021-12-18 02:02:16 +01:00
]
2021-12-19 12:32:23 +01:00
{ #category : #'instance creation' }
2021-12-18 22:49:03 +01:00
DiyaBoot class >> startx [
2021-12-19 16:15:10 +01:00
self uniqueInstance run
2021-12-19 12:32:23 +01:00
]
{ #category : #events }
DiyaBoot >> GLinit. [
OpenGL viewportX: 0 Y:0 W: display w H: display h.
OpenGL enable: GL_TEXTURE_2D.
]
2021-12-20 01:14:35 +01:00
{ #category : #events }
DiyaBoot >> createGLContext [
context := SDL2 glCreateContext: window.
context ifNil: [ ^self error: SDL2 getErrorMessage ].
^context
]
2021-12-19 12:32:23 +01:00
{ #category : #events }
DiyaBoot >> createWindow [
2022-03-16 01:32:01 +01:00
SDL2
glSetAttribute: SDL_GL_MULTISAMPLEBUFFERS value: 1;
glSetAttribute: SDL_GL_MULTISAMPLESAMPLES value: 2.
OpenGL enable: GL_MULTISAMPLE.
2021-12-20 01:14:35 +01:00
window := SDL2 createWindow: 'Diya'
2021-12-19 12:32:23 +01:00
x: 0
y: 0
2021-12-19 16:15:10 +01:00
width: display w
height: display h
2021-12-20 01:14:35 +01:00
flags: SDL_WINDOW_SHOWN | SDL_WINDOW_OPENGL.
window ifNil: [ ^self error: SDL2 getErrorMessage ].
2021-12-19 12:32:23 +01:00
"handle fullscreen: SDL_WINDOW_FULLSCREEN."
2022-03-04 20:28:38 +01:00
"SDL2 glSetAttribute: SDL_GL_CONTEXT_PROFILE_MASK value: SDL_GL_CONTEXT_PROFILE_ES.
SDL2 glSetAttribute: SDL_GL_CONTEXT_MAJOR_VERSION value: 2.
SDL2 glSetAttribute: SDL_GL_CONTEXT_MINOR_VERSION value: 0.
SDL2 glSetAttribute: SDL_GL_ACCELERATED_VISUAL value: 1."
"SDL2 glSetAttribute: SDL_GL_DOUBLEBUFFER value: 1.
SDL2 glSetAttribute: SDL_GL_DEPTH_SIZE value: 24."
2021-12-20 01:14:35 +01:00
^window
2021-12-19 12:32:23 +01:00
]
2022-03-06 18:33:10 +01:00
{ #category : #events }
DiyaBoot >> exampleNodes [
2022-03-16 01:32:01 +01:00
|root node style|
2022-03-06 18:33:10 +01:00
root := DiyaRootNode new.
2022-03-16 01:32:01 +01:00
node := root addNode: (DiyaRectangle size: 200@200) at: 250 @ 430.
node texture: (DiyaImageTex fromFile:Smalltalk imageDirectory / 'assets'/'mrsang.png').
node color: (Color r: 1.0 g:1.0 b:1.0 alpha:1.0 ).
node borderColor: Color red.
node borderWidth: 3.0.
2022-03-08 23:30:01 +01:00
style := DiyaFontManager uniqueInstance style: 'Bold' from:'Ubuntu'.
2022-03-16 01:32:01 +01:00
node := root addNode: (DiyaRectangle size: 208@288) at: 250 @ 50.
node color: (Color orange).
node texture: (style textureOf: 20).
node borderColor: Color red.
node borderWidth: 3.0.
node := root addNode: (DiyaRectangle size:100@150 shader: DiyaExampleShader uniqueInstance) at: 20 @ 400.
node rotation: (Float pi / -8.0).
node scale: 1.5@1.5.
node := root addNode: (DiyaText data: String loremIpsum) at: 10@340.
node extent: 230@320.
node wordWrap: true.
node := root addNode: (DiyaLine from: 10@620 to: 200@635).
node color: (Color red).
node borderWidth: 2.0.
2022-03-08 23:30:01 +01:00
2022-03-16 01:32:01 +01:00
node := root addNode: (DiyaCircle r: 100) at: 200@200.
node borderColor: Color red.
node borderWidth: 2.0.
"node rotation:(Float pi / 4.0)."
2022-03-06 18:33:10 +01:00
^ root
]
2021-12-19 12:32:23 +01:00
{ #category : #events }
DiyaBoot >> init [
2021-12-19 22:17:29 +01:00
| status |
2022-03-04 20:28:38 +01:00
SDL2 setHint: 'SDL_RENDER_DRIVER' value: 'opengles2'.
2021-12-19 16:15:10 +01:00
status := SDL2 init: SDL_INIT_EVERYTHING.
2022-03-03 23:23:43 +01:00
status = 0
2021-12-19 16:15:10 +01:00
ifFalse: [ ^ self error: SDL2 getErrorMessage ].
2021-12-19 22:17:29 +01:00
display := SDL_DisplayMode externalNew autoRelease.
SDL2 SDLGetCurrentDisplayMode: display from:0.
DiyaRendererContext reset.
2022-03-06 12:07:20 +01:00
DiyaFontManager reset.
OpenGLSL resetShaders.
2022-03-03 19:19:40 +01:00
DiyaFontManager uniqueInstance loadFonts.
2021-12-19 12:32:23 +01:00
]
{ #category : #events }
DiyaBoot >> initialize [
running := true.
display := nil.
window := nil.
2021-12-20 01:14:35 +01:00
context := nil.
2022-02-15 18:04:54 +01:00
clock := DiyaClock uniqueInstance.
2021-12-19 12:32:23 +01:00
]
{ #category : #events }
DiyaBoot >> processEvent: event [
|mappedEvt|
mappedEvt := event mapped.
mappedEvt type = SDL_KEYDOWN ifTrue: [ Transcript show: 'keydown...';cr. ^running := false. ].
2021-12-19 20:03:54 +01:00
mappedEvt type = SDL_QUIT ifTrue:[ ^running:= false ].
mappedEvt type = SDL_FINGERDOWN ifTrue:[^self setCursorPosition: mappedEvt ].
mappedEvt type = SDL_FINGERMOTION ifTrue:[^self setCursorPosition: mappedEvt ].
mappedEvt type = SDL_MOUSEMOTION ifTrue:[DiyaRendererContext uniqueInstance mouse: (mappedEvt x) @ (mappedEvt y)].
2022-03-15 19:11:19 +01:00
mappedEvt free.
2021-12-19 12:32:23 +01:00
]
{ #category : #events }
DiyaBoot >> randomColorChannel [
| rand |
rand := Random new.
rand := (rand next) * 255.
rand := rand asInteger.
^ rand
]
{ #category : #events }
2021-12-19 16:15:10 +01:00
DiyaBoot >> render [
2022-03-16 01:32:01 +01:00
|event root text delta fps maxfps minfps|
2021-12-19 12:32:23 +01:00
event := SDL_Event new.
2022-03-06 18:33:10 +01:00
root := self exampleNodes.
DiyaRenderer uniqueInstance root: root.
2022-03-16 01:32:01 +01:00
text := root addNode:(DiyaText data: 'tick') at: (display w - 250)@40.
text extent: 250@40.
2022-03-06 18:33:10 +01:00
text fontSize: 20.
text color: Color red.
2022-03-15 19:11:19 +01:00
DiyaRendererContext uniqueInstance.
self GLinit.
2022-03-16 01:32:01 +01:00
fps := maxfps := 0.
minfps := self class maxFPS.
2022-03-03 23:23:43 +01:00
[ running ] whileTrue: [
2022-03-06 18:33:10 +01:00
delta := DiyaClock uniqueInstance delta asMilliSeconds.
2022-03-16 01:32:01 +01:00
fps := ((1000/delta) asInteger).
maxfps := maxfps max: fps.
minfps := minfps min: fps.
text data: ('FPS:', fps asString, '(Min ', minfps asString, ', max ', maxfps asString, ')').
2022-03-06 18:33:10 +01:00
DiyaClock uniqueInstance tick.
[(SDL2 pollEvent: event) > 0] whileTrue: [
2021-12-19 12:32:23 +01:00
self processEvent: event
].
DiyaRenderer uniqueInstance render.
2022-03-15 19:11:19 +01:00
2021-12-20 01:14:35 +01:00
SDL2 glSwapWindow: window.
2022-03-06 18:33:10 +01:00
delta := DiyaClock uniqueInstance delta asMilliSeconds.
SDL2 delay: (0 max: (1000/ self class maxFPS) asInteger - delta). "60 fps"
2022-02-13 17:15:23 +01:00
].
]
2021-12-19 16:15:10 +01:00
{ #category : #events }
DiyaBoot >> run [
self init.
2021-12-19 22:17:29 +01:00
self startx.
2021-12-19 20:03:54 +01:00
]
2021-12-19 22:17:29 +01:00
{ #category : #running }
2021-12-19 20:03:54 +01:00
DiyaBoot >> run: screenSize [
2021-12-19 22:17:29 +01:00
self run: screenSize app: nil
]
{ #category : #running }
DiyaBoot >> run: screenSize app: application [
"
this function should be used only in
SDK environment, in real embeded system
it is always the #run command that is executed
automatically.
"
2021-12-20 01:14:35 +01:00
OpenGLTypes initialize.
OpenGLConstants initialize.
2021-12-19 20:03:54 +01:00
self init.
display w: screenSize x.
display h: screenSize y.
self startx.
self class reset.
2022-02-15 18:04:54 +01:00
DiyaClock reset.
DiyaRendererContext reset.
Smalltalk garbageCollect.
2021-12-19 20:03:54 +01:00
]
{ #category : #events }
DiyaBoot >> setCursorPosition: mappedEvt [
window warpMouseX:((mappedEvt x)* (display w) )
Y: ((mappedEvt y) * (display h))
]
2021-12-19 22:17:29 +01:00
{ #category : #logging }
DiyaBoot >> showSystemInfo [
|stream numdriver rinfo|
stream := (String new: 255) writeStream.
2021-12-19 22:17:29 +01:00
stream nextPutAll:'System: ';
nextPutAll:(Smalltalk globals at: #CODENAME ifAbsent:['']);
nextPutAll: '-v';
nextPutAll:(Smalltalk globals at: #VERSION ifAbsent: ['']);cr.
numdriver := SDL2 SDLGetNumVideoDrivers.
stream nextPutAll: 'Supported video dirvers:'.
0 to: numdriver -1 do: [ :i |
stream nextPutAll: (SDL2 SDLGetVideoDriver: i); nextPutAll: ' '.
].
stream cr.
stream nextPutAll: 'Current selected video driver: ';
nextPutAll:(SDL2 SDLGetCurrentVideoDriver);cr.
numdriver := SDL2 SDLGetNumRenderDrivers.
stream nextPutAll: 'SDL_RENDER_DRIVER available:'.
rinfo := SDL_RendererInfo externalNew autoRelease.
0 to: numdriver - 1 do:[:i|
SDL2 SDLGetRendererDriverInfo: rinfo from: i.
stream nextPutAll: rinfo name readString; nextPutAll:' '.
].
stream cr.
stream nextPutAll:'Display resolution: ';
nextPutAll:display w asString;
nextPutAll: 'x';
nextPutAll: display h asString; cr.
self stdout nextPutAll: stream contents
2021-12-19 22:17:29 +01:00
]
2021-12-19 20:03:54 +01:00
{ #category : #events }
DiyaBoot >> startx [
display ifNil: [ ^self error: 'Please run #init before this method' ].
2021-12-20 01:14:35 +01:00
self createWindow.
self createGLContext.
2022-03-15 19:11:19 +01:00
"SDL2 glMakeCurrent: window context: context."
2021-12-19 22:17:29 +01:00
self showSystemInfo.
2022-03-15 19:11:19 +01:00
DiyaRendererContext
uniqueInstance display: display;
useProjection: OrthoProjectionMatrix.
self render.
2021-12-20 01:14:35 +01:00
context delete.
2021-12-19 16:15:10 +01:00
window destroy.
2022-03-01 19:22:26 +01:00
DiyaFontManager reset.
DiyaRendererContext reset.
2021-12-19 16:15:10 +01:00
SDL2 quit.
]
2021-12-20 01:14:35 +01:00
{ #category : #events }
DiyaBoot >> step [
"renderer drawColorR: 0
g: 0
b: 0
a: 255."
2021-12-20 01:14:35 +01:00
OpenGL begin: GL_TRIANGLES.
"draw a simple triangle here"
OpenGL color3fR: 0.1 G:0.2 B: 0.3.
OpenGL vertex3fX: 0 Y: 0 Z: 0.
OpenGL vertex3fX: 1 Y: 0 Z: 0.
OpenGL vertex3fX: 0 Y: 1 Z: 0.
OpenGL end.
]