summaryrefslogtreecommitdiff
path: root/themes/TreeShape.h
diff options
context:
space:
mode:
authormattkae <mattkae@protonmail.com>2021-09-19 16:32:15 -0400
committermattkae <mattkae@protonmail.com>2021-09-19 16:32:15 -0400
commitde850676e79da39aec6f1ce0400cfa94cecbd744 (patch)
tree48927e3cd3a518ddee1874df40d188cbc5112393 /themes/TreeShape.h
First commit
Diffstat (limited to 'themes/TreeShape.h')
-rw-r--r--themes/TreeShape.h86
1 files changed, 86 insertions, 0 deletions
diff --git a/themes/TreeShape.h b/themes/TreeShape.h
new file mode 100644
index 0000000..fbbb950
--- /dev/null
+++ b/themes/TreeShape.h
@@ -0,0 +1,86 @@
+#include "Renderer2d.h"
+#include "types.h"
+#include "mathlib.h"
+
+struct TreeBranch {
+ float32 width = 0.f;
+ float32 height = 0.f;
+ Vector2 position; // Center point
+ float32 rotation = 0; // How much we are rotated off of the center point in radians
+ Vector4 color = Vector4 { 1.f, 0.f, 0.f, 1.f };
+
+ void fillVertices(Renderer2dVertex* vertices) {
+ Vector2 bottomLeft = Vector2 { position.x - width / 2.f, position.y };
+ Vector2 bottomRight = Vector2 { position.x + width / 2.f, position.y };
+ Vector2 topLeft = (Vector2 { position.x - width / 2.f, position.y + height }).rotate(rotation);
+ Vector2 topRight = (Vector2 { position.x + width / 2.f, position.y + height }).rotate(rotation);
+
+ vertices[0] = { bottomLeft, color };
+ vertices[1] = { bottomRight, color };
+ vertices[2] = { topLeft, color };
+ vertices[3] = { topLeft, color };
+ vertices[4] = { topRight, color };
+ vertices[5] = { bottomRight, color };
+ }
+};
+
+struct TreeShape {
+ Renderer2dShape shape;
+
+ float32 height = 100.f; // Height of the whole tree
+ float32 width = 50.f; // Width of the whole tree
+ int32 divisionsPerBranch = 2; // How many branches to split into at each branch split
+ int32 numBranchLevels = 8; // How many branch levels to display
+ float32 animateTimeSeconds = 2.f; // How long it takes the tree to form
+
+ void load(Renderer2d* renderer) {
+ int32 numBranches = divisionsPerBranch * numBranchLevels;
+ TreeBranch* branches = new TreeBranch[numBranches];
+ int32 numVertices = 6 * numBranches;
+ Renderer2dVertex* vertices = new Renderer2dVertex[numVertices];
+ int32 branchIndex = 0;
+
+ createBranch(branches, numBranches, &branchIndex, 0, width, height, Vector2 { 0.f, 0.f }, 0, vertices);
+
+ shape.load(vertices, numVertices, renderer);
+
+ delete[] branches;
+ delete[] vertices;
+ }
+
+ void createBranch(TreeBranch* branchList, int32 numBranches, int32* branchIndex, int32 branchLevel, float32 width, float32 height, Vector2 position, float32 rotation, Renderer2dVertex* vertices) {
+ TreeBranch* branch = &branchList[*branchIndex];
+ branch->width = width;
+ branch->height = height;
+ branch->position = position;
+ branch->rotation = rotation;
+ branch->fillVertices(&vertices[(*branchIndex) * 6]);
+
+ if (branchLevel == numBranchLevels) {
+ return;
+ }
+
+ float32 branchWidth = width / divisionsPerBranch;
+ float32 branchHeight = height / divisionsPerBranch;
+ for (int division = 0; division < divisionsPerBranch; division++) {
+ float32 branchXPosition = position.x + (((divisionsPerBranch - division) / (divisionsPerBranch - 1)) * width) - width / 2.0;
+ Vector2 branchPosition = (Vector2 { branchXPosition, position.y + height }).rotate(rotation);
+ float32 branchRotation = 0;
+ (*branchIndex)++;
+ createBranch(branchList, numBranches, branchIndex, branchLevel + 1, branchWidth, branchHeight, branchPosition, branchRotation, vertices);
+ }
+ }
+
+ void update(float32 dtSeconds) {
+
+ }
+
+ void render(Renderer2d* renderer) {
+ shape.render(renderer);
+ }
+
+ void unload() {
+ shape.unload();
+ }
+};
+