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
129
130
|
project('themes', 'cpp',
version: '1.0.0',
default_options: [
'cpp_std=c++17',
'buildtype=release',
'warning_level=2'
]
)
# Emscripten link flags
emscripten_link_args = [
'-s', 'ALLOW_MEMORY_GROWTH=1',
'-s', 'USE_WEBGL2=1',
'-s', 'FULL_ES3=1',
'-s', 'WASM=1',
'-s', 'NO_EXIT_RUNTIME=1',
'-s', 'FETCH'
]
# Source files
sources = files(
# Main
'src/main.cpp',
'src/main_loop.cpp',
'src/mathlib.cpp',
'src/logger.cpp',
'src/shader.cpp',
'src/shader_fetcher.cpp',
'src/shapes_2d.cpp',
'src/webgl_context.cpp',
'src/renderer_2d.cpp',
'src/renderer_3d.cpp',
# Shaders
'src/shaders/renderer2d_frag.cpp',
'src/shaders/renderer2d_vert.cpp',
'src/shaders/renderer3d_frag.cpp',
'src/shaders/renderer3d_vert.cpp',
'src/shaders/sun_frag.cpp',
'src/shaders/sun_vert.cpp',
'src/shaders/snowflake_frag.cpp',
'src/shaders/snowflake_vert.cpp',
'src/shaders/grass_frag.cpp',
'src/shaders/grass_vert.cpp',
# Autumn theme
'src/autumn/autumn_theme.cpp',
'src/autumn/leaf_particle_render.cpp',
'src/autumn/tree_shape.cpp',
# Winter theme
'src/winter/winter_theme.cpp',
'src/winter/snowflake.cpp',
'src/winter/windfield.cpp',
# Spring theme
'src/spring/spring_theme.cpp',
'src/spring/grass_renderer.cpp',
# Summer theme
'src/summer/summer_theme.cpp'
)
# Include directories
inc = include_directories(
'src',
'src/autumn',
'src/winter',
'src/spring',
'src/summer',
'src/shaders',
'src/_shaders',
'src/tools'
)
# Custom target to build shaders from GLSL files
node = find_program('node')
shader_script = meson.project_source_root() + '/src/tools/shader.js'
# List all GLSL shader files as inputs
shader_inputs = files(
'src/_shaders/renderer2d.frag',
'src/_shaders/renderer2d.vert',
'src/_shaders/renderer3d.frag',
'src/_shaders/renderer3d.vert',
'src/_shaders/sun.frag',
'src/_shaders/sun.vert',
'src/_shaders/snowflake.frag',
'src/_shaders/snowflake.vert',
'src/_shaders/grass.frag',
'src/_shaders/grass.vert'
)
# Custom target that runs whenever shader files change
sh = find_program('sh')
build_shaders = custom_target('build_shaders',
input: shader_inputs,
output: 'shaders.stamp',
command: [sh, '-c', node.full_path() + ' ' + shader_script + ' && touch @OUTPUT@'],
build_always_stale: true,
build_by_default: true
)
# Build the executable
output_exe = executable('output',
sources,
include_directories: inc,
link_args: emscripten_link_args,
name_suffix: 'js'
)
# Custom target to copy output files to dist directory
copy_script = find_program('sh')
copy_to_dist = custom_target('copy_to_dist',
output: ['copy_to_dist.stamp'],
input: output_exe,
command: [
copy_script, '-c',
'mkdir -p ' + meson.project_source_root() + '/dist && ' +
'cp $1 ' + meson.project_source_root() + '/dist/output.js && ' +
'cp $2/output.wasm ' + meson.project_source_root() + '/dist/output.wasm && ' +
'touch $3',
'--', '@INPUT@', meson.current_build_dir(), '@OUTPUT@'
],
build_by_default: true,
install: false
)
# Add an alias target for convenience
alias_target('copy-dist', copy_to_dist)
|