Changes in Particle System for NUI 82/296482/4
authorAdam Bialogonski <adam.b@samsung.com>
Thu, 3 Aug 2023 12:57:55 +0000 (13:57 +0100)
committerAdam Bialogonski <adam.b@samsung.com>
Thu, 3 Aug 2023 13:34:37 +0000 (14:34 +0100)
Change-Id: I89c5e40dc7cb8afa6afa0f4845e0d3e5f3a10a1d
Signed-off-by: Adam Bialogonski <adam.b@samsung.com>
13 files changed:
automated-tests/src/dali-toolkit/utc-Dali-ParticleSystem.cpp
dali-toolkit/internal/particle-system/particle-emitter-impl.cpp
dali-toolkit/internal/particle-system/particle-emitter-impl.h
dali-toolkit/internal/particle-system/particle-renderer-impl.cpp
dali-toolkit/internal/particle-system/particle-renderer-impl.h
dali-toolkit/public-api/particle-system/particle-emitter.cpp
dali-toolkit/public-api/particle-system/particle-emitter.h
dali-toolkit/public-api/particle-system/particle-list.cpp
dali-toolkit/public-api/particle-system/particle-list.h
dali-toolkit/public-api/particle-system/particle-modifier.cpp
dali-toolkit/public-api/particle-system/particle-modifier.h
dali-toolkit/public-api/particle-system/particle-renderer.cpp
dali-toolkit/public-api/particle-system/particle-renderer.h

index 54ad18b..eb7ba1d 100644 (file)
@@ -320,6 +320,109 @@ int UtcDaliParticleSystemEmitterNew(void)
   END_TEST;
 }
 
