summaryrefslogtreecommitdiff
path: root/themes/meson.build
blob: 1e4c9f1c74e771dd00bd99c33fa063dcc985697a (plain)
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
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',

  # 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'
)

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