make sure we call the sprite load callback
This commit is contained in:
@@ -49,8 +49,10 @@ public:
|
||||
|
||||
private:
|
||||
void asyncParseJSON();
|
||||
void asyncParseImage();
|
||||
|
||||
static void parseJSON(std::shared_ptr<Sprite> &sprite);
|
||||
static void parseImage(std::shared_ptr<Sprite> &sprite);
|
||||
static void complete(std::shared_ptr<Sprite> &sprite);
|
||||
|
||||
private:
|
||||
|
||||
@@ -8,6 +8,8 @@
|
||||
#include <mutex>
|
||||
#include <memory>
|
||||
|
||||
typedef struct uv_loop_s uv_loop_t;
|
||||
|
||||
namespace llmr {
|
||||
|
||||
class Raster : public std::enable_shared_from_this<Raster> {
|
||||
@@ -16,7 +18,7 @@ public:
|
||||
~Raster();
|
||||
|
||||
// load image data
|
||||
void load(const std::string& data);
|
||||
void load();
|
||||
|
||||
// set shared texture pool
|
||||
void setTexturepool(Texturepool* texturepool);
|
||||
@@ -25,13 +27,15 @@ public:
|
||||
void bind(bool linear = false);
|
||||
|
||||
// loaded status
|
||||
operator bool() const;
|
||||
bool isLoaded() const;
|
||||
|
||||
// animations
|
||||
void beginFadeInAnimation();
|
||||
bool needsAnimation() const;
|
||||
void updateAnimations(double time);
|
||||
|
||||
inline void setData(const std::string &img) { data = img; }
|
||||
|
||||
public:
|
||||
// loaded image dimensions
|
||||
uint32_t width = 0, height = 0;
|
||||
@@ -61,6 +65,9 @@ private:
|
||||
// min/mag filter
|
||||
uint32_t filter = 0;
|
||||
|
||||
// the encoded image data.
|
||||
std::string data;
|
||||
|
||||
// the raw pixels
|
||||
char *img = nullptr;
|
||||
|
||||
|
||||
@@ -84,7 +84,8 @@ std::unique_ptr<Bucket> TileParser::createBucket(const BucketDescription& bucket
|
||||
if (bucket_desc.type == BucketType::Raster) {
|
||||
if (raster_data.length()) {
|
||||
tile.raster = std::make_shared<Raster>();
|
||||
tile.raster->load(raster_data);
|
||||
tile.raster->setData(raster_data);
|
||||
tile.raster->load();
|
||||
}
|
||||
return createRasterBucket(bucket_desc);
|
||||
} else {
|
||||
|
||||
@@ -542,7 +542,7 @@ void Painter::renderPoint(PointBucket& bucket, const std::string& layer_name, co
|
||||
#endif
|
||||
pointShader->setPointTopLeft({{ imagePos.tl.x, imagePos.tl.y }});
|
||||
pointShader->setPointBottomRight({{ imagePos.br.x, imagePos.br.y }});
|
||||
if (*sprite->raster) {
|
||||
if (sprite->raster->isLoaded()) {
|
||||
sprite->raster->bind(map.getState().isChanging());
|
||||
}
|
||||
glDepthRange(strata, 1.0f);
|
||||
|
||||
@@ -40,9 +40,8 @@ void Sprite::load(const std::string& base_url) {
|
||||
|
||||
platform::request_http(base_url + suffix + ".png", [sprite](platform::Response *res) {
|
||||
if (res->code == 200) {
|
||||
// TODO: move raster loading to other thread
|
||||
// TODO: call complete handler
|
||||
sprite->raster->load(res->body);
|
||||
sprite->raster->setData(res->body);
|
||||
sprite->asyncParseImage();
|
||||
} else {
|
||||
fprintf(stderr, "failed to load sprite image\n");
|
||||
}
|
||||
@@ -51,7 +50,7 @@ void Sprite::load(const std::string& base_url) {
|
||||
|
||||
void Sprite::complete(std::shared_ptr<Sprite> &sprite) {
|
||||
std::lock_guard<std::mutex> lock(sprite->mtx);
|
||||
if (*sprite->raster && sprite->pos.size()) {
|
||||
if (sprite->raster && sprite->raster->isLoaded() && sprite->pos.size()) {
|
||||
sprite->loaded = true;
|
||||
sprite->map.update();
|
||||
fprintf(stderr, "sprite loaded\n");
|
||||
@@ -63,11 +62,16 @@ bool Sprite::isLoaded() const {
|
||||
return loaded;
|
||||
}
|
||||
|
||||
void Sprite::asyncParseImage() {
|
||||
new uv::work<std::shared_ptr<Sprite>>(map.getLoop(), parseImage, complete, shared_from_this());
|
||||
}
|
||||
|
||||
void Sprite::asyncParseJSON() {
|
||||
new uv::work<std::shared_ptr<Sprite>>(map.getLoop(),
|
||||
parseJSON,
|
||||
complete,
|
||||
shared_from_this());
|
||||
new uv::work<std::shared_ptr<Sprite>>(map.getLoop(), parseJSON, complete, shared_from_this());
|
||||
}
|
||||
|
||||
void Sprite::parseImage(std::shared_ptr<Sprite> &sprite) {
|
||||
sprite->raster->load();
|
||||
}
|
||||
|
||||
void Sprite::parseJSON(std::shared_ptr<Sprite> &sprite) {
|
||||
@@ -101,7 +105,7 @@ void Sprite::parseJSON(std::shared_ptr<Sprite> &sprite) {
|
||||
}
|
||||
|
||||
ImagePosition Sprite::getPosition(const std::string& name, bool repeating) {
|
||||
if (!*this->raster) return {};
|
||||
if (!this->raster || !this->raster->isLoaded()) return {};
|
||||
|
||||
// `repeating` indicates that the image will be used in a repeating pattern
|
||||
// repeating pattern images are assumed to have a 1px padding that mirrors the opposite edge
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <llmr/platform/platform.hpp>
|
||||
#include <llmr/platform/gl.hpp>
|
||||
#include <llmr/util/time.hpp>
|
||||
#include <llmr/util/uv.hpp>
|
||||
|
||||
#include <png.h>
|
||||
|
||||
@@ -20,20 +21,22 @@ Raster::~Raster() {
|
||||
}
|
||||
}
|
||||
|
||||
Raster::operator bool() const {
|
||||
bool Raster::isLoaded() const {
|
||||
std::lock_guard<std::mutex> lock(mtx);
|
||||
return loaded;
|
||||
}
|
||||
|
||||
void Raster::load(const std::string& data) {
|
||||
std::shared_ptr<Raster> raster = shared_from_this();
|
||||
void Raster::load() {
|
||||
loadImage(data);
|
||||
|
||||
raster->loadImage(data);
|
||||
|
||||
std::lock_guard<std::mutex> lock(raster->mtx);
|
||||
if (raster->img) {
|
||||
raster->loaded = true;
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mtx);
|
||||
if (img) {
|
||||
loaded = true;
|
||||
}
|
||||
}
|
||||
|
||||
data.clear();
|
||||
}
|
||||
|
||||
struct Buffer {
|
||||
|
||||
Reference in New Issue
Block a user