+int UtcDaliParticleSystemEmitterNew2(void)
+{
+  // create particle emitter
+  auto emitter = ParticleEmitter::New();
+
+  bool result = (emitter != nullptr);
+  DALI_TEST_EQUALS(result, true, TEST_LOCATION);
+
+  // Create test source
+  auto source = ParticleSource::New<TestSource>(&emitter);
+
+  // Create test renderer
+  auto renderer = ParticleRenderer::New();
+
+  // Create modifier
+  auto modifier = ParticleModifier::New<TestModifier>();
+
+  // Create domain
+  auto domain = ParticleDomain::New();
+
+  // Test emitter readiness
+  auto ready = emitter.GetStatus();
+
+  // Emitter should return status incomplete
+  DALI_TEST_EQUALS(ready, ParticleEmitter::Status::INCOMPLETE, TEST_LOCATION);
+
+  // Attach all components to the emitter
+  emitter.SetSource(source);
+  emitter.SetRenderer(renderer);
+  emitter.AddModifier(modifier);
+  emitter.SetDomain(domain);
+
+  // test blending mode
+  DALI_TEST_EQUALS(renderer.GetBlendingMode(), Dali::Toolkit::ParticleSystem::BlendingMode::DEFAULT, TEST_LOCATION);
+
+  emitter.SetParticleCount(10000);
+  DALI_TEST_EQUALS(emitter.GetParticleCount(), 10000, TEST_LOCATION);
+
+  auto m = emitter.GetModifierAt(0);
+  DALI_TEST_EQUALS(m != nullptr, true, TEST_LOCATION);
+
+  m.GetModifierCallback();
+
+  // test status again (domain is optional);
+  ready = emitter.GetStatus();
+
+  // Emitter should return status incomplete
+  DALI_TEST_EQUALS(ready, ParticleEmitter::Status::READY, TEST_LOCATION);
+
+  END_TEST;
+}
+
+int UtcDaliParticleSystemEmitterDefaultStreams(void)
+{
+  // create particle emitter
+  auto emitter = ParticleEmitter::New();
+
+  bool result = (emitter != nullptr);
+  DALI_TEST_EQUALS(result, true, TEST_LOCATION);
+
+  // Create test source
+  auto source = ParticleSource::New<TestSource>(&emitter);
+
+  // Create test renderer
+  auto renderer = ParticleRenderer::New();
+
+  // Create modifier
+  auto modifier = ParticleModifier::New<TestModifier>();
+
+  // Create domain
+  auto domain = ParticleDomain::New();
+
+  // Test emitter readiness
+  auto ready = emitter.GetStatus();
+
+  // Emitter should return status incomplete
+  DALI_TEST_EQUALS(ready, ParticleEmitter::Status::INCOMPLETE, TEST_LOCATION);
+
+  // Attach all components to the emitter
+  emitter.SetSource(source);
+  emitter.SetRenderer(renderer);
+  emitter.AddModifier(modifier);
+  emitter.SetDomain(domain);
+
+  auto                  particleList   = emitter.GetParticleList();
+  std::vector<uint32_t> expectedValues = {
+    ParticleStream::POSITION_STREAM_BIT, 0, ParticleStream::COLOR_STREAM_BIT, 3, ParticleStream::VELOCITY_STREAM_BIT, 2, ParticleStream::SCALE_STREAM_BIT, 1, ParticleStream::LIFETIME_STREAM_BIT, 4, ParticleStream::LIFETIME_BASE_STREAM_BIT, 5};
+
+  for(auto i = 0u; i < expectedValues.size(); i += 2)
+  {
+    auto index = particleList.GetDefaultStreamIndex(expectedValues[i]);
+    DALI_TEST_EQUALS(index, expectedValues[i + 1], TEST_LOCATION);
+  }
+
+  // test status again (domain is optional);
+  ready = emitter.GetStatus();
+
+  // Emitter should return status incomplete
+  DALI_TEST_EQUALS(ready, ParticleEmitter::Status::READY, TEST_LOCATION);
+
+  END_TEST;
+}
+
 int UtcDaliParticleSystemEmitterModifierStack(void)
 {
   // create particle emitter
index 80d5700..150d857 100644 (file)
@@ -89,13 +89,21 @@ void ParticleEmitter::SetRenderer(const ParticleSystem::ParticleRenderer& render
 
 void ParticleEmitter::SetParticleCount(uint32_t maxParticleCount)
 {
-  // Default particle list has no data streams, it will replace old list
-  mParticleList = ParticleSystem::ParticleList::New(maxParticleCount,
-                                                    ParticleStream::POSITION_STREAM_BIT |
-                                                      ParticleStream::COLOR_STREAM_BIT |
-                                                      ParticleStream::VELOCITY_STREAM_BIT |
-                                                      ParticleStream::SCALE_STREAM_BIT |
-                                                      ParticleStream::LIFETIME_STREAM_BIT);
+  if(!mParticleList || maxParticleCount != GetImplementation(mParticleList).GetParticleCount())
+  {
+    // Default particle list has no data streams, it will replace old list
+    mParticleList = ParticleSystem::ParticleList::New(maxParticleCount,
+                                                      ParticleStream::POSITION_STREAM_BIT |
+                                                        ParticleStream::COLOR_STREAM_BIT |
+                                                        ParticleStream::VELOCITY_STREAM_BIT |
+                                                        ParticleStream::SCALE_STREAM_BIT |
+                                                        ParticleStream::LIFETIME_STREAM_BIT);
+  }
+}
+
+uint32_t ParticleEmitter::GetParticleCount()
+{
+  return GetImplementation(mParticleList).GetParticleCount();
 }
 
 ParticleSystem::ParticleList& ParticleEmitter::GetParticleList()
index 4b09f2b..8b2459e 100644 (file)
@@ -79,6 +79,8 @@ public:
 
   void SetParticleCount(uint32_t maxParticleCount);
 
+  uint32_t GetParticleCount();
+
   ParticleSystem::ParticleList& GetParticleList();
 
   uint32_t AddModifier(const ParticleSystem::ParticleModifier& modifier);
index 87eefa5..123fa66 100644 (file)
@@ -49,6 +49,11 @@ void ParticleRenderer::SetBlendingMode(BlendingMode blendingMode)
   mBlendingMode = blendingMode;
 }
 
+BlendingMode ParticleRenderer::GetBlendingMode() const
+{
+  return mBlendingMode;
+}
+
 void ParticleRenderer::CreateShader()
 {
   // Create shader dynamically
index 59bee33..bad792c 100644 (file)
@@ -60,6 +60,8 @@ public:
 
   void SetBlendingMode(BlendingMode blendingMode);
 
+  BlendingMode GetBlendingMode() const;
+
   bool Initialize();
 
   void PrepareToDie();
index c854e23..e40f159 100644 (file)
@@ -62,6 +62,11 @@ void ParticleEmitter::SetParticleCount(uint32_t maxParticleCount)
   GetImplementation(*this).SetParticleCount(maxParticleCount);
 }
 
+uint32_t ParticleEmitter::GetParticleCount()
+{
+  return GetImplementation(*this).GetParticleCount();
+}
+
 ParticleDomain ParticleEmitter::GetDomain() const
 {
   return GetImplementation(*this).GetDomain();
index 15e3aa7..dffa6e7 100644 (file)
@@ -200,6 +200,13 @@ public:
   void SetParticleCount(uint32_t maxParticleCount);
 
   /**
+   * @brief Returns maximum number of particles in the system
+   *
+   * @return Maximum number of particles
+   */
+  uint32_t GetParticleCount();
+
+  /**
    * @brief Returns currently used particle emitter domain
    *
    * @return Handle to the ParticleDomain object
@@ -213,7 +220,6 @@ public:
    */
   [[nodiscard]] ParticleRenderer GetRenderer() const;
 
-
   /**
    * @brief Attaches particle system to an actor
    *
index 6b1e18a..88cdf80 100644 (file)
@@ -94,6 +94,11 @@ uint32_t ParticleList::GetParticleDataSize(bool includeLocalStreams)
   return GetImplementation(*this).GetStreamElementSize(includeLocalStreams);
 }
 
+int ParticleList::GetDefaultStreamIndex(ParticleStreamTypeFlagBit defaultStreamBit)
+{
+  return GetImplementation(*this).GetDefaultStreamIndex(defaultStreamBit);
+}
+
 std::list<Particle>& ParticleList::GetActiveParticles()
 {
   return GetImplementation(*this).GetParticles();
@@ -101,5 +106,4 @@ std::list<Particle>& ParticleList::GetActiveParticles()
 
 ParticleList::ParticleList() = default;
 
-
 } // namespace Dali::Toolkit::ParticleSystem
\ No newline at end of file
index c165159..7fea6b6 100644 (file)
 #include <dali-toolkit/public-api/particle-system/particle.h>
 
 // EXTERNAL INCLUDES
-#include <dali/public-api/object/base-handle.h>
 #include <dali/public-api/common/list-wrapper.h>
+#include <dali/public-api/object/base-handle.h>
 #include <cinttypes>
 
-
 namespace Dali::Toolkit::ParticleSystem::Internal
 {
 class ParticleList;
@@ -221,6 +220,14 @@ public:
    */
   uint32_t GetParticleDataSize(bool includeLocalStreams);
 
+  /**
+   * @brief Returns index associated with specified default stream
+   *
+   * @param[in] defaultStreamBit Default stream bit
+   * @return Returns a valid index or -1 on error.
+   */
+  int GetDefaultStreamIndex(ParticleStreamTypeFlagBit defaultStreamBit);
+
   std::list<Particle>& GetActiveParticles();
 
 private:
index 472499e..9542289 100644 (file)
@@ -37,4 +37,9 @@ ParticleModifier ParticleModifier::DownCast(BaseHandle handle)
   return {dynamic_cast<Internal::ParticleModifier*>(handle.GetObjectPtr())};
 }
 
+ParticleModifierInterface& ParticleModifier::GetModifierCallback()
+{
+  return GetImplementation(*this).GetUpdater();
+}
+
 } // namespace Dali::Toolkit::ParticleSystem
