Skip to content

Commit 631573a

Browse files
committed
Add user sprite proxy functions to ProjectM class.
1 parent 9266716 commit 631573a

File tree

2 files changed

+93
-0
lines changed

2 files changed

+93
-0
lines changed

Diff for: src/libprojectM/ProjectM.cpp

+42
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@
3333
#include <Renderer/ShaderCache.hpp>
3434
#include <Renderer/TransitionShaderManager.hpp>
3535

36+
#include <UserSprites/SpriteManager.hpp>
37+
3638
namespace libprojectM {
3739

3840
ProjectM::ProjectM()
@@ -178,6 +180,9 @@ void ProjectM::RenderFrame(uint32_t targetFramebufferObject /*= 0*/)
178180
m_textureCopier->Draw(m_activePreset->OutputTexture(), false, false);
179181
}
180182

183+
// Draw user sprites
184+
m_spriteManager->Draw(audioData, renderContext, targetFramebufferObject, { m_activePreset, m_transitioningPreset });
185+
181186
m_frameCount++;
182187
m_previousFrameVolume = audioData.vol;
183188
}
@@ -201,6 +206,8 @@ void ProjectM::Initialize()
201206

202207
m_textureCopier = std::make_unique<Renderer::CopyTexture>();
203208

209+
m_spriteManager = std::make_unique<UserSprites::SpriteManager>();
210+
204211
m_presetFactoryManager->initialize();
205212

206213
/* Set the seed to the current time in seconds */
@@ -270,6 +277,41 @@ auto ProjectM::WindowHeight() -> int
270277
return m_windowHeight;
271278
}
272279

280+
auto ProjectM::AddUserSprite(const std::string& type, const std::string& spriteData) -> uint32_t
281+
{
282+
return m_spriteManager->Spawn(type, spriteData, GetRenderContext());
283+
}
284+
285+
void ProjectM::DestroyUserSprite(uint32_t spriteIdentifier)
286+
{
287+
m_spriteManager->Destroy(spriteIdentifier);
288+
}
289+
290+
void ProjectM::DestroyAllUserSprites()
291+
{
292+
m_spriteManager->DestroyAll();
293+
}
294+
295+
auto ProjectM::UserSpriteCount() const -> uint32_t
296+
{
297+
return m_spriteManager->ActiveSpriteCount();
298+
}
299+
300+
void ProjectM::SetUserSpriteLimit(uint32_t maxSprites)
301+
{
302+
m_spriteManager->SpriteSlots(maxSprites);
303+
}
304+
305+
auto ProjectM::UserSpriteLimit() const -> uint32_t
306+
{
307+
return m_spriteManager->SpriteSlots();
308+
}
309+
310+
auto ProjectM::UserSpriteIdentifiers() const -> std::vector<uint32_t>
311+
{
312+
return m_spriteManager->ActiveSpriteIdentifiers();
313+
}
314+
273315
void ProjectM::SetPresetLocked(bool locked)
274316
{
275317
// ToDo: Add a preset switch timer separate from the display timer and reset to 0 when

Diff for: src/libprojectM/ProjectM.hpp

+51
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
#include <Audio/PCM.hpp>
2828

2929
#include <memory>
30+
#include <set>
3031
#include <string>
3132
#include <vector>
3233

@@ -41,6 +42,10 @@ class ShaderCache;
4142
class TransitionShaderManager;
4243
} // namespace Renderer
4344

45+
namespace UserSprites {
46+
class SpriteManager;
47+
} // namespace UserSprites
48+
4449
class Preset;
4550
class PresetFactoryManager;
4651
class TimeKeeper;
@@ -192,6 +197,51 @@ class PROJECTM_EXPORT ProjectM
192197

193198
auto WindowHeight() -> int;
194199

200+
/**
201+
* @brief Creates a new user sprite.
202+
* @param type The type of the sprite to create.
203+
* @param spriteData The type-dependent sprite data.
204+
* @return A unique, non-zero sprite identifier if the sprite was created successfully,
205+
* or zero if any error occurred or the sprite limit was reached.
206+
*/
207+
auto AddUserSprite(const std::string& type, const std::string& spriteData) -> uint32_t;
208+
209+
/**
210+
* @brief Destroys a single sprite using its identifier.
211+
* @param spriteIdentifier The identifier of the sprite to destroy.
212+
*/
213+
void DestroyUserSprite(uint32_t spriteIdentifier);
214+
215+
/**
216+
* @brief Destroys all active user sprites.
217+
*/
218+
void DestroyAllUserSprites();
219+
220+
/**
221+
* @brief Returns the current user sprite count.
222+
* @return The number of currently active user sprites.
223+
*/
224+
auto UserSpriteCount() const -> uint32_t;
225+
226+
/**
227+
* @brief Sets a new limit for user sprites.
228+
* Any sprites above the new limit will be removed in order, oldest first.
229+
* @param maxSprites The new sprite limit. 0 disables sprites, 16 is the default.
230+
*/
231+
void SetUserSpriteLimit(uint32_t maxSprites);
232+
233+
/**
234+
* @brief Returns the current user sprite display limit.
235+
* @return The current user sprite limit.
236+
*/
237+
auto UserSpriteLimit() const -> uint32_t;
238+
239+
/**
240+
* @brief Returns a list of identifiers for all active user sprites.
241+
* @return A list of all active user sprite identifiers, ordered by age (oldest first).
242+
*/
243+
auto UserSpriteIdentifiers() const -> std::vector<uint32_t>;
244+
195245
private:
196246
void Initialize();
197247

@@ -235,6 +285,7 @@ class PROJECTM_EXPORT ProjectM
235285
std::unique_ptr<Preset> m_transitioningPreset; //!< Destination preset when smooth preset switching.
236286
std::unique_ptr<Renderer::PresetTransition> m_transition; //!< Transition effect used for blending.
237287
std::unique_ptr<TimeKeeper> m_timeKeeper; //!< Keeps the different timers used to render and switch presets.
288+
std::unique_ptr<UserSprites::SpriteManager> m_spriteManager; //!< Manages all types of user sprites.
238289
};
239290

240291
} // namespace libprojectM

0 commit comments

Comments
 (0)