summaryrefslogtreecommitdiff
path: root/themes/#LeafParticleRender.cpp#
diff options
context:
space:
mode:
authormattkae <mattkae@protonmail.com>2022-05-01 18:37:59 -0400
committermattkae <mattkae@protonmail.com>2022-05-01 18:37:59 -0400
commitdfc387644939aada1edb69f8f730e62f116f1ae3 (patch)
treed38b17d0b21fd579f1330546394462964a08600e /themes/#LeafParticleRender.cpp#
parent1db914466663a1e4d0d827b8b9bd18840d7742eb (diff)
Fetching bunny model
Diffstat (limited to 'themes/#LeafParticleRender.cpp#')
-rw-r--r--themes/#LeafParticleRender.cpp#162
1 files changed, 0 insertions, 162 deletions
diff --git a/themes/#LeafParticleRender.cpp# b/themes/#LeafParticleRender.cpp#
deleted file mode 100644
index 2cb0b35..0000000
--- a/themes/#LeafParticleRender.cpp#
+++ /dev/null
@@ -1,162 +0,0 @@
-#include "LeafParticleRender.h"
-#include "Renderer2d.h"
-#include "mathlib.h"
-#include "TreeShape.h"
-#include "types.h"
-#include <math.h>
-
-const int32 verticesPerLeaf = 6;
-const float32 leafRadius = 3.f;
-const int32 fallChanceMax = 100;
-
-inline void updateLeaf(Renderer2dVertex* vertices, Vector2 position, Vector4 color, float32 scale) {
- float32 radius = scale * leafRadius;
- Vector2 bottomLeft = Vector2(-radius, -radius) + position;
- Vector2 bottomRight = Vector2(radius, -radius) + position;
- Vector2 topLeft = Vector2(-radius, radius) + position;
- Vector2 topRight = Vector2(radius, radius) + position;
-
- vertices[0] = { bottomLeft, color };
- vertices[1] = { bottomRight, color };
- vertices[2] = { topLeft, color };
- vertices[3] = { topLeft, color };
- vertices[4] = { topRight, color };
- vertices[5] = { bottomRight, color };
-}
-
-void LeafParticleRender::load(Renderer2d *renderer, TreeShapeLoadResult* lr) {
- LeafParticleLoadData ld;
- ld.numLeaves = 256;
- numLeaves = ld.numLeaves;
- numVertices = ld.numLeaves * verticesPerLeaf;
-
- updateData = new LeafParticleUpdateData[numLeaves];
- vertices = new Renderer2dVertex[numVertices];
-
- for (int32 leafIdx = 0; leafIdx < numLeaves; leafIdx++) {
- int32 randomBranch = randomIntBetween(0, lr->numBranches);
- int32 randomVertex = randomIntBetween(0, 6); // TODO: Manually entering num vertices per branch.
- updateData[leafIdx].vertexToFollow = &lr->updateData[randomBranch].vertices[randomVertex];
- updateData[leafIdx].fallChance = randomIntBetween(0, fallChanceMax);
- updateData[leafIdx].color = Vector4(randomFloatBetween(0.3, 0.9), randomFloatBetween(0.1, 0.6), 0, 1);
- updateData[leafIdx].vertexPtr = &vertices[leafIdx * verticesPerLeaf];
- updateData[leafIdx].resetTime = randomFloatBetween(4.f, 6.f);
- }
-
- useShader(renderer->shader);
-
- glGenVertexArrays(1, &vao);
- glBindVertexArray(vao);
-
- glGenBuffers(1, &vbo);
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferData(GL_ARRAY_BUFFER, numVertices * sizeof(Renderer2dVertex), &vertices[0], GL_DYNAMIC_DRAW);
-
- glEnableVertexAttribArray(renderer->attributes.position);
- glVertexAttribPointer(renderer->attributes.position, 2, GL_FLOAT, GL_FALSE, sizeof(Renderer2dVertex), (GLvoid *)0);
-
- glEnableVertexAttribArray(renderer->attributes.color);
- glVertexAttribPointer(renderer->attributes.color, 4, GL_FLOAT, GL_FALSE, sizeof(Renderer2dVertex), (GLvoid *)offsetof(Renderer2dVertex, color));
-
- glBindBuffer(GL_ARRAY_BUFFER, 0);
- glBindVertexArray(0);
-}
-
-void LeafParticleRender::update(float32 dtSeconds) {
- elapsedTimeSeconds += dtSeconds;
-
- // Every time the fallIntervalSeconds passes, we remove one leaf
- // from the tree and send it barrelling towards the earth.
- int32 fallRoll;
- bool didGenerateFall = false;
- if (elapsedTimeSeconds >= fallIntervalSeconds) {
- fallRoll = randomIntBetween(0, fallChanceMax);
- didGenerateFall = true;
- elapsedTimeSeconds = 0;
- }
-
- for (int32 leafIdx = 0; leafIdx < numLeaves; leafIdx++) {
- auto updateDataItem = &updateData[leafIdx];
-
- if (didGenerateFall) {
- if (updateDataItem->state == LeafParticleState::OnTree && updateDataItem->fallChance == fallRoll) {
- updateDataItem->state = LeafParticleState::Falling;
- updateDataItem->fallPosition = updateDataItem->vertexToFollow->position;
- updateDataItem->fallVerticalVelocity = -randomFloatBetween(15.f, 25.f);
- updateDataItem->fallHorizontalFrequency = randomFloatBetween(3.f, 5.f);
- }
- }
-
- switch (updateDataItem->state) {
- case (LeafParticleState::Remerging): {
- updateDataItem->timeElapsedSeconds += dtSeconds;
-
- if (updateDataItem->timeElapsedSeconds >= updateDataItem->resetTime) {
- updateDataItem->timeElapsedSeconds = 0.f;
- updateDataItem->state = LeafParticleState::OnTree;
- updateDataItem->color.w = 1.f;
- updateDataItem->scale = 1.f;
- }
- else {
- updateDataItem->color.w = (updateDataItem->timeElapsedSeconds / updateDataItem->resetTime);
- updateDataItem->scale = (updateDataItem->timeElapsedSeconds / updateDataItem->resetTime);
- }
-
- updateLeaf(updateDataItem->vertexPtr, updateDataItem->vertexToFollow->position, updateDataItem->color, updateDataItem->scale);
- break;
- }
- case (LeafParticleState::OnGround): {
- updateDataItem->timeElapsedSeconds += dtSeconds;
-
- if (updateDataItem->timeElapsedSeconds >= updateDataItem->resetTime) {
- updateDataItem->timeElapsedSeconds = 0.f;
- updateDataItem->color.w = 0.f;
- updateDataItem->state = LeafParticleState::Remerging;
- }
- else {
- updateDataItem->color.w = 1.f - (updateDataItem->timeElapsedSeconds / updateDataItem->resetTime);
- updateLeaf(updateDataItem->vertexPtr, updateDataItem->fallPosition, updateDataItem->color, updateDataItem->scale);
- }
- break;
- }
- case (LeafParticleState::Falling): {
- updateDataItem->timeElapsedSeconds += dtSeconds;
- const float32 xPosUpdate = cosf(updateDataItem->fallHorizontalFrequency * updateDataItem->timeElapsedSeconds);
- updateDataItem->fallPosition.x += xPosUpdate;
- updateDataItem->fallPosition.y += updateDataItem->fallVerticalVelocity * dtSeconds;
- if (updateDataItem->fallPosition.y <= 50.f) { // TODO: Hardcoded ground for now
- updateDataItem->fallPosition.y = 50.f;
- updateDataItem->state = LeafParticleState::OnGround;
- updateDataItem->timeElapsedSeconds = 0;
- updateDataItem->resetTime = randomFloatBetween(2.f, 5.f); // TODO: Hardcoded reset interval
- }
- updateLeaf(updateDataItem->vertexPtr, updateDataItem->fallPosition, updateDataItem->color, updateDataItem->scale);
- break;
- }
- case (LeafParticleState::OnTree): {
- updateLeaf(updateDataItem->vertexPtr, updateDataItem->vertexToFollow->position, updateDataItem->color, updateDataItem->scale);
- break;
- }
- }
- }
-}
-
-void LeafParticleRender::render(Renderer2d *renderer) {
- setShaderMat4(renderer->uniforms.model, model);
-
- glBindBuffer(GL_ARRAY_BUFFER, vbo);
- glBufferSubData(GL_ARRAY_BUFFER, 0, numVertices * sizeof(Renderer2dVertex), &vertices[0]);
-
- glBindVertexArray(vao);
- glDrawArrays(GL_TRIANGLES, 0, numVertices);
- glBindVertexArray(0);
-}
-
-void LeafParticleRender::unload() {
- glDeleteVertexArrays(1, &vao);
- glDeleteBuffers(1, &vbo);
- delete [] vertices;
- delete [] updateData;
-
- elapsedTimeSeconds = 0;
-} \ No newline at end of file