From de850676e79da39aec6f1ce0400cfa94cecbd744 Mon Sep 17 00:00:00 2001 From: mattkae Date: Sun, 19 Sep 2021 16:32:15 -0400 Subject: First commit --- themes/TreeShape.h | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 themes/TreeShape.h (limited to 'themes/TreeShape.h') 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(); + } +}; + -- cgit v1.2.1