9 std::vector<std::vector<uint>> U;
11 std::vector<vec3> nodes;
12 std::vector<float> radius;
14 nodes.push_back(center +
make_vec3(0, 0, 0.6) * params.fruit_radius);
15 nodes.push_back(center +
make_vec3(0, 0, 0.45) * params.fruit_radius);
16 nodes.push_back(center +
make_vec3(0, 0, 0.3) * params.fruit_radius);
17 nodes.push_back(center +
make_vec3(0, 0, 0.1) * params.fruit_radius);
18 nodes.push_back(center +
make_vec3(0, 0, -0.2) * params.fruit_radius);
19 nodes.push_back(center +
make_vec3(0, 0, -0.4) * params.fruit_radius);
20 nodes.push_back(center +
make_vec3(0, 0, -0.5) * params.fruit_radius);
22 radius.push_back(1e-3 * params.fruit_radius);
23 radius.push_back(0.4 * params.fruit_radius);
24 radius.push_back(0.5 * params.fruit_radius);
25 radius.push_back(0.45 * params.fruit_radius);
26 radius.push_back(0.2 * params.fruit_radius);
27 radius.push_back(0.15 * params.fruit_radius);
28 radius.push_back(1e-3 * params.fruit_radius);
30 U.push_back(context->
addTube(params.fruit_subdivisions, nodes, radius, params.fruit_texture_file.c_str()));
32 float azimuth = 2.f *
PI_F * context->
randu();
34 if (context->
randu() < 0.75) {
36 std::vector<vec3> nodes2 = nodes;
37 for (
int i = 0; i < nodes2.size(); i++) {
41 U.push_back(context->
addTube(params.fruit_subdivisions, nodes2, radius, params.fruit_texture_file.c_str()));
44 if (context->
randu() < 0.5) {
46 std::vector<vec3> nodes3 = nodes;
47 for (
int i = 0; i < nodes3.size(); i++) {
51 U.push_back(context->
addTube(params.fruit_subdivisions, nodes3, radius, params.fruit_texture_file.c_str()));
59 int Nx = params.leaf_subdivisions.x;
60 int Ny = ceil(params.leaf_subdivisions.y * 0.5);
62 float dx = 1.f / float(Nx);
63 float dy = 0.5f / float(Ny);
65 std::vector<uint> UUIDs;
70 for (
int i = 0; i < Nx; i++) {
71 for (
int j = 0; j < Ny; j++) {
78 mag = sqrt(x * x + 2 * y * y);
79 z = a0 * mag / (e0 + mag);
82 mag = sqrt((x + dx) * (x + dx) + 2 * y * y);
83 z = a0 * mag / (e0 + mag);
84 vec3 v1(x + dx, y, z);
86 mag = sqrt((x + dx) * (x + dx) + 2 * (y + dy) * (y + dy));
87 z = a0 * mag / (e0 + mag);
88 vec3 v2(x + dx, y + dy, z);
90 mag = sqrt(x * x + 2 * (y + dy) * (y + dy));
91 z = a0 * mag / (e0 + mag);
92 vec3 v3(x, y + dy, z);
94 vec2 uv0(1.f - x, 0.5 + j * dy);
95 vec2 uv1(1.f - x - dx, 0.5 + j * dy);
96 vec2 uv2(1.f - x - dx, 0.5 + (j + 1) * dy);
97 vec2 uv3(1.f - x, 0.5 + (j + 1) * dy);
99 UUIDs.push_back(context->
addTriangle(v0, v1, v2, params.leaf_texture_file.c_str(), uv0, uv1, uv2));
100 UUIDs.push_back(context->
addTriangle(v0, v2, v3, params.leaf_texture_file.c_str(), uv0, uv2, uv3));
108 uv1 =
make_vec2(1.f - x - dx, 0.5 - j * dy);
109 uv2 =
make_vec2(1.f - x - dx, 0.5 - (j + 1) * dy);
110 uv3 =
make_vec2(1.f - x, 0.5 - (j + 1) * dy);
112 UUIDs.push_back(context->
addTriangle(v0, v2, v1, params.leaf_texture_file.c_str(), uv0, uv2, uv1));
113 UUIDs.push_back(context->
addTriangle(v0, v3, v2, params.leaf_texture_file.c_str(), uv0, uv3, uv2));
121 std::vector<std::vector<uint>> &leaf_UUIDs, std::vector<uint> &branch_UUIDs, std::vector<std::vector<std::vector<uint>>> &fruit_UUIDs,
Context *context) {
125 std::vector<vec3> nodes;
126 std::vector<float> radius;
127 std::vector<RGBcolor> color;
129 int node_count = round(2 * length * params.stem_subdivisions);
131 vec3 dir = base_direction;
136 nodes.push_back(base_position);
137 radius.push_back(params.stem_radius);
138 color.push_back(params.stem_color);
141 for (
int i = 1; i < node_count; i++) {
143 float vfrac = float(i) / float(node_count - 1);
145 radius.push_back(params.stem_radius * params.plant_height * (1.f - 0.8 * vfrac));
149 theta -= bend_angle / float(node_count - 1);
151 nodes.push_back(position);
153 color.push_back(params.stem_color);
156 U = context->
addTube(params.stem_subdivisions, nodes, radius, color);
157 branch_UUIDs.insert(branch_UUIDs.end(), U.begin(), U.end());
170 leaf_UUIDs.push_back(U);
181 leaf_UUIDs.push_back(U);
191 leaf_UUIDs.push_back(U);
195 if (params.fruit_radius > 0 && context->
randu() < params.clusters_per_stem) {
199 fruit_UUIDs.push_back(strawberryCluster(cluster_position, params, context));
205 std::vector<std::vector<uint>> leaf_UUIDs;
206 std::vector<uint> branch_UUIDs;
207 std::vector<std::vector<std::vector<uint>>> fruit_UUIDs;
209 std::vector<uint> leaf_prototype = leafPrototype(params, context);
211 for (
int i = 0; i < params.stems_per_plant; i++) {
217 float tip_angle = 0.3 *
PI_F * float(i) / float(params.stems_per_plant - 1);
219 float length = (0.75 + 0.25 * float(params.stems_per_plant - 1 - i) / float(params.stems_per_plant - 1)) * params.plant_height * (0.9 + 0.2 * context->
randu());
221 strawberryShoot(params, position, base_direction, length, tip_angle, leaf_prototype, leaf_UUIDs, branch_UUIDs, fruit_UUIDs, context);
226 UUID_leaf.push_back(leaf_UUIDs);
227 UUID_branch.push_back(branch_UUIDs);
228 UUID_fruit.push_back(fruit_UUIDs);
230 return UUID_leaf.size() - 1;