Moved to SFML 3.0 now.

main
Zed A. Shaw 11 months ago
parent 7c56f350ab
commit e05b2c304c
  1. 55
      gui.cpp
  2. 12
      gui.hpp
  3. 61
      meson.build
  4. 58
      render.cpp
  5. 24
      render.hpp
  6. 14
      scratchpad/img2ansi.cpp
  7. 25
      sound.cpp
  8. 6
      sound.hpp
  9. 32
      tools/designer.cpp
  10. 15
      tools/fontextract.cpp
  11. 13
      wraps/openal-soft.wrap
  12. 23
      wraps/sfml.wrap

@ -312,42 +312,42 @@ void GUI::shutdown() {
bool GUI::game_ui_events() { bool GUI::game_ui_events() {
auto& world = *$level.world; auto& world = *$level.world;
using KB = sf::Keyboard; using KB = sf::Keyboard::Key;
auto player = world.get_the<Player>(); auto player = world.get_the<Player>();
int map_font_size = $renderer.font_size(); int map_font_size = $renderer.font_size();
auto& player_motion = world.get<Motion>(player.entity); auto& player_motion = world.get<Motion>(player.entity);
bool event_happened = false; bool event_happened = false;
if(KB::isKeyPressed(KB::Left)) { if(sf::Keyboard::isKeyPressed(KB::Left)) {
player_motion.dx = -1; player_motion.dx = -1;
event_happened = true; event_happened = true;
} else if(KB::isKeyPressed(KB::Right)) { } else if(sf::Keyboard::isKeyPressed(KB::Right)) {
player_motion.dx = 1; player_motion.dx = 1;
event_happened = true; event_happened = true;
} else if(KB::isKeyPressed(KB::Up)) { } else if(sf::Keyboard::isKeyPressed(KB::Up)) {
player_motion.dy = -1; player_motion.dy = -1;
event_happened = true; event_happened = true;
} else if(KB::isKeyPressed(KB::Down)) { } else if(sf::Keyboard::isKeyPressed(KB::Down)) {
player_motion.dy = 1; player_motion.dy = 1;
event_happened = true; event_happened = true;
} else if(KB::isKeyPressed(KB::Equal)) { } else if(sf::Keyboard::isKeyPressed(KB::Equal)) {
resize_map(map_font_size + 10); resize_map(map_font_size + 10);
} else if(KB::isKeyPressed(KB::Hyphen)) { } else if(sf::Keyboard::isKeyPressed(KB::Hyphen)) {
resize_map(map_font_size - 10); resize_map(map_font_size - 10);
} else if(KB::isKeyPressed(KB::L)) { } else if(sf::Keyboard::isKeyPressed(KB::L)) {
auto &debug = world.get_the<Debug>(); auto &debug = world.get_the<Debug>();
debug.LIGHT = !debug.LIGHT; debug.LIGHT = !debug.LIGHT;
} else if(KB::isKeyPressed(KB::I)) { } else if(sf::Keyboard::isKeyPressed(KB::I)) {
toggle_modal(&$inventory_ui, $inventory_open); toggle_modal(&$inventory_ui, $inventory_open);
} else if(KB::isKeyPressed(KB::P)) { } else if(sf::Keyboard::isKeyPressed(KB::P)) {
auto &debug = world.get_the<Debug>(); auto &debug = world.get_the<Debug>();
debug.PATHS = !debug.PATHS; debug.PATHS = !debug.PATHS;
} else if(KB::isKeyPressed(KB::S)) { } else if(sf::Keyboard::isKeyPressed(KB::S)) {
save_world(); save_world();
} else if(KB::isKeyPressed(KB::Tab)) { } else if(sf::Keyboard::isKeyPressed(KB::Tab)) {
$status_ui.key_press(Event::Tab); $status_ui.key_press(Event::Tab);
} else if(KB::isKeyPressed(KB::Enter)) { } else if(sf::Keyboard::isKeyPressed(KB::Enter)) {
$status_ui.key_press(Event::Return); $status_ui.key_press(Event::Return);
} }
@ -356,17 +356,17 @@ bool GUI::game_ui_events() {
bool GUI::modal_ui_events() { bool GUI::modal_ui_events() {
using KB = sf::Keyboard; using KB = sf::Keyboard::Key;
bool event_happened = false; bool event_happened = false;
for(Panel *panel : $active_panels) { for(Panel *panel : $active_panels) {
if(KB::isKeyPressed(KB::Tab)) { if(sf::Keyboard::isKeyPressed(KB::Tab)) {
event_happened = true; event_happened = true;
panel->key_press(Event::Tab); panel->key_press(Event::Tab);
} else if(KB::isKeyPressed(KB::Enter)) { } else if(sf::Keyboard::isKeyPressed(KB::Enter)) {
event_happened = true; event_happened = true;
panel->key_press(Event::Return); panel->key_press(Event::Return);
} else if(KB::isKeyPressed(KB::Escape)) { } else if(sf::Keyboard::isKeyPressed(KB::Escape)) {
// BUG: this is dogshit, rewerite it // BUG: this is dogshit, rewerite it
if($inventory_open) { if($inventory_open) {
toggle_modal(panel, $inventory_open); toggle_modal(panel, $inventory_open);
@ -378,15 +378,13 @@ bool GUI::modal_ui_events() {
} }
bool GUI::handle_ui_events() { bool GUI::handle_ui_events() {
using MOUSE = sf::Mouse;
bool event_happened = false; bool event_happened = false;
sf::Event event;
Point pos; Point pos;
while($renderer.poll_event(event)) { while(const auto event = $renderer.poll_event()) {
if(event.type == sf::Event::Closed) { if(event->is<sf::Event::Closed>()) {
shutdown(); shutdown();
} else if(event.type == sf::Event::KeyPressed) { } else if(event->is<sf::Event::KeyPressed>()) {
if($modal_shown) { if($modal_shown) {
event_happened = modal_ui_events(); event_happened = modal_ui_events();
} else { } else {
@ -395,7 +393,7 @@ bool GUI::handle_ui_events() {
} else { } else {
for(Panel *panel : $active_panels) { for(Panel *panel : $active_panels) {
if($renderer.mouse_position(*panel, pos)) { if($renderer.mouse_position(*panel, pos)) {
if(MOUSE::isButtonPressed(MOUSE::Left)) { if(sf::Mouse::isButtonPressed(sf::Mouse::Button::Left)) {
panel->mouse_click(Mouse::Button::Left, pos); panel->mouse_click(Mouse::Button::Left, pos);
event_happened = true; event_happened = true;
} else { } else {
@ -410,23 +408,12 @@ bool GUI::handle_ui_events() {
} }
void GUI::init_shaders() { void GUI::init_shaders() {
auto& shader = $paused.load_shader("./shaders/modal.frag");
shader.setUniform("offsetFactor", sf::Glsl::Vec2{0.001f, 0.001f});
shader.setUniform("darkness", 0.05f);
} }
void GUI::pause_screen() { void GUI::pause_screen() {
auto &window = $renderer.$window;
auto size = window.getSize();
$paused.texture.create(size.x, size.y);
$paused.texture.update(window);
$paused.sprite.setTexture($paused.texture);
$paused.sprite.setPosition(0,0);
} }
void GUI::draw_paused() { void GUI::draw_paused() {
$renderer.draw_sprite($paused.sprite, &$paused.shader);
} }
void GUI::run_systems() { void GUI::run_systems() {

@ -36,17 +36,6 @@ struct ActionLog {
} }
}; };
struct UnDumbTSS {
sf::Texture texture;
sf::Sprite sprite;
sf::Shader shader;
sf::Shader& load_shader(string filename) {
bool good = shader.loadFromFile(filename, sf::Shader::Fragment);
dbc::check(good, "shader could not be loaded");
return shader;
}
};
class DeathUI : public Panel { class DeathUI : public Panel {
public: public:
@ -143,7 +132,6 @@ class GUI {
Component $test_button; Component $test_button;
SoundManager $sounds; SoundManager $sounds;
SFMLRender $renderer; SFMLRender $renderer;
UnDumbTSS $paused;
std::vector<Panel*> $active_panels; std::vector<Panel*> $active_panels;
public: public:

@ -1,20 +1,47 @@
project('roguish', 'cpp', project('roguish', 'cpp',
default_options: [ 'cpp_std=c++20' ]) default_options: [
'cpp_std=c++20',
'cpp_args=-D_GLIBCXX_DEBUG=1 -D_GLIBCXX_DEBUG_PEDANTIC=1',
])
# use this for common options only for our executables
cpp_args=[]
# these are passed as override_defaults
exe_defaults = ['warning_level=2', 'werror=true']
cc = meson.get_compiler('cpp')
catch2 = dependency('catch2-with-main') catch2 = dependency('catch2-with-main')
fmt = dependency('fmt') fmt = dependency('fmt', allow_fallback: true)
json = dependency('nlohmann_json') json = dependency('nlohmann_json')
ftxui_screen = dependency('ftxui-screen') ftxui_screen = dependency('ftxui-screen')
ftxui_dom = dependency('ftxui-dom') ftxui_dom = dependency('ftxui-dom')
ftxui_component = dependency('ftxui-component') ftxui_component = dependency('ftxui-component')
sfml = dependency('sfml')
freetype2 = dependency('freetype2')
thread_dep = dependency('threads') thread_dep = dependency('threads')
freetype2 = dependency('freetype2')
opengl32 = cc.find_library('opengl32', required: true)
winmm = cc.find_library('winmm', required: true)
gdi32 = cc.find_library('gdi32', required: true)
flac = dependency('flac')
ogg = dependency('ogg')
vorbis = dependency('vorbis')
vorbisfile = dependency('vorbisfile')
vorbisenc = dependency('vorbisenc')
sfml_audio = dependency('sfml_audio')
sfml_graphics = dependency('sfml_graphics')
sfml_main = dependency('sfml_main')
sfml_network = dependency('sfml_network')
sfml_system = dependency('sfml_system')
sfml_window = dependency('sfml_window')
dependencies = [ dependencies = [
fmt, ftxui_screen, ftxui_dom, ftxui_screen, ftxui_dom, ftxui_component,
ftxui_component, json, thread_dep, fmt, json, opengl32, freetype2,
sfml, freetype2, thread_dep flac, ogg, vorbis, vorbisfile, vorbisenc,
winmm, gdi32, sfml_audio, sfml_graphics,
sfml_main, sfml_network, sfml_system,
sfml_window
] ]
source=[ source=[
@ -65,12 +92,15 @@ runtests = executable('runtests',
'tests/worldbuilder.cpp', 'tests/worldbuilder.cpp',
'tests/inventory.cpp', 'tests/inventory.cpp',
'tests/matrix2.cpp', 'tests/matrix2.cpp',
], cpp_args:['-Wextra','-Werror'], ],
dependencies: dependencies + catch2) cpp_args: cpp_args,
override_options: exe_defaults,
dependencies: dependencies + [catch2])
roguish = executable('roguish', roguish = executable('roguish',
source + ['main.cpp'], source + ['main.cpp'],
cpp_args:['-Wextra','-Werror'], cpp_args: cpp_args,
override_options: exe_defaults,
dependencies: dependencies) dependencies: dependencies)
designer = executable('designer', [ designer = executable('designer', [
@ -83,16 +113,19 @@ designer = executable('designer', [
'panel.cpp', 'panel.cpp',
'pathing.cpp', 'pathing.cpp',
'lights.cpp', 'lights.cpp',
'tools/designer.cpp' 'tools/designer.cpp'],
], cpp_args:['-Wextra','-Werror'], cpp_args: cpp_args,
override_options: exe_defaults,
dependencies: dependencies) dependencies: dependencies)
fontextract = executable('fontextract', [ fontextract = executable('fontextract', [
'dbc.cpp', 'dbc.cpp',
'rand.cpp', 'rand.cpp',
'config.cpp', 'config.cpp',
'tools/fontextract.cpp' 'tools/fontextract.cpp',
], ],
cpp_args: cpp_args,
override_options: exe_defaults,
dependencies: dependencies) dependencies: dependencies)
img2ansi = executable('img2ansi', [ img2ansi = executable('img2ansi', [
@ -102,6 +135,8 @@ img2ansi = executable('img2ansi', [
'render.cpp', 'render.cpp',
'scratchpad/img2ansi.cpp' 'scratchpad/img2ansi.cpp'
], ],
cpp_args: cpp_args,
override_options: exe_defaults,
dependencies: dependencies) dependencies: dependencies)
test('tests', runtests) test('tests', runtests)

@ -16,24 +16,25 @@
using namespace fmt; using namespace fmt;
SFMLRender::SFMLRender() : SFMLRender::SFMLRender() :
$window(sf::VideoMode($config.video_x,$config.video_y), "Roguish"), $window(sf::VideoMode({$config.video_x, $config.video_y}), "Roguish"),
$map_font_size(0), $map_font_size(0),
$line_spacing(0), $line_spacing(0),
$default_fg(ColorValue::LIGHT_MID), $default_fg(ColorValue::LIGHT_MID),
$default_bg(ColorValue::BLACK), $default_bg(ColorValue::BLACK),
$bg_sprite($font_texture),
$font(FONT_FILE_NAME),
$ui_text($font),
$ansi($default_fg, $default_bg) $ansi($default_fg, $default_bg)
{ {
// force true color, but maybe I want to support different color sets // force true color, but maybe I want to support different color sets
$font.loadFromFile(FONT_FILE_NAME);
$font.setSmooth(false); $font.setSmooth(false);
$ui_text.setFont($font); $ui_text.setPosition({0,0});
$ui_text.setPosition(0,0);
$ui_text.setCharacterSize($config.ui_font_size); $ui_text.setCharacterSize($config.ui_font_size);
$ui_text.setFillColor(ColorValue::LIGHT_MID); $ui_text.setFillColor(ColorValue::LIGHT_MID);
sf::Glyph glyph = $font.getGlyph($config.ui_base_char, $config.ui_font_size, false); sf::Glyph glyph = $font.getGlyph($config.ui_base_char, $config.ui_font_size, false);
$text_bounds = glyph.bounds; $text_bounds = glyph.bounds;
$cells_w = std::ceil($config.video_x / $text_bounds.width); $cells_w = std::ceil($config.video_x / $text_bounds.size.x);
$cells_h = std::ceil($config.video_y / $text_bounds.height); $cells_h = std::ceil($config.video_y / $text_bounds.size.y);
} }
sf::Sprite &SFMLRender::get_text_sprite(wchar_t tile) { sf::Sprite &SFMLRender::get_text_sprite(wchar_t tile) {
@ -43,17 +44,16 @@ sf::Sprite &SFMLRender::get_text_sprite(wchar_t tile) {
// the glyphs on the font texture, so this gets loaded each time // the glyphs on the font texture, so this gets loaded each time
// we get a new glyph from the font. // we get a new glyph from the font.
$font_texture = $font.getTexture($map_font_size); $font_texture = $font.getTexture($map_font_size);
sf::Sprite sprite($font_texture); $sprites.try_emplace(tile, $font_texture, glyph.textureRect);
sprite.setTextureRect(glyph.textureRect);
$sprites[tile] = sprite;
} }
return $sprites[tile]; return $sprites.at(tile);
} }
void SFMLRender::clear_cache() { void SFMLRender::clear_cache() {
$sprites.clear(); $sprites.clear();
$font.loadFromFile("./assets/text.otf"); bool good = $font.openFromFile(FONT_FILE_NAME);
dbc::check(good, "Failed to load the font.");
$font.setSmooth(false); $font.setSmooth(false);
$ui_text.setFont($font); $ui_text.setFont($font);
} }
@ -62,14 +62,14 @@ void SFMLRender::center_panel(Panel &panel) {
int cell_center_x = ($cells_w - panel.width) / 2; int cell_center_x = ($cells_w - panel.width) / 2;
int cell_center_y = ($cells_h - panel.height) / 2; int cell_center_y = ($cells_h - panel.height) / 2;
panel.x = cell_center_x * $text_bounds.width; panel.x = cell_center_x * $text_bounds.size.x;
panel.y = cell_center_y * $text_bounds.height; panel.y = cell_center_y * $text_bounds.size.y;
} }
void SFMLRender::resize_grid(int new_size, Panel &panel_out) { void SFMLRender::resize_grid(int new_size, Panel &panel_out) {
auto glyph = $font.getGlyph($config.bg_tile, new_size, false); auto glyph = $font.getGlyph($config.bg_tile, new_size, false);
int view_x = std::ceil(($config.video_x - panel_out.x) / glyph.bounds.width); int view_x = std::ceil(($config.video_x - panel_out.x) / glyph.bounds.size.x);
int view_y = std::ceil(($config.video_y - panel_out.y) / glyph.bounds.height); int view_y = std::ceil(($config.video_y - panel_out.y) / glyph.bounds.size.y);
// looks good, set 'em all // looks good, set 'em all
$base_glyph = glyph; $base_glyph = glyph;
@ -87,8 +87,8 @@ inline void configure_tile(const sf::Sprite &sprite, sf::FloatRect &sp_bounds, s
sp_bounds = sprite.getLocalBounds(); sp_bounds = sprite.getLocalBounds();
// calculate where to center the sprite, but only if it's smaller // calculate where to center the sprite, but only if it's smaller
width_delta = grid_bounds.width > sp_bounds.width ? (grid_bounds.width - sp_bounds.width) / 2 : 0; width_delta = grid_bounds.size.x > sp_bounds.size.x ? (grid_bounds.size.x - sp_bounds.size.x) / 2 : 0;
height_delta = grid_bounds.height > sp_bounds.width ? (grid_bounds.height - sp_bounds.height) / 2 : 0; height_delta = grid_bounds.size.y > sp_bounds.size.x ? (grid_bounds.size.y - sp_bounds.size.y) / 2 : 0;
} }
void SFMLRender::render_grid(const std::wstring &text, sf::Color default_fg, sf::Color default_bg, float x, float y) { void SFMLRender::render_grid(const std::wstring &text, sf::Color default_fg, sf::Color default_bg, float x, float y) {
@ -148,12 +148,12 @@ inline sf::FloatRect draw_chunk(sf::RenderWindow& window,
text.setString(out); text.setString(out);
text.setPosition({x, y}); text.setPosition({x, y});
// get a base character for the cell size // get a base character for the cell size
sf::FloatRect bounds(x, y, text_bounds.width * out.size(), text_bounds.height); sf::FloatRect bounds({x, y}, {text_bounds.size.x * out.size(), text_bounds.size.y});
if(default_bg != bgcolor) { if(default_bg != bgcolor) {
sf::RectangleShape backing({bounds.width, bounds.height}); sf::RectangleShape backing({bounds.size.x, bounds.size.y});
backing.setFillColor(bgcolor); backing.setFillColor(bgcolor);
backing.setPosition({bounds.left, bounds.top + bg_box_offset}); backing.setPosition({bounds.position.x, bounds.position.y + bg_box_offset});
window.draw(backing); window.draw(backing);
} }
@ -177,7 +177,7 @@ void SFMLRender::render_text(const std::wstring &text, sf::Color default_fg, sf:
auto bounds = draw_chunk($window, auto bounds = draw_chunk($window,
$text_bounds, $ui_text, $text_bounds, $ui_text,
default_bg, cur_bg, $config.bg_box_offset, x, y, out); default_bg, cur_bg, $config.bg_box_offset, x, y, out);
x += bounds.width; x += bounds.size.x;
} }
cur_bg = bg; cur_bg = bg;
$ui_text.setFillColor(fg); $ui_text.setFillColor(fg);
@ -195,7 +195,7 @@ void SFMLRender::render_text(const std::wstring &text, sf::Color default_fg, sf:
bounds = $ui_text.getLocalBounds(); bounds = $ui_text.getLocalBounds();
} }
y += bounds.height; y += bounds.size.y;
x = start_x; // reset to the original position x = start_x; // reset to the original position
} }
break; break;
@ -225,8 +225,8 @@ void SFMLRender::draw(Panel &panel, float x_offset, float y_offset) {
auto bounds = panel.grid ? $grid_bounds : $text_bounds; auto bounds = panel.grid ? $grid_bounds : $text_bounds;
sf::RectangleShape backing( sf::RectangleShape backing(
sf::Vector2f(bounds.width * panel.width + panel.border_px, sf::Vector2f(bounds.size.x * panel.width + panel.border_px,
bounds.height * panel.height + panel.border_px)); bounds.size.y * panel.height + panel.border_px));
backing.setFillColor(panel.default_bg); backing.setFillColor(panel.default_bg);
@ -235,7 +235,7 @@ void SFMLRender::draw(Panel &panel, float x_offset, float y_offset) {
backing.setOutlineThickness(panel.border_px); backing.setOutlineThickness(panel.border_px);
} }
backing.setPosition(panel.x + x_offset, panel.y + y_offset); backing.setPosition({panel.x + x_offset, panel.y + y_offset});
$window.draw(backing); $window.draw(backing);
if(panel.grid) { if(panel.grid) {
@ -252,12 +252,12 @@ bool SFMLRender::mouse_position(Panel &panel, Point &out) {
auto bounds = panel.grid ? $grid_bounds : $text_bounds; auto bounds = panel.grid ? $grid_bounds : $text_bounds;
if(pos.x >= panel.x && pos.y >= panel.y if(pos.x >= panel.x && pos.y >= panel.y
&& pos.x <= (panel.x + panel.width * bounds.width) && pos.x <= (panel.x + panel.width * bounds.size.x)
&& pos.y <= (panel.y + panel.height * bounds.height)) && pos.y <= (panel.y + panel.height * bounds.size.y))
{ {
out = { out = {
size_t((pos.x - panel.x) / bounds.width), size_t((pos.x - panel.x) / bounds.size.x),
size_t((pos.y - panel.y) / bounds.height) size_t((pos.y - panel.y) / bounds.size.y)
}; };
return true; return true;

@ -11,6 +11,7 @@
#include "ansi_parser.hpp" #include "ansi_parser.hpp"
#include "panel.hpp" #include "panel.hpp"
#include "constants.hpp" #include "constants.hpp"
#include <optional>
using ftxui::Canvas, ftxui::Screen; using ftxui::Canvas, ftxui::Screen;
@ -18,8 +19,8 @@ using ftxui::Canvas, ftxui::Screen;
* BUG: This could be so much better. * BUG: This could be so much better.
*/ */
struct RenderConfig { struct RenderConfig {
int video_x = VIDEO_WINDOW_X; unsigned int video_x = VIDEO_WINDOW_X;
int video_y = VIDEO_WINDOW_Y; unsigned int video_y = VIDEO_WINDOW_Y;
int ui_font_size=UI_FONT_SIZE; int ui_font_size=UI_FONT_SIZE;
int base_map_font_size=BASE_MAP_FONT_SIZE; int base_map_font_size=BASE_MAP_FONT_SIZE;
wchar_t bg_tile = BG_TILE; wchar_t bg_tile = BG_TILE;
@ -34,17 +35,18 @@ struct SFMLRender {
sf::RenderWindow $window; sf::RenderWindow $window;
int $map_font_size; int $map_font_size;
float $line_spacing; float $line_spacing;
std::unordered_map<wchar_t, sf::Sprite> $sprites; sf::Color $default_fg;
sf::Font $font; sf::Color $default_bg;
sf::Texture $font_texture; sf::Texture $font_texture;
sf::Glyph $base_glyph;
sf::Sprite $bg_sprite; sf::Sprite $bg_sprite;
sf::FloatRect $grid_bounds; sf::Font $font;
sf::Text $ui_text; sf::Text $ui_text;
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> $converter;
sf::Color $default_fg;
sf::Color $default_bg;
ANSIParser $ansi; ANSIParser $ansi;
std::unordered_map<wchar_t, sf::Sprite> $sprites;
sf::Glyph $base_glyph;
sf::FloatRect $grid_bounds;
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> $converter;
sf::FloatRect $text_bounds; sf::FloatRect $text_bounds;
SFMLRender(); SFMLRender();
@ -61,8 +63,8 @@ struct SFMLRender {
void draw_sprite(sf::Sprite &sprite, sf::Shader *shader); void draw_sprite(sf::Sprite &sprite, sf::Shader *shader);
void center_panel(Panel &panel); void center_panel(Panel &panel);
bool poll_event(sf::Event &event) { std::optional<sf::Event> poll_event() {
return $window.pollEvent(event); return $window.pollEvent();
} }
void close() { return $window.close(); } void close() { return $window.close(); }

@ -80,8 +80,7 @@ int main(int argc, char *argv[]) {
println("LOADING IMAGE: {}", image_file); println("LOADING IMAGE: {}", image_file);
// load the image from argv // load the image from argv
sf::Image image; sf::Image image(image_file);
image.loadFromFile(image_file);
// divide the image into cells // divide the image into cells
auto size = image.getSize(); auto size = image.getSize();
@ -101,7 +100,7 @@ int main(int argc, char *argv[]) {
// sum the cell // sum the cell
for(unsigned int x = 0; x < cell.x ; x++) { for(unsigned int x = 0; x < cell.x ; x++) {
for(unsigned int y = 0; y < cell.y ; y++) { for(unsigned int y = 0; y < cell.y ; y++) {
auto pixel = image.getPixel((i*cell.x) + x, (j * cell.y) + y); auto pixel = image.getPixel({(i*(unsigned int)cell.x) + x, (j * (unsigned int)cell.y) + y});
avg.r += pixel.r; avg.r += pixel.r;
avg.g += pixel.g; avg.g += pixel.g;
@ -144,8 +143,6 @@ int main(int argc, char *argv[]) {
return ftxui::canvas(drawing); return ftxui::canvas(drawing);
})); }));
sf::Event event;
int start_x = 0; int start_x = 0;
int start_y = 0; int start_y = 0;
int end_x = 600; int end_x = 600;
@ -153,8 +150,7 @@ int main(int argc, char *argv[]) {
int cur_x = start_x; int cur_x = start_x;
int cur_y = start_y; int cur_y = start_y;
sf::Texture texture; sf::Texture texture(image_file);
texture.loadFromFile(image_file);
sf::Sprite sprite(texture); sf::Sprite sprite(texture);
panel.render(); panel.render();
@ -170,8 +166,8 @@ int main(int argc, char *argv[]) {
renderer.draw(panel, cur_x, cur_y); renderer.draw(panel, cur_x, cur_y);
renderer.display(); renderer.display();
while(renderer.poll_event(event)) { while(const auto event = renderer.poll_event()) {
if(event.type == sf::Event::Closed) { if(event->is<sf::Event::Closed>()) {
renderer.close(); renderer.close();
} }
} }

@ -3,6 +3,7 @@
#include <fmt/core.h> #include <fmt/core.h>
using namespace fmt; using namespace fmt;
using std::make_shared;
namespace fs = std::filesystem; namespace fs = std::filesystem;
SoundManager::SoundManager(std::string base_path) : $base_path(base_path) { SoundManager::SoundManager(std::string base_path) : $base_path(base_path) {
@ -13,31 +14,29 @@ void SoundManager::load(const std::string name, const std::string sound_path) {
// get the sound file with base_path // get the sound file with base_path
fs::path full_path = $base_path / sound_path; fs::path full_path = $base_path / sound_path;
// confirm it's there // confirm it's there
dbc::check(fs::exists(full_path), format("sound file {} does not exist", sound_path)); dbc::check(fs::exists(full_path), fmt::format("sound file {} does not exist", sound_path));
// create the buffer and keep in the buffer map // create the buffer and keep in the buffer map
SoundPair* pair = new SoundPair(); auto buffer = make_shared<sf::SoundBuffer>(full_path);
$sounds[name] = pair;
bool good = pair->buffer.loadFromFile(full_path.string());
dbc::check(good, format("failed to load sound {}", sound_path));
// set it on the sound and keep in the sound map // set it on the sound and keep in the sound map
pair->sound.setBuffer(pair->buffer); auto sound = make_shared<sf::Sound>(*buffer);
pair->sound.setRelativeToListener(false); sound->setRelativeToListener(false);
pair->sound.setPosition(0.0f, 0.0f, 1.0f); sound->setPosition({0.0f, 0.0f, 1.0f});
$sounds.try_emplace(name, buffer, sound);
} }
void SoundManager::play(const std::string name) { void SoundManager::play(const std::string name) {
dbc::check($sounds.contains(name), format("sound {} is not loaded in map", name)); dbc::check($sounds.contains(name), fmt::format("sound {} is not loaded in map", name));
// get the sound from the sound map // get the sound from the sound map
auto pair = $sounds.at(name); auto pair = $sounds.at(name);
// play it // play it
pair->sound.play(); pair.sound->play();
} }
void SoundManager::playAt(const std::string name, float x, float y, float z) { void SoundManager::playAt(const std::string name, float x, float y, float z) {
auto pair = $sounds.at(name); auto pair = $sounds.at(name);
pair->sound.setPosition(x, y, z); pair.sound->setPosition({x, y, z});
pair->sound.play(); pair.sound->play();
} }

@ -6,13 +6,13 @@
#include <SFML/Audio.hpp> #include <SFML/Audio.hpp>
struct SoundPair { struct SoundPair {
sf::SoundBuffer buffer; std::shared_ptr<sf::SoundBuffer> buffer;
sf::Sound sound; std::shared_ptr<sf::Sound> sound;
}; };
struct SoundManager { struct SoundManager {
std::filesystem::path $base_path; std::filesystem::path $base_path;
std::unordered_map<std::string, SoundPair* > $sounds; std::unordered_map<std::string, SoundPair> $sounds;
SoundManager(std::string base_path); SoundManager(std::string base_path);

@ -237,52 +237,52 @@ class GUI {
bool handle_ui_events() { bool handle_ui_events() {
bool event_happened; bool event_happened;
using KB = sf::Keyboard; using KB = sf::Keyboard::Key;
sf::Event event;
Point pos; Point pos;
int font_size = $renderer.font_size(); int font_size = $renderer.font_size();
int page_size = $font_grid.page_size(); int page_size = $font_grid.page_size();
while($renderer.poll_event(event)) { while(const auto event = $renderer.poll_event()) {
if(event.type == sf::Event::Closed) { if(event->is<sf::Event::Closed>()) {
shutdown(); shutdown();
return true; return true;
} else if(event.type == sf::Event::KeyPressed) { } else if(event->is<sf::Event::KeyPressed>()) {
if(KB::isKeyPressed(KB::Up)) { if(sf::Keyboard::isKeyPressed(KB::Up)) {
$start_char = std::max(1, int($start_char) - page_size); $start_char = std::max(1, int($start_char) - page_size);
render_grid($start_char, false); render_grid($start_char, false);
event_happened = true; event_happened = true;
$renderer.clear_cache(); $renderer.clear_cache();
} else if(event.key.code == KB::C && event.key.control) { } else if(sf::Keyboard::isKeyPressed(KB::C)
&& sf::Keyboard::isKeyPressed(KB::LControl)) {
wchar_t selected_char = $font_grid.as_wchar($fill_char); wchar_t selected_char = $font_grid.as_wchar($fill_char);
string out = format("\\u{:x}", int(selected_char)); string out = format("\\u{:x}", int(selected_char));
println("COPIED {}", out); println("COPIED {}", out);
sf::Clipboard::setString(out); sf::Clipboard::setString(out);
} else if(KB::isKeyPressed(KB::Down)) { } else if(sf::Keyboard::isKeyPressed(KB::Down)) {
$start_char = std::min($font_grid.max_chars() - page_size, $start_char + page_size); $start_char = std::min($font_grid.max_chars() - page_size, $start_char + page_size);
render_grid($start_char, false); render_grid($start_char, false);
$renderer.clear_cache(); $renderer.clear_cache();
} else if(KB::isKeyPressed(KB::Tab)) { } else if(sf::Keyboard::isKeyPressed(KB::Tab)) {
$status_ui.key_press(Event::Tab); $status_ui.key_press(Event::Tab);
} else if(KB::isKeyPressed(KB::Tab)) { } else if(sf::Keyboard::isKeyPressed(KB::Tab)) {
$status_ui.key_press(Event::Return); $status_ui.key_press(Event::Return);
} else if(KB::isKeyPressed(KB::Equal)) { } else if(sf::Keyboard::isKeyPressed(KB::Equal)) {
resize_fonts(font_size + 10); resize_fonts(font_size + 10);
} else if(KB::isKeyPressed(KB::Hyphen)) { } else if(sf::Keyboard::isKeyPressed(KB::Hyphen)) {
resize_fonts(font_size - 10); resize_fonts(font_size - 10);
event_happened = true; event_happened = true;
} }
} else if($renderer.mouse_position($font_view, pos)) { } else if($renderer.mouse_position($font_view, pos)) {
if(sf::Mouse::isButtonPressed(sf::Mouse::Left)) { if(sf::Mouse::isButtonPressed(sf::Mouse::Button::Left)) {
select_cell(pos); select_cell(pos);
event_happened = true; event_happened = true;
} else if(sf::Mouse::isButtonPressed(sf::Mouse::Right)) { } else if(sf::Mouse::isButtonPressed(sf::Mouse::Button::Right)) {
deselect_cell(); deselect_cell();
} }
} else if($renderer.mouse_position($status_ui, pos)) { } else if($renderer.mouse_position($status_ui, pos)) {
if(sf::Mouse::isButtonPressed(sf::Mouse::Left)) { if(sf::Mouse::isButtonPressed(sf::Mouse::Button::Left)) {
$status_ui.mouse_click(Mouse::Button::Left, pos); $status_ui.mouse_click(Mouse::Button::Left, pos);
} else if(event.type == sf::Event::MouseMoved) { } else if(event->is<sf::Event::MouseMoved>()) {
$status_ui.mouse_release(Mouse::Button::Left, pos); $status_ui.mouse_release(Mouse::Button::Left, pos);
} }
} }

@ -44,20 +44,19 @@ struct FontExtractor {
FontExtractor(fs::path font_path) : FontExtractor(fs::path font_path) :
$font_path(font_path) $font_path(font_path)
{ {
bool good = $font.loadFromFile($font_path.string()); bool good = $font.openFromFile($font_path);
dbc::check(good, format("failed to load font {}", $font_path.string())); dbc::check(good, format("failed to load font {}", $font_path.string()));
$font.setSmooth(false);
for(int i = 100; i < 200; i++) { for(int i = 100; i < 200; i++) {
auto glyph = $font.getGlyph(ui_base_char, i, false); auto glyph = $font.getGlyph(ui_base_char, i, false);
if(glyph.bounds.width > 0 && glyph.bounds.height > 0) { if(glyph.bounds.size.x > 0 && glyph.bounds.size.y > 0) {
$grid_bounds = glyph.bounds; $grid_bounds = glyph.bounds;
$font_size = i; $font_size = i;
break; break;
} }
} }
dbc::check($grid_bounds.width > 0 && $grid_bounds.height > 0, "couldn't find a valid font size"); dbc::check($grid_bounds.size.x > 0 && $grid_bounds.size.y > 0, "couldn't find a valid font size");
println("!!!!!!!!!!!!!!!!!!!!! FONT SIZE {}", $font_size); println("!!!!!!!!!!!!!!!!!!!!! FONT SIZE {}", $font_size);
} }
@ -133,10 +132,10 @@ struct FontExtractor {
auto bounds = glyph.bounds; auto bounds = glyph.bounds;
// skip bad chars // skip bad chars
if(bounds.width <= 0 || bounds.height <= 0) continue; if(bounds.size.x <= 0 || bounds.size.y <= 0) continue;
if(bounds.width <= $grid_bounds.width && if(bounds.size.x <= $grid_bounds.size.x &&
bounds.height <= $grid_bounds.height) { bounds.size.y <= $grid_bounds.size.y) {
return i; return i;
} }
} }
@ -175,7 +174,7 @@ struct FontExtractor {
void clear_font_cache() { void clear_font_cache() {
if($clear_count % CLEAR_CACHE_POINT == 0) { if($clear_count % CLEAR_CACHE_POINT == 0) {
bool good = $font.loadFromFile($font_path.string()); bool good = $font.openFromFile($font_path);
dbc::check(good, format("failed to load font {}", $font_path.string())); dbc::check(good, format("failed to load font {}", $font_path.string()));
$font.setSmooth(false); $font.setSmooth(false);

@ -1,13 +0,0 @@
[wrap-file]
directory = openal-soft-1.23.1
source_url = https://github.com/kcat/openal-soft/archive/refs/tags/1.23.1.tar.gz
source_filename = openal-soft-1.23.1.tar.gz
source_hash = dfddf3a1f61059853c625b7bb03de8433b455f2f79f89548cbcbd5edca3d4a4a
patch_filename = openal-soft_1.23.1-2_patch.zip
patch_url = https://wrapdb.mesonbuild.com/v2/openal-soft_1.23.1-2/get_patch
patch_hash = e03c3afe0bb40a931d25d41d92a08b90e3c33b217d1b47210b26ca6627eb3aa3
source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/openal-soft_1.23.1-2/openal-soft-1.23.1.tar.gz
wrapdb_version = 1.23.1-2
[provide]
openal = openal_dep

@ -1,13 +1,14 @@
[wrap-file] [wrap-git]
directory = SFML-2.6.2 directory=SFML-3.0.0
source_url = https://github.com/SFML/SFML/archive/refs/tags/2.6.2.tar.gz url=https://github.com/SFML/SFML.git
source_filename = 2.6.2.tar.gz revision=3.0.0
source_hash = 15ff4d608a018f287c6a885db0a2da86ea389e516d2323629e4d4407a7ce047f depth=1
patch_filename = sfml_2.6.2-1_patch.zip method=cmake
patch_url = https://wrapdb.mesonbuild.com/v2/sfml_2.6.2-1/get_patch
patch_hash = 36737f7fc6d616be791c6901b15414315b3a77df82dabc80b151d628e5d48386
source_fallback_url = https://github.com/mesonbuild/wrapdb/releases/download/sfml_2.6.2-1/2.6.2.tar.gz
wrapdb_version = 2.6.2-1
[provide] [provide]
sfml = sfml_dep sfml_audio = sfml_audio_dep
sfml_graphics = sfml_graphics_dep
sfml_main = sfml_main_dep
sfml_network = sfml_network_dep
sfml_system = sfml_system_dep
sfml_window = sfml_window_dep