Moved to SFML 3.0 now.

main
Zed A. Shaw 7 days 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

Loading…
Cancel
Save