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; }
void Branch::createGeometryNode(const double length, const double thickness, const double upDist, const double upAngle, const double zAngle) { Cylinder* c_branch= new Cylinder; GeometryNode* branch = new GeometryNode("TreeTrunk", c_branch); branch->set_material(&wood); this->rotate('z', zAngle); this->translate(Vector3D(0.0, 0.0, upDist)); this->rotate('y', upAngle); branch->scale(Vector3D(thickness, thickness, length)); add_child(branch); }
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); }
int gr_node_set_material_cmd(lua_State* L) { GRLUA_DEBUG_CALL; gr_node_ud* selfdata = (gr_node_ud*)luaL_checkudata(L, 1, "gr.node"); luaL_argcheck(L, selfdata != 0, 1, "Node expected"); GeometryNode* self = dynamic_cast<GeometryNode*>(selfdata->node); luaL_argcheck(L, self != 0, 1, "Geometry node expected"); gr_material_ud* matdata = (gr_material_ud*)luaL_checkudata(L, 2, "gr.material"); luaL_argcheck(L, matdata != 0, 2, "Material expected"); Material* material = matdata->material; self->set_material(material); return 0; }