diff --git a/ToyEngine/src/DemoWorld.cpp b/ToyEngine/src/DemoWorld.cpp index db2f71d..09a3d7c 100644 --- a/ToyEngine/src/DemoWorld.cpp +++ b/ToyEngine/src/DemoWorld.cpp @@ -21,27 +21,58 @@ DemoWorld::DemoWorld() auto sponza = std::make_shared("Models\\Sponza\\Sponza.gltf"); sponza->setScale(glm::vec3(2)); - auto particle = std::make_shared(10); - particle->setSpeed(glm::vec3(-1, 0, 0)); - particle->setPosition({ 4, 5, 0 }); - //particle->addForce(std::make_shared(glm::vec3(0.f, -particle->getMass() * 9.8f, 0.f))); - auto particle2 = std::make_shared(10, "Models\\pallet_wood\\pallet_wood.gltf"); - particle2->setSpeed(glm::vec3(1, 0, 0)); - particle2->setPosition({ 6, 5, 0 }); - particle2->setScale(glm::vec3{ 0.002 }); - - auto particle3 = std::make_shared(10); - particle3->setSpeed(glm::vec3(0, 1, 0)); - particle3->setPosition({ 6, 7, 0 }); - - physicsManager.addSpring(particle, particle2, 2, 10, 0); - physicsManager.addSpring(particle2, particle3, 2, 10, 0); - addActor(actor); addActor(actor2); addActor(actor3); addActor(sponza); - addActor(particle); - addActor(particle2); - addActor(particle3); + + + float boardMass = 10; + glm::vec3 boardScale(0.01); + auto boardFilePath = "Models\\pallet_wood\\pallet_wood.gltf"; + + + int particleCount = 5; + for (int i = 0; i < particleCount; i++) + { + auto particle = std::make_shared(boardMass, boardFilePath); + particle->setPosition({ 0, 8, glm::mix(-3.1f,2.f,(double)i / (particleCount - 1)) }); + particle->setScale(boardScale); + if (i == 0 || i == particleCount - 1) + { + particle->setFixed(true); + } + else + { + particle->enableGravity(); + } + particles.push_back(particle); + addActor(particle); + + if (i != 0) + { + float ks = 300, kd = 100; + physicsManager.addSpring(particles[i - 1], particle, 0.005, ks, kd); + } + } +} + +void DemoWorld::logicalTick(float deltaTime) +{ + World::logicalTick(deltaTime); + for (int i = 0; i < particles.size(); i++) + { + glm::vec3 d; + if (i == 0) + d = glm::normalize(particles[i + 1]->getPosition() - particles[i]->getPosition()); + else if (i == particles.size() - 1) + d = glm::normalize(particles[i]->getPosition() - particles[i - 1]->getPosition()); + else + { + auto dL = particles[i + 1]->getPosition() - particles[i]->getPosition(); + auto dR = particles[i]->getPosition() - particles[i - 1]->getPosition(); + d = (glm::normalize(dL) + glm::normalize(dR)) / 2.f; + } + particles[i]->setRotaion(glm::rotation(glm::vec3(0, 0, 1), d)); + } } diff --git a/ToyEngine/src/DemoWorld.h b/ToyEngine/src/DemoWorld.h index 896fc19..9f949d2 100644 --- a/ToyEngine/src/DemoWorld.h +++ b/ToyEngine/src/DemoWorld.h @@ -5,5 +5,8 @@ class DemoWorld : public World { public: DemoWorld(); + virtual void logicalTick(float deltaTime) override; +private: + std::vector> particles; }; diff --git a/ToyEngine/src/Particle.cpp b/ToyEngine/src/Particle.cpp index a849ff0..b852d9f 100644 --- a/ToyEngine/src/Particle.cpp +++ b/ToyEngine/src/Particle.cpp @@ -23,13 +23,22 @@ void Particle::logicalTick(float deltaTime) for (auto& force : forces) resultantForce += force->value; - auto pos = getPosition() + speed * deltaTime + 0.5f * resultantForce / mass * deltaTime * deltaTime; - speed += resultantForce / mass * deltaTime; - //if (speed.y < 0 && pos.y < 0.4) - //{ - // speed.y = -speed.y; - //} - setPosition(pos); + if (fixed) + { + speed = glm::vec3(0); + } + else + { + //auto pos = getPosition() + speed * deltaTime + 0.5f * resultantForce / mass * deltaTime * deltaTime; + speed += resultantForce / mass * deltaTime; + auto pos = getPosition() + speed * deltaTime; + //if (speed.y < 0 && pos.y < 0.4) + //{ + // speed.y = -speed.y; + //} + setPosition(pos); + } + } void Particle::draw(const RenderPassContext& context, Shader& shader) @@ -57,9 +66,10 @@ void Particle::draw(const RenderPassContext& context, Shader& shader) } debugShader.use(); + gl->DepthMask(false); debugShader.setUniformValue("projection", *context.projection); debugShader.setUniformValue("view", *context.view); - glm::mat4 modelMatrix = glm::translate(glm::mat4(1), getPosition()) * glm::mat4_cast(getRotation()) * glm::scale(glm::mat4(1), glm::vec3(glm::abs(resultantForce / mass))); + glm::mat4 modelMatrix = glm::translate(glm::mat4(1), getPosition());// *glm::scale(glm::mat4(1), glm::vec3(glm::abs(resultantForce / mass))); gl->BindVertexArray(vao); for (auto& force : forces) { @@ -68,6 +78,7 @@ void Particle::draw(const RenderPassContext& context, Shader& shader) gl->DrawArrays(GL_LINES, 0, 2); } gl->BindVertexArray(0); + gl->DepthMask(true); shader.use(); } } @@ -96,3 +107,13 @@ void Particle::setSpeed(const glm::vec3& speed) { this->speed = speed; } + +void Particle::setFixed(bool fixed) +{ + this->fixed = fixed; +} + +void Particle::enableGravity() +{ + addForce(std::make_shared(glm::vec3(0.f, -getMass() * 9.80665f, 0.f))); +} diff --git a/ToyEngine/src/Particle.h b/ToyEngine/src/Particle.h index 2a05193..9889eea 100644 --- a/ToyEngine/src/Particle.h +++ b/ToyEngine/src/Particle.h @@ -21,8 +21,12 @@ public: float getMass(); glm::vec3 getSpeed(); void setSpeed(const glm::vec3& speed); + void setFixed(bool fixed); + void enableGravity(); private: + bool fixed = false; float mass; + glm::vec3 acceleration = glm::vec3(0); glm::vec3 speed = glm::vec3(0.f); std::set> forces; glm::vec3 resultantForce = glm::vec3(0); diff --git a/ToyEngine/src/PhysicsManager.cpp b/ToyEngine/src/PhysicsManager.cpp index 96af01c..996f040 100644 --- a/ToyEngine/src/PhysicsManager.cpp +++ b/ToyEngine/src/PhysicsManager.cpp @@ -25,6 +25,7 @@ void PhysicsManager::addSpring(std::shared_ptr p1, std::shared_ptr