summaryrefslogtreecommitdiff
path: root/assetFactory/assetFactory.cpp
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2023-04-13 02:20:50 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2023-04-13 02:20:50 +0100
commit1b97b7b4cb126c8b60ac1acbd7e72274f0ddf21f (patch)
tree5271470d667c2d1b3372848d60bbcb04a011f2fe /assetFactory/assetFactory.cpp
parentAdd missing forward declaration (diff)
downloadilt-1b97b7b4cb126c8b60ac1acbd7e72274f0ddf21f.tar.bz2
ilt-1b97b7b4cb126c8b60ac1acbd7e72274f0ddf21f.tar.xz
ilt-1b97b7b4cb126c8b60ac1acbd7e72274f0ddf21f.zip
Use texture atlas for asset factory
Diffstat (limited to 'assetFactory/assetFactory.cpp')
-rw-r--r--assetFactory/assetFactory.cpp26
1 files changed, 8 insertions, 18 deletions
diff --git a/assetFactory/assetFactory.cpp b/assetFactory/assetFactory.cpp
index 917edfe..46b4642 100644
--- a/assetFactory/assetFactory.cpp
+++ b/assetFactory/assetFactory.cpp
@@ -80,17 +80,11 @@ AssetFactory::parseColour(std::string_view in) const
throw std::runtime_error("No such asset factory colour");
}
-AssetFactory::TextureFragmentCoords
-AssetFactory::getTextureCoords(std::string_view id) const
+GLuint
+AssetFactory::getMaterialIndex(std::string_view id) const
{
createTexutre();
- const auto & fragmentUV = textureFragmentPositions.at(id);
- return {
- fragmentUV.xy(),
- fragmentUV.zy(),
- fragmentUV.zw(),
- fragmentUV.xw(),
- };
+ return textureFragmentPositions.at(id);
}
Asset::TexturePtr
@@ -103,7 +97,7 @@ AssetFactory::getTexture() const
void
AssetFactory::createTexutre() const
{
- if (!textureFragments.empty() && (!texture || textureFragmentPositions.empty())) {
+ if (!textureFragments.empty() && !texture) {
// * layout images
std::vector<TexturePacker::Image> imageSizes;
std::transform(
@@ -112,18 +106,14 @@ AssetFactory::createTexutre() const
});
const auto [layout, outSize] = TexturePacker {imageSizes}.pack();
// * create texture
- texture = std::make_shared<Texture>(outSize.x, outSize.y, TextureOptions {.wrap = GL_CLAMP_TO_EDGE});
+ texture = std::make_shared<TextureAtlas>(outSize.x, outSize.y, layout.size());
std::transform(textureFragments.begin(), textureFragments.end(),
std::inserter(textureFragmentPositions, textureFragmentPositions.end()),
- [position = layout.begin(), size = imageSizes.begin(), outSize = glm::vec2 {outSize}](
- const auto & tf) mutable {
- const auto positionFraction = glm::vec4 {*position, *position + *size} / outSize.xyxy();
- glTexSubImage2D(GL_TEXTURE_2D, 0, static_cast<GLint>(position->x), static_cast<GLint>(position->y),
- static_cast<GLint>(size->x), static_cast<GLint>(size->y), GL_RGBA, GL_UNSIGNED_BYTE,
- tf.second->image->data.data());
+ [position = layout.begin(), size = imageSizes.begin(), this](const auto & tf) mutable {
+ const auto m = texture->add(*position, *size, tf.second->image->data.data());
position++;
size++;
- return decltype(textureFragmentPositions)::value_type {tf.first, positionFraction};
+ return decltype(textureFragmentPositions)::value_type {tf.first, m};
});
}
}