Skip to content

Commit

Permalink
Refactor|ModelBank|libgui: Custom model objects in a ModelBank
Browse files Browse the repository at this point in the history
ModelBank now can be configured to use any type of ModelDrawable
derived objects.
  • Loading branch information
skyjake committed Oct 26, 2015
1 parent b06e7e6 commit 4da3150
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 10 deletions.
11 changes: 10 additions & 1 deletion doomsday/sdk/libgui/include/de/graphics/modelbank.h
Expand Up @@ -22,6 +22,8 @@
#include <de/Bank>
#include <de/ModelDrawable>

#include <functional>

namespace de {

/**
Expand All @@ -46,15 +48,22 @@ class LIBGUI_PUBLIC ModelBank : public Bank
DENG2_AS_IS_METHODS()
};

typedef std::function<ModelDrawable * ()> Constructor;
typedef std::pair<ModelDrawable *, IUserData *> ModelWithData;

public:
ModelBank();
ModelBank(Constructor modelConstructor = nullptr);

void add(DotPath const &id, String const &sourcePath);

ModelDrawable &model(DotPath const &id);

template <typename Type>
Type &model(DotPath const &id)
{
return static_cast<Type &>(model(id));
}

/**
* Sets the user data of a loaded model.
* @param id Model identifier.
Expand Down
25 changes: 16 additions & 9 deletions doomsday/sdk/libgui/src/graphics/modelbank.cpp
Expand Up @@ -23,6 +23,8 @@ namespace de {

DENG2_PIMPL(ModelBank)
{
Constructor modelConstructor;

/// Source information for loading a model.
struct Source : public ISource
{
Expand All @@ -34,21 +36,25 @@ DENG2_PIMPL(ModelBank)
/// Loaded model instance.
struct Data : public IData
{
ModelDrawable model;
std::unique_ptr<ModelDrawable> model;
std::unique_ptr<IUserData> userData;

Data(String const &path)
Data(ModelDrawable *model, String const &path)
: model(model)
{
model.load(App::rootFolder().locate<File>(path));
model->load(App::rootFolder().locate<File>(path));
}
};

Instance(Public *i) : Base(i) {}
Instance(Public *i, Constructor c)
: Base(i)
, modelConstructor(c? c : [] () { return new ModelDrawable; })
{}
};

ModelBank::ModelBank()
ModelBank::ModelBank(Constructor modelConstructor)
: Bank("ModelBank", BackgroundThread)
, d(new Instance(this))
, d(new Instance(this, modelConstructor))
{}

void ModelBank::add(DotPath const &id, String const &sourcePath)
Expand All @@ -58,7 +64,7 @@ void ModelBank::add(DotPath const &id, String const &sourcePath)

ModelDrawable &ModelBank::model(DotPath const &id)
{
return data(id).as<Instance::Data>().model;
return *data(id).as<Instance::Data>().model;
}

void ModelBank::setUserData(DotPath const &id, IUserData *anim)
Expand All @@ -74,12 +80,13 @@ ModelBank::IUserData const *ModelBank::userData(DotPath const &id) const
ModelBank::ModelWithData ModelBank::modelAndData(DotPath const &id) const
{
auto &item = data(id).as<Instance::Data>();
return ModelWithData(&item.model, item.userData.get());
return ModelWithData(item.model.get(), item.userData.get());
}

Bank::IData *ModelBank::loadFromSource(ISource &source)
{
return new Instance::Data(source.as<Instance::Source>().path);
return new Instance::Data(d->modelConstructor(),
source.as<Instance::Source>().path);
}

} // namespace de

0 comments on commit 4da3150

Please sign in to comment.