From 8a54b8810d33181bf13df75c8b051b7609294eb7 Mon Sep 17 00:00:00 2001 From: Riku Avelar Date: Tue, 6 Dec 2016 11:26:22 -0500 Subject: [PATCH] Particle Struct --- src/viewer/simpleViewer.cpp | 67 +++++++++++++++++++++++++++++-------- src/viewer/simpleViewer.h | 6 ++++ 2 files changed, 59 insertions(+), 14 deletions(-) diff --git a/src/viewer/simpleViewer.cpp b/src/viewer/simpleViewer.cpp index 98af1a8..411d15c 100644 --- a/src/viewer/simpleViewer.cpp +++ b/src/viewer/simpleViewer.cpp @@ -72,6 +72,8 @@ namespace bool active; }; + std::vector> particleSystems; + ToolAnimation swing; int currentPoint = 0; // VERY lazy way of tracking light balls @@ -246,7 +248,7 @@ void Viewer::draw() root.accept(*this); drawParticles(); - drawUi(); + drawUi(); sunRotate.setToIdentity(); //float rotAngle = (frame * angle_mult) % 360; @@ -330,6 +332,31 @@ void Viewer::drawUi(){ } +std::vector Viewer::createParticleSystem(QMatrix4x4 parentModel) { + std::vector pSys; + + for(int i = 0; i < 100; i++) { + Particle p; + + float x = static_cast (rand()) / static_cast (RAND_MAX); + float y = static_cast (rand()) / static_cast (RAND_MAX); + float z = static_cast (rand()) / static_cast (RAND_MAX); + float w = static_cast (rand()) / static_cast (RAND_MAX); + float ts = static_cast (rand()) / static_cast (RAND_MAX); + + p.pos = parentModel * QVector3D(); + p.accel = QVector3D(0.5 * x, 0.5 * y, 0.5 * z); + p.pos = QVector3D(x, y, z); + p.weight = w; + p.size = ts/2; + p.life = rand() % 1000; + + pSys.push_back(p); + } + + return pSys; +} + void Viewer::drawParticles(){ m_program->bind(); @@ -338,22 +365,34 @@ void Viewer::drawParticles(){ camera()->getProjectionMatrix(projectionMatrix); camera()->getModelViewMatrix(modelViewMatrix); - glBindVertexArray(m_VAOs[VAO_Particle]); - glBindBuffer(GL_ARRAY_BUFFER, VBO_Particle); - glBindBuffer(GL_ARRAY_BUFFER, VBO_Particle_Positions); - glBindBuffer(GL_ARRAY_BUFFER, VBO_Particle_Colors); + modelViewMatrix.scale(4); - glActiveTexture(GL_TEXTURE0); - TexturePrograms[1]->bind(); +// glBindVertexArray(m_VAOs[VAO_Particle]); +// glBindBuffer(GL_ARRAY_BUFFER, VBO_Particle); +// glBindBuffer(GL_ARRAY_BUFFER, VBO_Particle_Positions); +// glBindBuffer(GL_ARRAY_BUFFER, VBO_Particle_Colors); - m_program->setUniformValue(m_isSkyLoc, true); - m_program->setUniformValue(m_mvMatrixLocation, modelViewMatrix); - m_program->setUniformValue(m_normalMatrixLoc, modelViewMatrix.normalMatrix()); - m_program->setUniformValue(m_colorLocation, QColor(255, 255, 255, 255)); - m_program->setUniformValue(m_drawTextLoc, false); - m_program->setUniformValue(m_isLightLoc, true); +// glActiveTexture(GL_TEXTURE0); +// TexturePrograms[1]->bind(); - glDrawArraysInstanced(GL_TRIANGLE_STRIP, 0, 4, particleLimit); +// m_program->setUniformValue(m_isSkyLoc, false); +// m_program->setUniformValue(m_mvMatrixLocation, modelViewMatrix); +// m_program->setUniformValue(m_normalMatrixLoc, modelViewMatrix.normalMatrix()); +// m_program->setUniformValue(m_colorLocation, QColor(255, 255, 255, 255)); +// m_program->setUniformValue(m_drawTextLoc, false); +// m_program->setUniformValue(m_isLightLoc, true); + +// for(int ) + + glDisable(GL_CULL_FACE); + glBindVertexArray(m_VAOs[VAO_Cube]); + glActiveTexture(GL_TEXTURE0); + TexturePrograms[0]->bind(); + m_program->setUniformValue(m_mvMatrixLocation, modelViewMatrix); + m_program->setUniformValue(m_normalMatrixLoc, modelViewMatrix.normalMatrix()); + glDrawArraysInstanced(GL_TRIANGLES, 0, 6, particleLimit); + + glEnable( GL_CULL_FACE ); } void Viewer::mouseMoveEvent(QMouseEvent* e) { diff --git a/src/viewer/simpleViewer.h b/src/viewer/simpleViewer.h index 7db481d..d880a6d 100644 --- a/src/viewer/simpleViewer.h +++ b/src/viewer/simpleViewer.h @@ -43,6 +43,11 @@ struct PickedGeom { QMatrix4x4 position; }; +struct Particle { + QVector3D pos, speed, accel; + double life, size, weight; +}; + class Viewer : public QGLViewer, protected QOpenGLFunctions_4_0_Core, public Visitor @@ -111,6 +116,7 @@ private: void deselect(); void loadToolObj(); void startSwingAnimation(); + std::vector createParticleSystem(QMatrix4x4 parent); PickedGeom pickGeom(int, int); void animate();