add texture index to Sprite class, add more error checks to texture surface creation

This commit is contained in:
ohsqueezy 2023-08-08 12:41:10 -04:00
parent 62450f7033
commit edafaf08ea
6 changed files with 55 additions and 15 deletions

View File

@ -72,9 +72,10 @@ bool sb::Log::gl_errors(const std::string& heading)
return error_logged; return error_logged;
} }
void sb::Log::sdl_error(const std::string& message) std::ostringstream sb::Log::sdl_error(const std::string& message)
{ {
std::ostringstream full_message; std::ostringstream full_message;
full_message << message << " " << SDL_GetError(); full_message << message << " " << SDL_GetError();
log(full_message, Level::ERROR); log(full_message, Level::ERROR);
return full_message;
} }

View File

@ -81,11 +81,12 @@ namespace sb
/*! /*!
* Log a message, adding the results of `SDL_GetError` to the end of the message. Should be used to add more information to * Log a message, adding the results of `SDL_GetError` to the end of the message. Should be used to add more information to
* an error statement when the error happened in SDL. The priority level will always be `Level::ERROR` * an error statement when the error happened in SDL. The priority level will always be `Level::ERROR`.
* *
* @param message text to log before the SDL error is appended * @param message text to log before the SDL error is appended
* @return a string stream containing the full message
*/ */
static void sdl_error(const std::string& message); static std::ostringstream sdl_error(const std::string& message = "");
}; };

View File

@ -209,7 +209,7 @@ namespace sb
{ {
glUniform1i(texture_flag_uniform.value(), true); glUniform1i(texture_flag_uniform.value(), true);
} }
plane.bind_textures(); plane.texture().bind();
} }
else if (texture_flag_uniform.has_value()) else if (texture_flag_uniform.has_value())
{ {

View File

@ -36,6 +36,9 @@ namespace sb
* without having to set all the transformations every time one is changed. */ * without having to set all the transformations every time one is changed. */
glm::mat4 _scale {1.0f}, _translation {1.0f}, _rotation {1.0f}; glm::mat4 _scale {1.0f}, _translation {1.0f}, _rotation {1.0f};
/* A sprite by definition has only one texture per draw, so keep an index to the currently active texture. */
int _texture_index = 0;
public: public:
/*! /*!
@ -145,14 +148,31 @@ namespace sb
} }
/*! /*!
* Get a constant reference to the texture attached to the sprite's plane object at the given index . If no index is given, * Get a constant reference to the texture attached to the sprite's plane object at the object's current texture index.
* get the texture at index 0. If there are no textures, an exception will be thrown.
* *
* @param index index of texture to get * @param index index of texture to get
*/ */
const sb::Texture& texture(int index = 0) const const sb::Texture& texture() const
{ {
return plane.texture(index); return plane.texture(_texture_index);
}
/*!
* @param index set the object's texture index
* @return constant reference to the texture at the given index
*/
const sb::Texture& texture_index(int index)
{
_texture_index = index;
return texture();
}
/*!
* @return the object's current texture index value
*/
int texture_index() const
{
return _texture_index;
} }
/*! /*!
@ -178,12 +198,13 @@ namespace sb
} }
/*! /*!
* Bind all of this sprite's attributes and textures by calling each of their bind methods. Textures and attributes all must already * Bind all of this sprite's attributes and its active texture by calling each of their bind methods. Textures and attributes all must already
* have GL indices set, for example by calling Texture::generate() and Attributes::index(GLint) on each. * have GL indices set, for example by calling Texture::generate() and Attributes::index(GLint) on each.
*/ */
void bind() void bind()
{ {
plane.bind(); plane.bind_attributes();
texture().bind();
} }
/*! /*!
@ -296,7 +317,7 @@ namespace sb
{ {
glUniform1i(texture_flag_uniform.value(), true); glUniform1i(texture_flag_uniform.value(), true);
} }
plane.bind_textures(); texture().bind();
} }
else if (texture_flag_uniform.has_value()) else if (texture_flag_uniform.has_value())
{ {

View File

@ -7,6 +7,7 @@
#include "Model.hpp" #include "Model.hpp"
#include "Color.hpp" #include "Color.hpp"
#include "Log.hpp"
namespace sb namespace sb
{ {

View File

@ -75,10 +75,26 @@ void Texture::load(fs::path path)
/* Load file path as a surface object to access pixel data and flip into OpenGL orientation. Attach a destructor so it will free /* Load file path as a surface object to access pixel data and flip into OpenGL orientation. Attach a destructor so it will free
* itself when it goes out of scope at the end of this function. */ * itself when it goes out of scope at the end of this function. */
std::unique_ptr<SDL_Surface, decltype(&SDL_FreeSurface)> surface(IMG_Load(path.c_str()), SDL_FreeSurface); std::unique_ptr<SDL_Surface, decltype(&SDL_FreeSurface)> surface(IMG_Load(path.c_str()), SDL_FreeSurface);
std::unique_ptr<SDL_Surface, decltype(&SDL_FreeSurface)> flipped_surface(rotozoomSurfaceXY(surface.get(), 0, 1, -1, 0), SDL_FreeSurface); if (surface.get() != nullptr)
load(flipped_surface.get()); {
message << "Loading image at " << path; std::unique_ptr<SDL_Surface, decltype(&SDL_FreeSurface)> flipped_surface(rotozoomSurfaceXY(surface.get(), 0, 1, -1, 0), SDL_FreeSurface);
message_level = sb::Log::INFO; if (flipped_surface.get() != nullptr)
{
load(flipped_surface.get());
message << "Loading image at " << path;
message_level = sb::Log::INFO;
}
else
{
message << "Error flipping image surface at " << path;
throw std::runtime_error(sb::Log::sdl_error(message.str()).str());
}
}
else
{
message << "Error opening image " << path;
throw std::runtime_error(sb::Log::sdl_error(message.str()).str());
}
} }
else else
{ {