#include "Renderer2d.h" #include "types.h" #include "mathlib.h" struct TreeBranch { float32 width = 0.f; float32 height = 0.f; Vector2 position; // Center point Vector2 direction = Vector2 { 1.f, 0.f }; Vector4 color = Vector4 { 1.f, 0.f, 0.f, 1.f }; void fillVertices(Renderer2dVertex* vertices) { vertices[0] = { Vector2 { position.x - width / 2.f, position.y }, color }; vertices[1] = { Vector2 { position.x + width / 2.f, position.y }, color }; vertices[2] = { Vector2 { position.x - width / 2.f, position.y + height }, color }; vertices[3] = { Vector2 { position.x - width / 2.f, position.y + height }, color }; vertices[4] = { Vector2 { position.x + width / 2.f, position.y + height }, color }; vertices[5] = { Vector2 { position.x + width / 2.f, position.y }, 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]; TreeBranch trunk = branches[0]; int32 numVertices = 6 * numBranches; Renderer2dVertex* vertices = new Renderer2dVertex[numVertices]; trunk.width = width; trunk.height = height; trunk.position = Vector2 { 0.f, 0.f }; trunk.direction = Vector2 { 1.f, 0.f }; trunk.fillVertices(&vertices[0]); 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, Vector2 direction, Renderer2dVertex* vertices) { branch->width = width; branch->height = height; branch->position = position; branch->direction = direction; branch->fillIinVertices(&vertices[&branchIndex * 6]); if (branchLevel == numBranchLevels) { return; } float32 branchWidth = width / divisionsPerBranch; float32 branchHeight = height / divisionsPerBranch; Vector2 branchPosition = branch->position + (height * branch->direction); for (int division = 0; division < divisionsPerBranch; division++) { (*branchIndex)++; createBranch(branchList, numBranches, branchIndex, branchLevel + 1, branchWidth, branchHeight, } } void update(float32 dtSeconds) { } void render(Renderer2d* renderer) { shape.render(renderer); } void unload() { shape.unload(); } };