+void AssetLoader::LoadModels(
+ const string &set_name,
+ ModelRegistry &models,
+ ResourceIndex &tex_index,
+ const ShapeRegistry &shapes
+) const {
+ string full = data + set_name + ".models";
+ ifstream file(full);
+ if (!file) {
+ throw runtime_error("failed to open model file " + full);
+ }
+ TokenStreamReader in(file);
+ string model_name;
+ string prop_name;
+ while (in.HasMore()) {
+ in.ReadIdentifier(model_name);
+ in.Skip(Token::EQUALS);
+ in.Skip(Token::ANGLE_BRACKET_OPEN);
+ Model &model = models.Add(model_name);
+ while (in.HasMore() && in.Peek().type != Token::ANGLE_BRACKET_CLOSE) {
+ in.ReadIdentifier(prop_name);
+ in.Skip(Token::EQUALS);
+ if (prop_name == "root") {
+ model.RootPart().Read(in, tex_index, shapes);
+ } else if (prop_name == "body") {
+ model.SetBody(in.GetULong());
+ } else if (prop_name == "eyes") {
+ model.SetEyes(in.GetULong());
+ } else {
+ while (in.HasMore() && in.Peek().type != Token::SEMICOLON) {
+ in.Next();
+ }
+ }
+ in.Skip(Token::SEMICOLON);
+ }
+ model.Enumerate();
+ in.Skip(Token::ANGLE_BRACKET_CLOSE);
+ in.Skip(Token::SEMICOLON);
+ }
+}
+
+void AssetLoader::LoadShapes(const string &set_name, ShapeRegistry &shapes) const {
+ string full = data + set_name + ".shapes";
+ ifstream file(full);
+ if (!file) {
+ throw runtime_error("failed to open shape file " + full);
+ }
+ TokenStreamReader in(file);
+ string shape_name;
+ while (in.HasMore()) {
+ in.ReadIdentifier(shape_name);
+ in.Skip(Token::EQUALS);
+ Shape &shape = shapes.Add(shape_name);
+ shape.Read(in);
+ in.Skip(Token::SEMICOLON);
+ }
+}
+
+Sound AssetLoader::LoadSound(const string &name) const {
+ string full = sounds + name + ".wav";
+ return Sound(full.c_str());
+}
+
+Texture AssetLoader::LoadTexture(const string &name) const {
+ string full = textures + name + ".png";
+ Texture tex;
+ SDL_Surface *srf = IMG_Load(full.c_str());
+ if (!srf) {
+ throw SDLError("IMG_Load");
+ }
+ tex.Bind();
+ tex.Data(*srf);
+ SDL_FreeSurface(srf);
+ return tex;
+}
+
+void AssetLoader::LoadTexture(const string &name, ArrayTexture &tex, int layer) const {
+ string full = textures + name + ".png";
+ SDL_Surface *srf = IMG_Load(full.c_str());
+ if (!srf) {
+ throw SDLError("IMG_Load");
+ }
+ tex.Bind();
+ try {
+ tex.Data(layer, *srf);
+ } catch (...) {
+ SDL_FreeSurface(srf);
+ throw;
+ }
+ SDL_FreeSurface(srf);
+}
+
+void AssetLoader::LoadTextures(const ResourceIndex &index, ArrayTexture &tex) const {
+ // TODO: where the hell should that size come from?
+ tex.Reserve(16, 16, index.Size(), Format());
+ for (const auto &entry : index.Entries()) {
+ LoadTexture(entry.first, tex, entry.second);
+ }
+}
+