Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Refactor|libgui|ModelBank: Storing user data in addition to the model
  • Loading branch information
skyjake committed Aug 9, 2014
1 parent f46f952 commit ff84b5d
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 12 deletions.
19 changes: 14 additions & 5 deletions doomsday/libgui/include/de/graphics/modelbank.h
Expand Up @@ -36,25 +36,34 @@ class LIBGUI_PUBLIC ModelBank : public Bank
{
public:
/**
* Interface for animation-related data for a model. @ingroup gl
* Interface for auxiliary data for a loaded model. @ingroup gl
*/
class LIBGUI_PUBLIC IAnimation
class LIBGUI_PUBLIC IUserData
{
public:
virtual ~IAnimation() {}
virtual ~IUserData() {}
DENG2_AS_IS_METHODS()
};

typedef std::pair<ModelDrawable *, IUserData *> ModelWithData;

public:
ModelBank();

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

ModelDrawable &model(DotPath const &id);

void setAnimation(DotPath const &id, IAnimation *anim);
/**
* Sets the user data of a loaded model.
* @param id Model identifier.
* @param userData User data object. Ownership taken.
*/
void setUserData(DotPath const &id, IUserData *userData);

IUserData const *userData(DotPath const &id) const;

IAnimation const *animation(DotPath const &id) const;
ModelWithData modelAndData(DotPath const &id);

protected:
IData *loadFromSource(ISource &source);
Expand Down
19 changes: 12 additions & 7 deletions doomsday/libgui/src/graphics/modelbank.cpp
Expand Up @@ -35,16 +35,15 @@ DENG2_PIMPL(ModelBank)
struct Data : public IData
{
ModelDrawable model;
QScopedPointer<IAnimation> animation;
std::unique_ptr<IUserData> userData;

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

Instance(Public *i) : Base(i)
{}
Instance(Public *i) : Base(i) {}
};

ModelBank::ModelBank() : Bank("ModelBank", BackgroundThread)
Expand All @@ -60,14 +59,20 @@ ModelDrawable &ModelBank::model(DotPath const &id)
return data(id).as<Instance::Data>().model;
}

void ModelBank::setAnimation(DotPath const &id, IAnimation *anim)
void ModelBank::setUserData(DotPath const &id, IUserData *anim)
{
data(id).as<Instance::Data>().animation.reset(anim);
data(id).as<Instance::Data>().userData.reset(anim);
}

ModelBank::IAnimation const *ModelBank::animation(DotPath const &id) const
ModelBank::IUserData const *ModelBank::userData(DotPath const &id) const
{
return data(id).as<Instance::Data>().animation.data();
return data(id).as<Instance::Data>().userData.get();
}

ModelBank::ModelWithData ModelBank::modelAndData(DotPath const &id)
{
auto &item = data(id).as<Instance::Data>();
return ModelWithData(&item.model, item.userData.get());
}

Bank::IData *ModelBank::loadFromSource(ISource &source)
Expand Down

0 comments on commit ff84b5d

Please sign in to comment.