void Branch::spawnSubBranches(const int level, const double length, const double thickness) { if (level == recursiveDepth) return; // Spawn subbranches (make more as we get smaller) int numBranches = rand(0.2, 0.8, (level == 0 ? 2 : level) * initialBranches); for (int i = 0; i < numBranches; i++) { add_child(new Branch("SubBranch", level + 1, nextThickness(thickness, level), nextLength(length, level))); totalBranches++; } // Tree branches seem to split in two at the ends so simulate that. add_child(new Branch("SplitBranch", level + 1, nextThickness(thickness, level), nextLength(length, level), length, -30.0, 0.0)); add_child(new Branch("SplitBranch", level + 1, nextThickness(thickness, level), nextLength(length, level), length, 30.0, 0.0)); // Two branches coming out of the top looks a little weird so add a sphere. Sphere* p_sphere = new Sphere(); GeometryNode* sphere = new GeometryNode("BranchTop", p_sphere); sphere->set_material(&wood); sphere->translate(Vector3D(0.0, 0.0, length)); sphere->scale(Vector3D(thickness, thickness, thickness)); add_child(sphere); totalBranches += 3; }
Leaf::Leaf(const std::string& name, const double branchThickness, const double branchLength) : SceneNode(name) { ImagePrimitive* i_leaf = new ImagePrimitive(); GeometryNode* leaf = new GeometryNode("Leaf", i_leaf); leaf->set_material(&leafTexture); double upDist = rand(1.0/3.0, 1.0, branchLength); double zAngle = rand(0.0, 1.0, 360.0); double diagonalDist = branchThickness + sqrt(2.0) - 0.25; double xyDist = -diagonalDist * sqrt(2.0) / 2.0; leaf->rotate('z', zAngle); leaf->translate(Vector3D(xyDist, xyDist, upDist)); add_child(leaf); }