-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathmain.nim
128 lines (98 loc) · 3.15 KB
/
main.nim
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
import
events,
hashes,
os,
tables
import
bgfxdotnim,
sdl2 as sdl
import
frag,
frag/config,
frag/logger,
frag/graphics/camera,
frag/graphics/two_d/spritebatch,
frag/graphics/two_d/texture,
frag/graphics/types,
frag/modules/assets,
frag/sound/sound
type
App = ref object
batch: SpriteBatch
camera: Camera
assetIds: Table[string, Hash]
var assetsLoaded = false
var originalWidth, originalHeight: float
proc resize*(e: EventArgs) =
let event = SDLEventMessage(e).event
let sdlEventData = event.sdlEventData
let app = cast[App](event.userData)
app.camera.updateViewport(sdlEventData.window.data1.float, sdlEventData.window.data2.float)
proc initApp(app: App, ctx: Frag) =
log "Initializing app..."
ctx.events.on(SDLEventType.WindowResize, resize)
app.assetIds = initTable[string, Hash]()
let filename = "textures/test01.png"
let filename2 = "textures/test02.png"
logDebug "Loading assets..."
app.assetIds.add(filename, ctx.assets.load(filename, AssetType.Texture))
app.assetIds.add(filename2, ctx.assets.load(filename2, AssetType.Texture))
app.assetIds.add("sounds/test.ogg", ctx.assets.load("sounds/test.ogg", AssetType.Sound))
app.batch = SpriteBatch(
blendSrcFunc: BlendFunc.SrcAlpha,
blendDstFunc: BlendFunc.InvSrcAlpha,
blendingEnabled: true
)
app.batch.init(1000, 0)
let size = ctx.graphics.getSize()
originalWidth = size.x.float
originalHeight = size.y.float
app.camera = Camera()
app.camera.init(0)
app.camera.ortho(1.0, size.x.float, size.y.float)
while not assetsLoaded and not assets.update(ctx.assets):
continue
assetsLoaded = true
var sound = assets.get[Sound](ctx.assets, app.assetIds["sounds/test.ogg"])
sound.setGain(0.5)
sound.play()
log "App initialized."
proc updateApp(app:App, ctx: Frag, deltaTime: float) =
app.camera.update()
app.batch.setProjectionMatrix(app.camera.combined)
proc renderApp(app: App, ctx: Frag, deltaTime: float64) =
ctx.graphics.clearView(0, ClearMode.Color.ord or ClearMode.Depth.ord, 0x303030ff, 1.0, 0)
if assetsLoaded:
let tex = assets.get[Texture](ctx.assets, app.assetIds["textures/test01.png"])
let tex2 = assets.get[Texture](ctx.assets, app.assetIds["textures/test02.png"])
let size = ctx.graphics.getSize()
let HALF_WIDTH = originalWidth / 2
let HALF_HEIGHT = originalHeight / 2
let texHalfW = tex.data.w / 2
let texHalfH = tex.data.h / 2
app.batch.begin()
app.batch.draw(tex, HALF_WIDTH - texHalfW, HALF_HEIGHT - texHalfH, float tex.data.w, float tex.data.h)
app.batch.draw(tex2, HALF_WIDTH + texHalfW, HALF_HEIGHT - texHalfH, float tex.data.w, float tex.data.h)
app.batch.`end`()
proc shutdownApp(app: App, ctx: Frag) =
log "Shutting down app..."
log "App shut down."
{.emit: """
#include <SDL_main.h>
extern int cmdCount;
extern char** cmdLine;
extern char** gEnv;
N_CDECL(void, NimMain)(void);
int main(int argc, char** args) {
cmdLine = args;
cmdCount = argc;
gEnv = NULL;
NimMain();
return nim_program_result;
}
""".}
startFrag(App(), Config(
rootWindowTitle: "Frag Example 00-hello-world",
resetFlags: ResetFlag.None,
debugMode: BGFX_DEBUG_NONE
))