diff options
| -rw-r--r-- | src/crepe/ParticleEmitter.cpp | 2 | ||||
| -rw-r--r-- | src/crepe/ParticleSystem.cpp | 27 | ||||
| -rw-r--r-- | src/crepe/ParticleSystem.h | 2 | ||||
| -rw-r--r-- | src/example/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | src/example/particle.cpp (renamed from src/example/particel.cpp) | 47 | 
5 files changed, 38 insertions, 44 deletions
| diff --git a/src/crepe/ParticleEmitter.cpp b/src/crepe/ParticleEmitter.cpp index 9ae5e76..30cba7c 100644 --- a/src/crepe/ParticleEmitter.cpp +++ b/src/crepe/ParticleEmitter.cpp @@ -11,6 +11,8 @@ ParticleEmitter::ParticleEmitter(uint32_t maxParticles, uint32_t emissionRate, u      std::cout << "Create emitter" << std::endl;      m_minAngle = (360 + angle - (angleOffset % 360)) % 360; // calculate minAngle      m_maxAngle = (360 + angle + (angleOffset % 360)) % 360; // calculate maxAngle +	m_position.x = 400; +	m_position.y = 400;      for (size_t i = 0; i < m_maxParticles; i++)      {          this->particles.emplace_back(); diff --git a/src/crepe/ParticleSystem.cpp b/src/crepe/ParticleSystem.cpp index 8891e2b..3a1f653 100644 --- a/src/crepe/ParticleSystem.cpp +++ b/src/crepe/ParticleSystem.cpp @@ -5,40 +5,32 @@  #include <iostream>  // include iostream for std::cout  #include "ParticleEmitter.h"  #include "Particle.h" +#include "ComponentManager.h"  using namespace crepe;  ParticleSystem::ParticleSystem() : m_elapsedTime(0.0f) {}  // Initialize m_elapsedTime to 0 -void ParticleSystem::update(float deltaTime, std::vector<ParticleEmitter>& emitters) { -    // std::cout << "ParticleSystem update" << std::endl; +void ParticleSystem::update(float deltaTime, std::vector<std::reference_wrapper<ParticleEmitter>>& emitters) {      for (ParticleEmitter& emitter : emitters) {          float updateAmount = 1/static_cast<float>(emitter.m_emissionRate);          for (float i = 0; i < deltaTime; i += updateAmount)          {              emitParticle(emitter);          } -        //  std::cout << "after emit" << std::endl; -         -        //update/move particles afterwards delete if not alive.          for (size_t j = 0; j <  emitter.particles.size(); j++)          { -            // std::cout << "update" << std::endl;              if(emitter.particles[j].active)              {                  emitter.particles[j].update(deltaTime);              }          }      - -      }  }  void ParticleSystem::emitParticle(ParticleEmitter& emitter) { -    // std::cout << "new emitter:" << std::endl; -    Position initialPosition = { emitter.m_position.x, emitter.m_position.y }; +    Position initialPosition = { emitter.m_position.x, emitter.m_position.y};      float randomAngle = 0.0f; -    //check if value is overthe 360 degrees      if(emitter.m_maxAngle < emitter.m_minAngle)      {          randomAngle = ((emitter.m_minAngle + (std::rand() % (static_cast<uint32_t>(emitter.m_maxAngle + 360 - emitter.m_minAngle + 1))))%360); @@ -47,8 +39,6 @@ void ParticleSystem::emitParticle(ParticleEmitter& emitter) {      {          randomAngle = emitter.m_minAngle + (std::rand() % (static_cast<uint32_t>(emitter.m_maxAngle - emitter.m_minAngle + 1)));      } -     -      float angleInRadians = randomAngle * (M_PI / 180.0f);      float randomSpeedOffset = (static_cast<float>(std::rand()) / RAND_MAX) * (2 * emitter.m_speedOffset) - emitter.m_speedOffset;      float velocityX = (emitter.m_speed + randomSpeedOffset) * std::cos(angleInRadians); @@ -57,23 +47,12 @@ void ParticleSystem::emitParticle(ParticleEmitter& emitter) {          velocityX,          velocityY      }; -    // std::cout << "emitter.m_endLifespan:" << emitter.m_endLifespan << std::endl;      for (size_t i = 0; i < emitter.particles.size(); i++)      {          if(!emitter.particles[i].active)          { -            // std::cout << "active " << emitter.particles[i].active << std::endl; -            // std::cout << "lifespan " << emitter.particles[i].lifespan << std::endl; -            // std::cout << "timeInLife " << emitter.particles[i].timeInLife << std::endl; -            // std::cout << "emitter.m_endLifespan" << emitter.m_endLifespan << std::endl; -            // std::cout << "initialPositionx" << initialPosition.x << std::endl; -            // std::cout << "initialPositiony" << initialPosition.y << std::endl; -            // std::cout << "initialVelocityx" << initialVelocity.x << std::endl; -            // std::cout << "initialVelocityy" << initialVelocity.y << std::endl;              emitter.particles[i].reset(emitter.m_endLifespan, initialPosition, initialVelocity);              break;          }      } -     -    //emitter.particles.emplace_back(emitter.m_endLifespan, initialPosition, initialVelocity);  } diff --git a/src/crepe/ParticleSystem.h b/src/crepe/ParticleSystem.h index fd6d110..7b14f71 100644 --- a/src/crepe/ParticleSystem.h +++ b/src/crepe/ParticleSystem.h @@ -9,7 +9,7 @@ namespace crepe {  class ParticleSystem {  public:      ParticleSystem(); -    void update(float deltaTime, std::vector<ParticleEmitter>& emitters); +    void update(float deltaTime, std::vector<std::reference_wrapper<ParticleEmitter>>& emitters);  private:      void emitParticle(ParticleEmitter &emitter); //emits a new particle diff --git a/src/example/CMakeLists.txt b/src/example/CMakeLists.txt index 36ceba1..cbf8e31 100644 --- a/src/example/CMakeLists.txt +++ b/src/example/CMakeLists.txt @@ -15,5 +15,5 @@ endfunction()  add_example(audio_internal)  add_example(components_internal)  add_example(script) -add_example(particel) -target_link_libraries(particel PUBLIC SDL2) +add_example(particle) +target_link_libraries(particle PUBLIC SDL2) diff --git a/src/example/particel.cpp b/src/example/particle.cpp index c66bbef..fc56230 100644 --- a/src/example/particel.cpp +++ b/src/example/particle.cpp @@ -5,9 +5,13 @@  #include "ParticleEmitter.h"  #include "ParticleSystem.h"  #include "Particle.h" +#include <crepe/Component.h> +#include <crepe/ComponentManager.h> +#include <crepe/GameObject.h>  #include <chrono>  using namespace crepe; +using namespace std;  const int WINDOW_WIDTH = 800;  const int WINDOW_HEIGHT = 600; @@ -16,10 +20,15 @@ int main(int argc, char* argv[]) {      SDLApp app(WINDOW_WIDTH, WINDOW_HEIGHT);      if (!app.initialize()) { -        std::cerr << "Failed to initialize SDLApp." << std::endl; +        cerr << "Failed to initialize SDLApp." << endl;          return 1;      } +	auto & mgr = ComponentManager::get_instance(); +	GameObject * game_object[1]; +	game_object[0] = new GameObject(0, "Name", "Tag", 0); +	 +      ParticleSystem particleSystem;      unsigned int maxParticles = 100;         // maximum number of particles @@ -32,36 +41,40 @@ int main(int argc, char* argv[]) {      float endLifespan = 2.0f;               // ending lifespan of particles      // Vector to hold all the emitters -    std::vector<ParticleEmitter> emitters; +    // vector<ParticleEmitter> emitters; +	game_object[0]->add_component<ParticleEmitter>(maxParticles, emissionRate, speed, speedOffset, angle, angleOffset, beginLifespan, endLifespan); + +	std::vector<std::reference_wrapper<ParticleEmitter>> emitters = mgr.get_components_by_type<ParticleEmitter>(); +	      // Loop to create 1000 emitters -    for (unsigned int i = 0; i < 1000; ++i) { -        ParticleEmitter emitter(maxParticles, emissionRate, speed, speedOffset, angle, angleOffset, beginLifespan, endLifespan); +    // for (unsigned int i = 0; i < 1000; ++i) { +    //     ParticleEmitter emitter(maxParticles, emissionRate, speed, speedOffset, angle, angleOffset, beginLifespan, endLifespan); -        // Set a position for each emitter, modifying the position for demonstration -        emitter.m_position = {static_cast<float>(200 + (i % 100)), static_cast<float>(200 + (i / 100) * 10)}; // Adjust position for each emitter +    //     // Set a position for each emitter, modifying the position for demonstration +    //     emitter.m_position = {static_cast<float>(200 + (i % 100)), static_cast<float>(200 + (i / 100) * 10)}; // Adjust position for each emitter -        emitters.push_back(emitter); // Add the emitter to the vector -    } +    //     emitters.push_back(emitter); // Add the emitter to the vector +    // }      float deltaTime = 0.1f;      bool running = true; -    std::cout << "start loop " << std::endl; +    cout << "start loop " << endl;      while (running) {          app.handleEvents(running);          // Start timing -        auto start = std::chrono::high_resolution_clock::now(); +        auto start = chrono::high_resolution_clock::now();          particleSystem.update(deltaTime, emitters); // update particle system with delta time and emitters          // End timing -        auto end = std::chrono::high_resolution_clock::now(); -        std::chrono::duration<float, std::milli> duration = end - start; // get duration in milliseconds +        auto end = chrono::high_resolution_clock::now(); +        chrono::duration<float, milli> duration = end - start; // get duration in milliseconds -        std::cout << "Update took " << duration.count() << " ms" << std::endl; +        cout << "Update took " << duration.count() << " ms" << endl;          app.clearScreen(); -        start = std::chrono::high_resolution_clock::now(); +        start = chrono::high_resolution_clock::now();          // render particles using the drawSquare method from SDLApp          for (const ParticleEmitter& emitter : emitters) {              for (const Particle& particle : emitter.particles) { @@ -71,12 +84,12 @@ int main(int argc, char* argv[]) {          app.presentScreen(); -        end = std::chrono::high_resolution_clock::now(); +        end = chrono::high_resolution_clock::now();           duration = end - start; // get duration in milliseconds -        std::cout << "screen took " << duration.count() << " ms" << std::endl; +        cout << "screen took " << duration.count() << " ms" << endl; -        std::this_thread::sleep_for(std::chrono::milliseconds(20)); // simulate ~50 FPS +        this_thread::sleep_for(chrono::milliseconds(20)); // simulate ~50 FPS      }      app.cleanUp(); |