\ No newline at end of file
index de8d4e6..1769d57 100644 (file)
@@ -112,6 +112,12 @@ public:
   {
     return New(std::move(std::make_unique<T>(args...)));
   }
+  /**
+   * @brief Returns associated particle modifier callback
+   *
+   * @return Valid reference to associated callback
+   */
+  ParticleModifierInterface& GetModifierCallback();
 
   /**
    * @brief Downcasts a handle to ParticleModifier handle.
index 05e9b40..c73949f 100644 (file)
@@ -40,6 +40,11 @@ void ParticleRenderer::SetBlendingMode(BlendingMode blendingMode)
   GetImplementation(*this).SetBlendingMode(blendingMode);
 }
 
+BlendingMode ParticleRenderer::GetBlendingMode() const
+{
+  return GetImplementation(*this).GetBlendingMode();
+}
+
 ParticleRenderer ParticleRenderer::DownCast(BaseHandle handle)
 {
   return {dynamic_cast<Internal::ParticleRenderer*>(handle.GetObjectPtr())};
index 0e0a35b..8474c54 100644 (file)
@@ -66,6 +66,13 @@ public:
   void SetBlendingMode(BlendingMode blendingMode);
 
   /**
+   * @brief Sets blending mode for the renderer
+   *
+   * @return Current blending mode
+   */
+  BlendingMode GetBlendingMode() const;
+
+  /**
    * @brief Sets renderable as a 2D texture (sprites)
    *
    * @param[in] texture Valid texture