This was not a very smart class. We replace it with a bidirectional map.legacy
@@ -1,7 +1,7 @@ | |||
// | |||
// Lol Engine — Sprite tutorial | |||
// | |||
// Copyright © 2011—2015 Sam Hocevar <sam@hocevar.net> | |||
// Copyright © 2011—2019 Sam Hocevar <sam@hocevar.net> | |||
// © 2012 Daniel Stephens (artwork) | |||
// | |||
// Lol Engine is free software. It comes without any warranty, to | |||
@@ -31,7 +31,7 @@ public: | |||
scene.PushCamera(m_camera); | |||
Ticker::Ref(m_camera); | |||
m_tileset = Tiler::Register("06_sprite.png"); | |||
m_tileset = TileSet::create("06_sprite.png"); | |||
for (int i = 0; i < FRAME_COUNT; ++i) | |||
m_tileset->define_tile(ibox2(i * 24, 376, 24 + i * 24, 24 + 376)); | |||
@@ -46,7 +46,7 @@ public: | |||
~SpriteTutorial() | |||
{ | |||
Tiler::Deregister(m_tileset); | |||
TileSet::destroy(m_tileset); | |||
Scene& scene = Scene::GetScene(); | |||
scene.PopCamera(m_camera); | |||
@@ -8,10 +8,9 @@ noinst_LIBRARIES = liblol-core.a | |||
EXTRA_DIST += lol-core.vcxproj lol-core.vcxproj.filter | |||
liblol_core_a_SOURCES = \ | |||
tiler.cpp tiler.h dict.cpp dict.h lolgl.h \ | |||
scene.cpp scene.h font.cpp font.h \ | |||
lolgl.h scene.cpp scene.h font.cpp font.h \ | |||
textureimage.cpp textureimage.h textureimage-private.h \ | |||
tileset.cpp tileset.h forge.cpp forge.h video.cpp video.h \ | |||
tileset.cpp tileset.h video.cpp video.h \ | |||
profiler.cpp profiler.h text.cpp text.h emitter.cpp emitter.h \ | |||
numeric.h utils.h messageservice.cpp messageservice.h \ | |||
gradient.cpp gradient.h gradient.lolfx \ | |||
@@ -52,7 +51,7 @@ liblol_core_headers = \ | |||
lol/algorithm/sort.h lol/algorithm/portal.h lol/algorithm/aabb_tree.h \ | |||
\ | |||
lol/audio/all.h \ | |||
lol/audio/audio.h lol/audio/sampler.h lol/audio/sample.h \ | |||
lol/audio/audio.h lol/audio/sample.h \ | |||
\ | |||
lol/sys/all.h \ | |||
lol/sys/init.h lol/sys/file.h lol/sys/getopt.h lol/sys/thread.h \ | |||
@@ -99,7 +98,7 @@ liblol_core_sources = \ | |||
gpu/framebuffer.cpp gpu/texture.cpp gpu/renderer.cpp \ | |||
gpu/rendercontext.cpp \ | |||
\ | |||
audio/audio.cpp audio/sampler.cpp audio/sample.cpp \ | |||
audio/audio.cpp audio/sample.cpp \ | |||
\ | |||
input/input.cpp input/input.h input/input_internal.h input/keys.h \ | |||
input/controller.cpp input/controller.h \ | |||
@@ -119,7 +118,7 @@ liblol_core_sources = \ | |||
sys/init.cpp sys/file.cpp sys/hacks.cpp \ | |||
sys/thread.cpp sys/threadtypes.cpp sys/getopt.cpp \ | |||
\ | |||
image/resource.cpp image/resource-private.h \ | |||
image/resource.cpp image/resource-private.h \ | |||
image/image.cpp image/image-private.h image/kernel.cpp image/pixel.cpp \ | |||
image/crop.cpp image/resample.cpp image/noise.cpp image/combine.cpp \ | |||
image/codec/gdiplus-image.cpp image/codec/imlib2-image.cpp \ | |||
@@ -1,7 +1,7 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
// | |||
// Lol Engine is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -32,6 +32,9 @@ | |||
namespace lol | |||
{ | |||
/* The sample cache */ | |||
static entity_dict<sample> sample_cache; | |||
/* | |||
* sample implementation class | |||
*/ | |||
@@ -52,7 +55,19 @@ private: | |||
* Public sample class | |||
*/ | |||
sample::sample(char const *path) | |||
sample *sample::create(std::string const &path) | |||
{ | |||
auto ret = sample_cache.get(path); | |||
return ret ? ret : sample_cache.set(path, new sample(path)); | |||
} | |||
void sample::destroy(sample *s) | |||
{ | |||
// FIXME: decrement! | |||
sample_cache.erase(s); | |||
} | |||
sample::sample(std::string const &path) | |||
: data(new sample_data()) | |||
{ | |||
data->m_name = std::string("<sample> ") + path; | |||
@@ -66,7 +81,7 @@ sample::sample(char const *path) | |||
} | |||
if (!data->m_chunk) | |||
{ | |||
msg::error("could not load sample %s: %s\n", path, Mix_GetError()); | |||
msg::error("could not load sample %s: %s\n", path.c_str(), Mix_GetError()); | |||
} | |||
data->m_channel = -1; | |||
#endif | |||
@@ -1,84 +0,0 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright © 2010—2016 Sam Hocevar <sam@hocevar.net> | |||
// | |||
// Lol Engine is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
// and/or modify it under the terms of the Do What the Fuck You Want | |||
// to Public License, Version 2, as published by the WTFPL Task Force. | |||
// See http://www.wtfpl.net/ for more details. | |||
// | |||
#include <lol/engine-internal.h> | |||
namespace lol | |||
{ | |||
/* | |||
* sampler implementation class | |||
*/ | |||
static class sampler_data | |||
{ | |||
friend class sampler; | |||
public: | |||
Dict samples; | |||
} | |||
samplerdata; | |||
static sampler_data * const data = &samplerdata; | |||
/* | |||
* Public sampler class | |||
*/ | |||
int sampler::load_sample(char const *path) | |||
{ | |||
int id = data->samples.MakeSlot(path); | |||
if (!data->samples.GetEntity(id)) | |||
{ | |||
sample *s = new sample(path); | |||
data->samples.SetEntity(id, s); | |||
} | |||
return id + 1; /* ID 0 is for the empty sample */ | |||
} | |||
void sampler::unload_sample(int id) | |||
{ | |||
if (id > 0) | |||
data->samples.RemoveSlot(id - 1); /* ID 0 is for the empty sample */ | |||
} | |||
void sampler::play_sample(int id) | |||
{ | |||
if (id > 0) | |||
{ | |||
sample *s = (sample *)data->samples.GetEntity(id - 1); | |||
s->play(); | |||
} | |||
} | |||
void sampler::loop_sample(int id) | |||
{ | |||
if (id > 0) | |||
{ | |||
sample *s = (sample *)data->samples.GetEntity(id - 1); | |||
s->loop(); | |||
} | |||
} | |||
void sampler::stop_sample(int id) | |||
{ | |||
if (id > 0) | |||
{ | |||
sample *s = (sample *)data->samples.GetEntity(id - 1); | |||
s->stop(); | |||
} | |||
} | |||
} /* namespace lol */ | |||
@@ -1,7 +1,7 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
// | |||
// Lol Engine is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -46,7 +46,6 @@ class Entity | |||
friend class Scene; | |||
friend class Ticker; | |||
friend class TickerData; | |||
friend class Dict; | |||
friend class Emcee; | |||
public: | |||
@@ -150,5 +149,31 @@ private: | |||
uint64_t m_scene_mask = 0; | |||
}; | |||
template<typename T> struct entity_dict | |||
{ | |||
T *get(std::string const &key) | |||
{ | |||
auto it = m_cache1.find(key); | |||
return it != m_cache1.end() ? it->second : nullptr; | |||
} | |||
T *set(std::string const &key, T *entity) | |||
{ | |||
m_cache1[key] = entity; | |||
m_cache2[entity] = key; | |||
return entity; | |||
} | |||
void erase(T *entity) | |||
{ | |||
// FIXME: temporary; we need Ticker::Ref etc. | |||
m_cache1.erase(m_cache2[entity]); | |||
m_cache2.erase(entity); | |||
} | |||
std::map<std::string, T*> m_cache1; | |||
std::map<T*, std::string> m_cache2; | |||
}; | |||
} /* namespace lol */ | |||
@@ -1,7 +1,7 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
// 2013 Jean-Yves Lamoureux <jylam@lnxscene.org> | |||
// | |||
// Lol Engine is free software. It comes without any warranty, to | |||
@@ -19,6 +19,9 @@ | |||
namespace lol | |||
{ | |||
/* The font cache */ | |||
static entity_dict<Font> font_cache; | |||
/* | |||
* Font implementation class | |||
*/ | |||
@@ -37,12 +40,24 @@ private: | |||
* Public Font class | |||
*/ | |||
Font *Font::create(std::string const &path) | |||
{ | |||
auto ret = font_cache.get(path); | |||
return ret ? ret : font_cache.set(path, new Font(path)); | |||
} | |||
void Font::destroy(Font *f) | |||
{ | |||
// FIXME: decrement! | |||
font_cache.erase(f); | |||
} | |||
Font::Font(std::string const &path) | |||
: data(new FontData()) | |||
{ | |||
data->m_name = "<font> " + path; | |||
data->tileset = Tiler::Register(path, ivec2::zero, ivec2(16)); | |||
data->tileset = TileSet::create(path, ivec2::zero, ivec2(16)); | |||
data->size = data->tileset->GetTileSize(0); | |||
m_drawgroup = DRAWGROUP_TEXTURE; | |||
@@ -50,7 +65,7 @@ Font::Font(std::string const &path) | |||
Font::~Font() | |||
{ | |||
Tiler::Deregister(data->tileset); | |||
TileSet::destroy(data->tileset); | |||
delete data; | |||
} | |||
@@ -1,7 +1,7 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
// | |||
// Lol Engine is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -27,10 +27,13 @@ class FontData; | |||
class Font : public Entity | |||
{ | |||
public: | |||
static Font *create(std::string const &path); | |||
static void destroy(Font *); | |||
protected: | |||
Font(std::string const &path); | |||
~Font(); | |||
protected: | |||
/* Inherited from Entity */ | |||
virtual std::string GetName() const; | |||
virtual void tick_draw(float seconds, Scene &scene); | |||
@@ -1,61 +0,0 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||
// | |||
// Lol Engine is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
// and/or modify it under the terms of the Do What the Fuck You Want | |||
// to Public License, Version 2, as published by the WTFPL Task Force. | |||
// See http://www.wtfpl.net/ for more details. | |||
// | |||
#include <lol/engine-internal.h> | |||
namespace lol | |||
{ | |||
/* | |||
* Forge implementation class | |||
*/ | |||
static class ForgeData | |||
{ | |||
friend class Forge; | |||
public: | |||
Dict fonts; | |||
} | |||
forgedata; | |||
static ForgeData * const data = &forgedata; | |||
/* | |||
* Public Forge class | |||
*/ | |||
int Forge::Register(std::string const &path) | |||
{ | |||
int id = data->fonts.MakeSlot(path); | |||
if (!data->fonts.GetEntity(id)) | |||
{ | |||
Font *font = new Font(path); | |||
data->fonts.SetEntity(id, font); | |||
} | |||
return id; | |||
} | |||
void Forge::Deregister(int id) | |||
{ | |||
data->fonts.RemoveSlot(id); | |||
} | |||
Font *Forge::GetFont(int id) | |||
{ | |||
return (Font *)data->fonts.GetEntity(id); | |||
} | |||
} /* namespace lol */ | |||
@@ -1,38 +0,0 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||
// | |||
// Lol Engine is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
// and/or modify it under the terms of the Do What the Fuck You Want | |||
// to Public License, Version 2, as published by the WTFPL Task Force. | |||
// See http://www.wtfpl.net/ for more details. | |||
// | |||
#pragma once | |||
// | |||
// The Forge class | |||
// --------------- | |||
// The Forge is a static class that manages fonts. | |||
// | |||
#include "font.h" | |||
namespace lol | |||
{ | |||
class Forge | |||
{ | |||
public: | |||
static int Register(std::string const &path); | |||
static void Deregister(int id); | |||
static Font *GetFont(int id); | |||
private: | |||
Forge() {} | |||
}; | |||
} /* namespace lol */ | |||
@@ -83,7 +83,6 @@ | |||
<ClCompile Include="application\application.cpp" /> | |||
<ClCompile Include="audio\audio.cpp" /> | |||
<ClCompile Include="audio\sample.cpp" /> | |||
<ClCompile Include="audio\sampler.cpp" /> | |||
<ClCompile Include="camera.cpp" /> | |||
<ClCompile Include="base\assert.cpp" /> | |||
<ClCompile Include="base\enum.cpp" /> | |||
@@ -93,7 +92,6 @@ | |||
<ClCompile Include="debug\lines.cpp" /> | |||
<ClCompile Include="debug\record.cpp" /> | |||
<ClCompile Include="debug\stats.cpp" /> | |||
<ClCompile Include="dict.cpp" /> | |||
<ClCompile Include="easymesh\csgbsp.cpp" /> | |||
<ClCompile Include="easymesh\easymesh.cpp" /> | |||
<ClCompile Include="easymesh\easymeshbuild.cpp" /> | |||
@@ -111,7 +109,6 @@ | |||
<ClCompile Include="engine\worldentity.cpp" /> | |||
<ClCompile Include="emitter.cpp" /> | |||
<ClCompile Include="font.cpp" /> | |||
<ClCompile Include="forge.cpp" /> | |||
<ClCompile Include="gpu\framebuffer.cpp" /> | |||
<ClCompile Include="gpu\indexbuffer.cpp" /> | |||
<ClCompile Include="gpu\lolfx.cpp" /> | |||
@@ -216,7 +213,6 @@ | |||
<ClCompile Include="sys\threadtypes.cpp" /> | |||
<ClCompile Include="text.cpp" /> | |||
<ClCompile Include="textureimage.cpp" /> | |||
<ClCompile Include="tiler.cpp" /> | |||
<ClCompile Include="tileset.cpp" /> | |||
<ClCompile Include="video.cpp" /> | |||
</ItemGroup> | |||
@@ -227,7 +223,6 @@ | |||
<ClInclude Include="debug\fps.h" /> | |||
<ClInclude Include="debug\record.h" /> | |||
<ClInclude Include="debug\stats.h" /> | |||
<ClInclude Include="dict.h" /> | |||
<ClInclude Include="easymesh\csgbsp.h" /> | |||
<ClInclude Include="easymesh\easymesh.h" /> | |||
<ClInclude Include="easymesh\easymeshbuild.h" /> | |||
@@ -240,7 +235,6 @@ | |||
<ClInclude Include="engine\worldentity.h" /> | |||
<ClInclude Include="engine\world.h" /> | |||
<ClInclude Include="font.h" /> | |||
<ClInclude Include="forge.h" /> | |||
<ClInclude Include="gradient.h" /> | |||
<ClInclude Include="image\image-private.h" /> | |||
<ClInclude Include="image\resource-private.h" /> | |||
@@ -260,7 +254,6 @@ | |||
<ClInclude Include="lol\audio\all.h" /> | |||
<ClInclude Include="lol\audio\audio.h" /> | |||
<ClInclude Include="lol\audio\sample.h" /> | |||
<ClInclude Include="lol\audio\sampler.h" /> | |||
<ClInclude Include="lol\base\all.h" /> | |||
<ClInclude Include="lol\base\array.h" /> | |||
<ClInclude Include="lol\base\assert.h" /> | |||
@@ -368,7 +361,6 @@ | |||
<ClInclude Include="text.h" /> | |||
<ClInclude Include="textureimage-private.h" /> | |||
<ClInclude Include="textureimage.h" /> | |||
<ClInclude Include="tiler.h" /> | |||
<ClInclude Include="tileset.h" /> | |||
<ClInclude Include="utils.h" /> | |||
<ClInclude Include="video.h" /> | |||
@@ -204,15 +204,9 @@ | |||
<ClCompile Include="audio\sample.cpp"> | |||
<Filter>audio</Filter> | |||
</ClCompile> | |||
<ClCompile Include="audio\sampler.cpp"> | |||
<Filter>audio</Filter> | |||
</ClCompile> | |||
<ClCompile Include="camera.cpp"> | |||
<Filter>...</Filter> | |||
</ClCompile> | |||
<ClCompile Include="dict.cpp"> | |||
<Filter>...</Filter> | |||
</ClCompile> | |||
<ClCompile Include="eglapp.cpp"> | |||
<Filter>...</Filter> | |||
</ClCompile> | |||
@@ -222,9 +216,6 @@ | |||
<ClCompile Include="font.cpp"> | |||
<Filter>...</Filter> | |||
</ClCompile> | |||
<ClCompile Include="forge.cpp"> | |||
<Filter>...</Filter> | |||
</ClCompile> | |||
<ClCompile Include="gradient.cpp"> | |||
<Filter>...</Filter> | |||
</ClCompile> | |||
@@ -391,9 +382,6 @@ | |||
<ClCompile Include="sys\threadtypes.cpp"> | |||
<Filter>sys</Filter> | |||
</ClCompile> | |||
<ClCompile Include="tiler.cpp"> | |||
<Filter>tileset</Filter> | |||
</ClCompile> | |||
<ClCompile Include="tileset.cpp"> | |||
<Filter>tileset</Filter> | |||
</ClCompile> | |||
@@ -532,9 +520,6 @@ | |||
<ClInclude Include="camera.h"> | |||
<Filter>...</Filter> | |||
</ClInclude> | |||
<ClInclude Include="dict.h"> | |||
<Filter>...</Filter> | |||
</ClInclude> | |||
<ClInclude Include="eglapp.h"> | |||
<Filter>...</Filter> | |||
</ClInclude> | |||
@@ -544,9 +529,6 @@ | |||
<ClInclude Include="font.h"> | |||
<Filter>...</Filter> | |||
</ClInclude> | |||
<ClInclude Include="forge.h"> | |||
<Filter>...</Filter> | |||
</ClInclude> | |||
<ClInclude Include="gradient.h"> | |||
<Filter>...</Filter> | |||
</ClInclude> | |||
@@ -592,9 +574,6 @@ | |||
<ClInclude Include="lol\audio\sample.h"> | |||
<Filter>lol\audio</Filter> | |||
</ClInclude> | |||
<ClInclude Include="lol\audio\sampler.h"> | |||
<Filter>lol\audio</Filter> | |||
</ClInclude> | |||
<ClInclude Include="lol\base\array.h"> | |||
<Filter>lol\base</Filter> | |||
</ClInclude> | |||
@@ -761,9 +740,6 @@ | |||
<ClInclude Include="lol\sys\threadtypes.h"> | |||
<Filter>lol\sys</Filter> | |||
</ClInclude> | |||
<ClInclude Include="tiler.h"> | |||
<Filter>tileset</Filter> | |||
</ClInclude> | |||
<ClInclude Include="tileset.h"> | |||
<Filter>tileset</Filter> | |||
</ClInclude> | |||
@@ -1,7 +1,7 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright © 2010—2016 Sam Hocevar <sam@hocevar.net> | |||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
// | |||
// Lol Engine is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -13,6 +13,5 @@ | |||
#pragma once | |||
#include <lol/audio/audio.h> | |||
#include <lol/audio/sampler.h> | |||
#include <lol/audio/sample.h> | |||
@@ -1,7 +1,7 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
// | |||
// Lol Engine is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -30,10 +30,13 @@ class sample_data; | |||
class sample : public Entity | |||
{ | |||
public: | |||
sample(char const *path); | |||
virtual ~sample(); | |||
static sample *create(std::string const &path); | |||
static void destroy(sample *s); | |||
protected: | |||
sample(std::string const &path); | |||
virtual ~sample(); | |||
/* Inherited from Entity */ | |||
virtual std::string GetName() const; | |||
virtual void tick_game(float seconds); | |||
@@ -1,41 +0,0 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright © 2010—2016 Sam Hocevar <sam@hocevar.net> | |||
// | |||
// Lol Engine is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
// and/or modify it under the terms of the Do What the Fuck You Want | |||
// to Public License, Version 2, as published by the WTFPL Task Force. | |||
// See http://www.wtfpl.net/ for more details. | |||
// | |||
#pragma once | |||
// | |||
// The sampler class | |||
// ----------------- | |||
// The sampler is a static class that manages samples. | |||
// | |||
#include <stdint.h> | |||
namespace lol | |||
{ | |||
class sampler | |||
{ | |||
public: | |||
static int load_sample(char const *path); | |||
static void unload_sample(int id); | |||
static void play_sample(int id); | |||
static void loop_sample(int id); | |||
static void stop_sample(int id); | |||
private: | |||
sampler() {} | |||
}; | |||
} /* namespace lol */ | |||
@@ -1,7 +1,7 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright © 2010—2016 Sam Hocevar <sam@hocevar.net> | |||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
// | |||
// Lol Engine is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -50,14 +50,9 @@ | |||
#include <lol/../lolimgui.h> | |||
// Other objects | |||
#include <lol/../dict.h> | |||
#include <lol/../mesh/mesh.h> | |||
#include <lol/../mesh/primitivemesh.h> | |||
#include <lol/../application/application.h> | |||
#include <lol/../easymesh/csgbsp.h> | |||
#include <lol/../easymesh/easymesh.h> | |||
// Managers | |||
#include <lol/../forge.h> | |||
#include <lol/../tiler.h> | |||
@@ -1,7 +1,7 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
// | |||
// Lol Engine is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -28,7 +28,7 @@ class TextData | |||
friend class Text; | |||
private: | |||
int m_font; | |||
Font *m_font; | |||
TextAlign m_align; | |||
std::string m_text; | |||
vec3 m_pos; | |||
@@ -43,7 +43,7 @@ private: | |||
Text::Text(std::string const &text, char const *font) | |||
: data(new TextData()) | |||
{ | |||
data->m_font = Forge::Register(font); | |||
data->m_font = Font::create(font); | |||
data->m_align = TextAlign::Left; | |||
data->m_text = text; | |||
data->m_pos = vec3(0, 0, 0); | |||
@@ -90,8 +90,7 @@ vec3 Text::GetPos() | |||
ivec2 Text::GetFontSize() | |||
{ | |||
Font *font = Forge::GetFont(data->m_font); | |||
return font->GetSize(); | |||
return data->m_font->GetSize(); | |||
} | |||
void Text::tick_draw(float seconds, Scene &scene) | |||
@@ -100,24 +99,23 @@ void Text::tick_draw(float seconds, Scene &scene) | |||
if (auto length = data->m_text.length()) | |||
{ | |||
Font *font = Forge::GetFont(data->m_font); | |||
vec3 delta(0.0f); | |||
float text_width = ((length - 0.5f) + (length - 1) * data->m_spacing) | |||
* font->GetSize().x; | |||
* data->m_font->GetSize().x; | |||
if (data->m_align == TextAlign::Right) | |||
delta.x -= text_width * data->m_scale.x; | |||
else if (data->m_align == TextAlign::Center) | |||
delta.x -= 0.5f * text_width * data->m_scale.x; | |||
font->Print(scene, data->m_pos + delta, data->m_text, | |||
data->m_scale, data->m_spacing); | |||
data->m_font->Print(scene, data->m_pos + delta, data->m_text, | |||
data->m_scale, data->m_spacing); | |||
} | |||
} | |||
Text::~Text() | |||
{ | |||
Forge::Deregister(data->m_font); | |||
Font::destroy(data->m_font); | |||
delete data; | |||
} | |||
@@ -1,103 +0,0 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||
// | |||
// Lol Engine is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
// and/or modify it under the terms of the Do What the Fuck You Want | |||
// to Public License, Version 2, as published by the WTFPL Task Force. | |||
// See http://www.wtfpl.net/ for more details. | |||
// | |||
#include <lol/engine-internal.h> | |||
namespace lol | |||
{ | |||
/* | |||
* Tiler implementation class | |||
*/ | |||
static class TilerData | |||
{ | |||
friend class Tiler; | |||
public: | |||
TilerData() | |||
{ } | |||
private: | |||
Dict tilesets; | |||
} | |||
tilerdata; | |||
static TilerData * const data = &tilerdata; | |||
/* | |||
* Public Tiler class | |||
*/ | |||
TileSet *Tiler::Register(std::string const &path, ivec2 size, ivec2 count) | |||
{ | |||
int id = data->tilesets.MakeSlot(path); | |||
TileSet *tileset = (TileSet *)data->tilesets.GetEntity(id); | |||
if (!tileset) | |||
{ | |||
tileset = new TileSet(path, size, count); | |||
data->tilesets.SetEntity(id, tileset); | |||
} | |||
return tileset; | |||
} | |||
TileSet *Tiler::Register(std::string const &path) | |||
{ | |||
int id = data->tilesets.MakeSlot(path); | |||
TileSet *tileset = (TileSet *)data->tilesets.GetEntity(id); | |||
if (!tileset) | |||
{ | |||
tileset = new TileSet(path); | |||
data->tilesets.SetEntity(id, tileset); | |||
} | |||
return tileset; | |||
} | |||
TileSet *Tiler::Register(std::string const &path, Image* image, ivec2 size, ivec2 count) | |||
{ | |||
int id = data->tilesets.MakeSlot(path); | |||
TileSet *tileset = (TileSet *)data->tilesets.GetEntity(id); | |||
if (!tileset) | |||
{ | |||
tileset = new TileSet(path, image, size, count); | |||
data->tilesets.SetEntity(id, tileset); | |||
} | |||
return tileset; | |||
} | |||
TileSet *Tiler::Register(std::string const &path, Image* image) | |||
{ | |||
int id = data->tilesets.MakeSlot(path); | |||
TileSet *tileset = (TileSet *)data->tilesets.GetEntity(id); | |||
if (!tileset) | |||
{ | |||
tileset = new TileSet(path, image); | |||
data->tilesets.SetEntity(id, tileset); | |||
} | |||
return tileset; | |||
} | |||
void Tiler::Deregister(TileSet *tileset) | |||
{ | |||
data->tilesets.RemoveSlot(tileset); | |||
} | |||
} /* namespace lol */ | |||
@@ -1,42 +0,0 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||
// | |||
// Lol Engine is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
// and/or modify it under the terms of the Do What the Fuck You Want | |||
// to Public License, Version 2, as published by the WTFPL Task Force. | |||
// See http://www.wtfpl.net/ for more details. | |||
// | |||
#pragma once | |||
// | |||
// The Tiler class | |||
// --------------- | |||
// The Tiler is a static class that manages tilesets. | |||
// | |||
#include <stdint.h> | |||
#include "tileset.h" | |||
namespace lol | |||
{ | |||
class Tiler | |||
{ | |||
public: | |||
static TileSet *Register(std::string const &path, ivec2 size, ivec2 count); | |||
static TileSet *Register(std::string const &path); | |||
static TileSet *Register(std::string const &path, image* img, ivec2 size, ivec2 count); | |||
static TileSet *Register(std::string const &path, image* img); | |||
static void Deregister(TileSet *); | |||
private: | |||
Tiler() {} | |||
}; | |||
} /* namespace lol */ | |||
@@ -1,7 +1,7 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
// | |||
// Lol Engine is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -12,6 +12,7 @@ | |||
#include <lol/engine-internal.h> | |||
#include <map> | |||
#include <cstdlib> | |||
#include <cstdio> | |||
#include <cstring> | |||
@@ -27,6 +28,9 @@ | |||
namespace lol | |||
{ | |||
/* The tileset cache */ | |||
static entity_dict<TileSet> tileset_cache; | |||
/* | |||
* TileSet implementation class | |||
*/ | |||
@@ -45,72 +49,107 @@ protected: | |||
* Public TileSet class | |||
*/ | |||
TileSet::TileSet(std::string const &path) | |||
: TextureImage(path), | |||
m_tileset_data(new TileSetData()), | |||
m_palette(nullptr) | |||
TileSet *TileSet::create(std::string const &path) | |||
{ | |||
auto ret = tileset_cache.get(path); | |||
return ret ? ret : tileset_cache.set(path, new TileSet(path)); | |||
} | |||
TileSet::TileSet(std::string const &path, Image* image) | |||
: TextureImage(path, image), | |||
m_tileset_data(new TileSetData()), | |||
m_palette(nullptr) | |||
TileSet *TileSet::create(std::string const &path, image* img) | |||
{ | |||
auto ret = tileset_cache.get(path); | |||
return ret ? ret : tileset_cache.set(path, new TileSet(path, img)); | |||
} | |||
TileSet::TileSet(std::string const &path, Image* image, array<ivec2, ivec2>& tiles) | |||
: TextureImage(path, image), | |||
m_tileset_data(new TileSetData()), | |||
m_palette(nullptr) | |||
TileSet *TileSet::create(std::string const &path, image* img, array<ivec2, ivec2>& tiles) | |||
{ | |||
define_tile(tiles); | |||
auto ret = tileset_cache.get(path); | |||
if (!ret) | |||
{ | |||
ret = tileset_cache.set(path, new TileSet(path, img)); | |||
ret->define_tile(tiles); | |||
} | |||
return ret; | |||
} | |||
TileSet::TileSet(std::string const &path, ivec2 size, ivec2 count) | |||
: TileSet(path) | |||
TileSet *TileSet::create(std::string const &path, ivec2 size, ivec2 count) | |||
{ | |||
/* If count is valid, fix size; otherwise, fix count. */ | |||
if (count.x > 0 && count.y > 0) | |||
auto ret = tileset_cache.get(path); | |||
if (!ret) | |||
{ | |||
size = m_data->m_image_size / count; | |||
} | |||
else | |||
{ | |||
if (size.x <= 0 || size.y <= 0) | |||
size = ivec2(32, 32); | |||
count = max(ivec2(1, 1), m_data->m_image_size / size); | |||
ret = tileset_cache.set(path, new TileSet(path)); | |||
/* If count is valid, fix size; otherwise, fix count. */ | |||
if (count.x > 0 && count.y > 0) | |||
{ | |||
size = ret->m_data->m_image_size / count; | |||
} | |||
else | |||
{ | |||
if (size.x <= 0 || size.y <= 0) | |||
size = ivec2(32, 32); | |||
count = max(ivec2(1, 1), ret->m_data->m_image_size / size); | |||
} | |||
for (int j = 0; j < count.y; ++j) | |||
for (int i = 0; i < count.x; ++i) | |||
{ | |||
ret->define_tile(ibox2(size * ivec2(i, j), | |||
size * ivec2(i + 1, j + 1))); | |||
} | |||
} | |||
for (int j = 0; j < count.y; ++j) | |||
for (int i = 0; i < count.x; ++i) | |||
{ | |||
define_tile(ibox2(size * ivec2(i, j), | |||
size * ivec2(i + 1, j + 1))); | |||
} | |||
return ret; | |||
} | |||
TileSet::TileSet(std::string const &path, Image* image, ivec2 size, ivec2 count) | |||
: TileSet(path, image) | |||
TileSet *TileSet::create(std::string const &path, image* img, ivec2 size, ivec2 count) | |||
{ | |||
/* If count is valid, fix size; otherwise, fix count. */ | |||
if (count.x > 0 && count.y > 0) | |||
{ | |||
size = m_data->m_image_size / count; | |||
} | |||
else | |||
auto ret = tileset_cache.get(path); | |||
if (!ret) | |||
{ | |||
if (size.x <= 0 || size.y <= 0) | |||
size = ivec2(32, 32); | |||
count = max(ivec2(1, 1), m_data->m_image_size / size); | |||
ret = tileset_cache.set(path, new TileSet(path, img)); | |||
/* If count is valid, fix size; otherwise, fix count. */ | |||
if (count.x > 0 && count.y > 0) | |||
{ | |||
size = ret->m_data->m_image_size / count; | |||
} | |||
else | |||
{ | |||
if (size.x <= 0 || size.y <= 0) | |||
size = ivec2(32, 32); | |||
count = max(ivec2(1, 1), ret->m_data->m_image_size / size); | |||
} | |||
for (int j = 0; j < count.y; ++j) | |||
for (int i = 0; i < count.x; ++i) | |||
{ | |||
ret->define_tile(ibox2(size * ivec2(i, j), | |||
size * ivec2(i + 1, j + 1))); | |||
} | |||
} | |||
for (int j = 0; j < count.y; ++j) | |||
for (int i = 0; i < count.x; ++i) | |||
{ | |||
define_tile(ibox2(size * ivec2(i, j), | |||
size * ivec2(i + 1, j + 1))); | |||
} | |||
return ret; | |||
} | |||
void TileSet::destroy(TileSet *tileset) | |||
{ | |||
// FIXME: decrement! | |||
tileset_cache.erase(tileset); | |||
} | |||
TileSet::TileSet(std::string const &path) | |||
: TextureImage(path), | |||
m_tileset_data(new TileSetData()), | |||
m_palette(nullptr) | |||
{ | |||
} | |||
TileSet::TileSet(std::string const &path, image *img) | |||
: TextureImage(path, img), | |||
m_tileset_data(new TileSetData()), | |||
m_palette(nullptr) | |||
{ | |||
} | |||
TileSet::~TileSet() | |||
@@ -1,7 +1,7 @@ | |||
// | |||
// Lol Engine | |||
// | |||
// Copyright © 2010—2018 Sam Hocevar <sam@hocevar.net> | |||
// Copyright © 2010—2019 Sam Hocevar <sam@hocevar.net> | |||
// | |||
// Lol Engine is free software. It comes without any warranty, to | |||
// the extent permitted by applicable law. You can redistribute it | |||
@@ -41,16 +41,22 @@ class TileSet : public TextureImage | |||
typedef TextureImage super; | |||
public: | |||
TileSet(std::string const &path); | |||
TileSet(std::string const &path, image* img); | |||
TileSet(std::string const &path, image* img, array<ivec2, ivec2>& tiles); | |||
static TileSet *create(std::string const &path); | |||
static TileSet *create(std::string const &path, image* img); | |||
static TileSet *create(std::string const &path, image* img, array<ivec2, ivec2>& tiles); | |||
/* Old style: path to PNG file */ | |||
TileSet(std::string const &path, ivec2 size, ivec2 count); | |||
TileSet(std::string const &path, image* img, ivec2 size, ivec2 count); | |||
static TileSet *create(std::string const &path, ivec2 size, ivec2 count); | |||
static TileSet *create(std::string const &path, image* img, ivec2 size, ivec2 count); | |||
static void destroy(TileSet *); | |||
virtual ~TileSet(); | |||
private: | |||
TileSet(std::string const &path); | |||
TileSet(std::string const &path, image *img); | |||
protected: | |||
virtual void Init(std::string const &path, ResourceCodecData* loaded_data); | |||
virtual void Init(std::string const &path, image* img); | |||