Blender  V3.3
bmo_primitive.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
9 #include "MEM_guardedalloc.h"
10 
11 #include "BLI_math.h"
12 
13 #include "BKE_customdata.h"
14 
15 #include "DNA_meshdata_types.h"
16 
17 #include "bmesh.h"
19 
20 /* ************************ primitives ******************* */
21 
22 static const float icovert[12][3] = {
23  {0.0f, 0.0f, -200.0f},
24  {144.72f, -105.144f, -89.443f},
25  {-55.277f, -170.128, -89.443f},
26  {-178.885f, 0.0f, -89.443f},
27  {-55.277f, 170.128f, -89.443f},
28  {144.72f, 105.144f, -89.443f},
29  {55.277f, -170.128f, 89.443f},
30  {-144.72f, -105.144f, 89.443f},
31  {-144.72f, 105.144f, 89.443f},
32  {55.277f, 170.128f, 89.443f},
33  {178.885f, 0.0f, 89.443f},
34  {0.0f, 0.0f, 200.0f},
35 };
36 
37 static const short icoface[20][3] = {
38  {0, 1, 2}, {1, 0, 5}, {0, 2, 3}, {0, 3, 4}, {0, 4, 5}, {1, 5, 10}, {2, 1, 6},
39  {3, 2, 7}, {4, 3, 8}, {5, 4, 9}, {1, 10, 6}, {2, 6, 7}, {3, 7, 8}, {4, 8, 9},
40  {5, 9, 10}, {6, 10, 11}, {7, 6, 11}, {8, 7, 11}, {9, 8, 11}, {10, 9, 11},
41 };
42 
43 static const float icouvs[60][2] = {
44  {0.181819f, 0.000000f}, {0.272728f, 0.157461f}, {0.090910f, 0.157461f}, {0.272728f, 0.157461f},
45  {0.363637f, 0.000000f}, {0.454546f, 0.157461f}, {0.909091f, 0.000000f}, {1.000000f, 0.157461f},
46  {0.818182f, 0.157461f}, {0.727273f, 0.000000f}, {0.818182f, 0.157461f}, {0.636364f, 0.157461f},
47  {0.545455f, 0.000000f}, {0.636364f, 0.157461f}, {0.454546f, 0.157461f}, {0.272728f, 0.157461f},
48  {0.454546f, 0.157461f}, {0.363637f, 0.314921f}, {0.090910f, 0.157461f}, {0.272728f, 0.157461f},
49  {0.181819f, 0.314921f}, {0.818182f, 0.157461f}, {1.000000f, 0.157461f}, {0.909091f, 0.314921f},
50  {0.636364f, 0.157461f}, {0.818182f, 0.157461f}, {0.727273f, 0.314921f}, {0.454546f, 0.157461f},
51  {0.636364f, 0.157461f}, {0.545455f, 0.314921f}, {0.272728f, 0.157461f}, {0.363637f, 0.314921f},
52  {0.181819f, 0.314921f}, {0.090910f, 0.157461f}, {0.181819f, 0.314921f}, {0.000000f, 0.314921f},
53  {0.818182f, 0.157461f}, {0.909091f, 0.314921f}, {0.727273f, 0.314921f}, {0.636364f, 0.157461f},
54  {0.727273f, 0.314921f}, {0.545455f, 0.314921f}, {0.454546f, 0.157461f}, {0.545455f, 0.314921f},
55  {0.363637f, 0.314921f}, {0.181819f, 0.314921f}, {0.363637f, 0.314921f}, {0.272728f, 0.472382f},
56  {0.000000f, 0.314921f}, {0.181819f, 0.314921f}, {0.090910f, 0.472382f}, {0.727273f, 0.314921f},
57  {0.909091f, 0.314921f}, {0.818182f, 0.472382f}, {0.545455f, 0.314921f}, {0.727273f, 0.314921f},
58  {0.636364f, 0.472382f}, {0.363637f, 0.314921f}, {0.545455f, 0.314921f}, {0.454546f, 0.472382f},
59 };
60 
61 static const int monkeyo = 4;
62 static const int monkeynv = 271;
63 static const int monkeynf = 250;
64 static const signed char monkeyv[271][3] = {
65  {-71, 21, 98}, {-63, 12, 88}, {-57, 7, 74}, {-82, -3, 79}, {-82, 4, 92},
66  {-82, 17, 100}, {-92, 21, 102}, {-101, 12, 95}, {-107, 7, 83}, {-117, 31, 84},
67  {-109, 31, 95}, {-96, 31, 102}, {-92, 42, 102}, {-101, 50, 95}, {-107, 56, 83},
68  {-82, 66, 79}, {-82, 58, 92}, {-82, 46, 100}, {-71, 42, 98}, {-63, 50, 88},
69  {-57, 56, 74}, {-47, 31, 72}, {-55, 31, 86}, {-67, 31, 97}, {-66, 31, 99},
70  {-70, 43, 100}, {-82, 48, 103}, {-93, 43, 105}, {-98, 31, 105}, {-93, 20, 105},
71  {-82, 31, 106}, {-82, 15, 103}, {-70, 20, 100}, {-127, 55, 95}, {-127, 45, 105},
72  {-127, -87, 94}, {-127, -41, 100}, {-127, -24, 102}, {-127, -99, 92}, {-127, 52, 77},
73  {-127, 73, 73}, {-127, 115, -70}, {-127, 72, -109}, {-127, 9, -106}, {-127, -49, -45},
74  {-101, -24, 72}, {-87, -56, 73}, {-82, -89, 73}, {-80, -114, 68}, {-85, -121, 67},
75  {-104, -124, 71}, {-127, -126, 74}, {-71, -18, 68}, {-46, -5, 69}, {-21, 19, 57},
76  {-17, 55, 76}, {-36, 62, 80}, {-64, 77, 88}, {-86, 97, 94}, {-107, 92, 97},
77  {-119, 63, 96}, {-106, 53, 99}, {-111, 39, 98}, {-101, 12, 95}, {-79, 2, 90},
78  {-64, 8, 86}, {-47, 24, 83}, {-45, 38, 83}, {-50, 48, 85}, {-72, 56, 92},
79  {-95, 60, 97}, {-127, -98, 94}, {-113, -92, 94}, {-112, -107, 91}, {-119, -113, 89},
80  {-127, -114, 88}, {-127, -25, 96}, {-127, -18, 95}, {-114, -19, 95}, {-111, -29, 96},
81  {-116, -37, 95}, {-76, -6, 86}, {-48, 7, 80}, {-34, 26, 77}, {-32, 48, 84},
82  {-39, 53, 93}, {-71, 70, 102}, {-87, 82, 107}, {-101, 79, 109}, {-114, 55, 108},
83  {-111, -13, 104}, {-100, -57, 91}, {-95, -90, 88}, {-93, -105, 85}, {-97, -117, 81},
84  {-106, -119, 81}, {-127, -121, 82}, {-127, 6, 93}, {-127, 27, 98}, {-85, 61, 95},
85  {-106, 18, 96}, {-110, 27, 97}, {-112, -88, 94}, {-117, -57, 96}, {-127, -57, 96},
86  {-127, -42, 95}, {-115, -35, 100}, {-110, -29, 102}, {-113, -17, 100}, {-122, -16, 100},
87  {-127, -26, 106}, {-121, -19, 104}, {-115, -20, 104}, {-113, -29, 106}, {-117, -32, 103},
88  {-127, -37, 103}, {-94, -40, 71}, {-106, -31, 91}, {-104, -40, 91}, {-97, -32, 71},
89  {-127, -112, 88}, {-121, -111, 88}, {-115, -105, 91}, {-115, -95, 93}, {-127, -100, 84},
90  {-115, -96, 85}, {-115, -104, 82}, {-121, -109, 81}, {-127, -110, 81}, {-105, 28, 100},
91  {-103, 20, 99}, {-84, 55, 97}, {-92, 54, 99}, {-73, 51, 99}, {-55, 45, 89},
92  {-52, 37, 88}, {-53, 25, 87}, {-66, 13, 92}, {-79, 8, 95}, {-98, 14, 100},
93  {-104, 38, 100}, {-100, 48, 100}, {-97, 46, 97}, {-102, 38, 97}, {-96, 16, 97},
94  {-79, 11, 93}, {-68, 15, 90}, {-57, 27, 86}, {-56, 36, 86}, {-59, 43, 87},
95  {-74, 50, 96}, {-91, 51, 98}, {-84, 52, 96}, {-101, 22, 96}, {-102, 29, 96},
96  {-113, 59, 78}, {-102, 85, 79}, {-84, 88, 76}, {-65, 71, 71}, {-40, 58, 63},
97  {-25, 52, 59}, {-28, 21, 48}, {-50, 0, 53}, {-71, -12, 60}, {-127, 115, 37},
98  {-127, 126, -10}, {-127, -25, -86}, {-127, -59, 24}, {-127, -125, 59}, {-127, -103, 44},
99  {-127, -73, 41}, {-127, -62, 36}, {-18, 30, 7}, {-17, 41, -6}, {-28, 34, -56},
100  {-68, 56, -90}, {-33, -6, 9}, {-51, -16, -21}, {-45, -1, -55}, {-84, 7, -85},
101  {-97, -45, 52}, {-104, -53, 33}, {-90, -91, 49}, {-95, -64, 50}, {-85, -117, 51},
102  {-109, -97, 47}, {-111, -69, 46}, {-106, -121, 56}, {-99, -36, 55}, {-100, -29, 60},
103  {-101, -22, 64}, {-100, -50, 21}, {-89, -40, -34}, {-83, -19, -69}, {-69, 111, -49},
104  {-69, 119, -9}, {-69, 109, 30}, {-68, 67, 55}, {-34, 52, 43}, {-46, 58, 36},
105  {-45, 90, 7}, {-25, 72, 16}, {-25, 79, -15}, {-45, 96, -25}, {-45, 87, -57},
106  {-25, 69, -46}, {-48, 42, -75}, {-65, 3, -70}, {-22, 42, -26}, {-75, -22, 19},
107  {-72, -25, -27}, {-13, 52, -30}, {-28, -18, -16}, {6, -13, -42}, {37, 7, -55},
108  {46, 41, -54}, {31, 65, -54}, {4, 61, -40}, {3, 53, -37}, {25, 56, -50},
109  {35, 37, -52}, {28, 10, -52}, {5, -5, -39}, {-21, -9, -17}, {-9, 46, -28},
110  {-6, 39, -37}, {-14, -3, -27}, {6, 0, -47}, {25, 12, -57}, {31, 32, -57},
111  {23, 46, -56}, {4, 44, -46}, {-19, 37, -27}, {-20, 22, -35}, {-30, 12, -35},
112  {-22, 11, -35}, {-19, 2, -35}, {-23, -2, -35}, {-34, 0, -9}, {-35, -3, -22},
113  {-35, 5, -24}, {-25, 26, -27}, {-13, 31, -34}, {-13, 30, -41}, {-23, -2, -41},
114  {-18, 2, -41}, {-21, 10, -41}, {-29, 12, -41}, {-19, 22, -41}, {6, 42, -53},
115  {25, 44, -62}, {34, 31, -63}, {28, 11, -62}, {7, 0, -54}, {-14, -2, -34},
116  {-5, 37, -44}, {-13, 14, -42}, {-7, 8, -43}, {1, 16, -47}, {-4, 22, -45},
117  {3, 30, -48}, {8, 24, -49}, {15, 27, -50}, {12, 35, -50}, {4, 56, -62},
118  {33, 60, -70}, {48, 38, -64}, {41, 7, -68}, {6, -11, -63}, {-26, -16, -42},
119  {-17, 49, -49},
120 };
121 
122 static signed char monkeyf[250][4] = {
123  {27, 4, 5, 26}, {25, 4, 5, 24}, {3, 6, 5, 4},
124  {1, 6, 5, 2}, {5, 6, 7, 4}, {3, 6, 7, 2},
125  {5, 8, 7, 6}, {3, 8, 7, 4}, {7, 8, 9, 6},
126  {5, 8, 9, 4}, {7, 10, 9, 8}, {5, 10, 9, 6},
127  {9, 10, 11, 8}, {7, 10, 11, 6}, {9, 12, 11, 10},
128  {7, 12, 11, 8}, {11, 6, 13, 12}, {5, 4, 13, 12},
129  {3, -2, 13, 12}, {-3, -4, 13, 12}, {-5, -10, 13, 12},
130  {-11, -12, 14, 12}, {-13, -18, 14, 13}, {-19, 4, 5, 13},
131  {10, 12, 4, 4}, {10, 11, 9, 9}, {8, 7, 9, 9},
132  {7, 5, 6, 6}, {6, 3, 4, 4}, {5, 1, 2, 2},
133  {4, -1, 0, 0}, {3, -3, -2, -2}, {22, 67, 68, 23},
134  {20, 65, 66, 21}, {18, 63, 64, 19}, {16, 61, 62, 17},
135  {14, 59, 60, 15}, {12, 19, 48, 57}, {18, 19, 48, 47},
136  {18, 19, 48, 47}, {18, 19, 48, 47}, {18, 19, 48, 47},
137  {18, 19, 48, 47}, {18, 19, 48, 47}, {18, 19, 48, 47},
138  {18, 19, 48, 47}, {18, -9, -8, 47}, {18, 27, 45, 46},
139  {26, 55, 43, 44}, {24, 41, 42, 54}, {22, 39, 40, 23},
140  {20, 37, 38, 21}, {18, 35, 36, 19}, {16, 33, 34, 17},
141  {14, 31, 32, 15}, {12, 39, 30, 13}, {11, 48, 45, 38},
142  {8, 36, -19, 9}, {8, -20, 44, 47}, {42, 45, 46, 43},
143  {18, 19, 40, 39}, {16, 17, 38, 37}, {14, 15, 36, 35},
144  {32, 44, 43, 33}, {12, 33, 32, 42}, {19, 44, 43, 42},
145  {40, 41, 42, -27}, {8, 9, 39, -28}, {15, 43, 42, 16},
146  {13, 43, 42, 14}, {11, 43, 42, 12}, {9, -30, 42, 10},
147  {37, 12, 38, -32}, {-33, 37, 45, 46}, {-33, 40, 41, 39},
148  {38, 40, 41, 37}, {36, 40, 41, 35}, {34, 40, 41, 33},
149  {36, 39, 38, 37}, {35, 40, 39, 38}, {1, 2, 14, 21},
150  {1, 2, 40, 13}, {1, 2, 40, 39}, {1, 24, 12, 39},
151  {-34, 36, 38, 11}, {35, 38, 36, 37}, {-37, 8, 35, 37},
152  {-11, -12, -45, 40}, {-11, -12, 39, 38}, {-11, -12, 37, 36},
153  {-11, -12, 35, 34}, {33, 34, 40, 41}, {33, 34, 38, 39},
154  {33, 34, 36, 37}, {33, -52, 34, 35}, {33, 37, 36, 34},
155  {33, 35, 34, 34}, {8, 7, 37, 36}, {-32, 7, 35, 46},
156  {-34, -33, 45, 46}, {4, -33, 43, 34}, {-34, -33, 41, 42},
157  {-34, -33, 39, 40}, {-34, -33, 37, 38}, {-34, -33, 35, 36},
158  {-34, -33, 33, 34}, {-34, -33, 31, 32}, {-34, -4, 28, 30},
159  {-5, -34, 28, 27}, {-35, -44, 36, 27}, {26, 35, 36, 45},
160  {24, 25, 44, 45}, {25, 23, 44, 42}, {25, 24, 41, 40},
161  {25, 24, 39, 38}, {25, 24, 37, 36}, {25, 24, 35, 34},
162  {25, 24, 33, 32}, {25, 24, 31, 30}, {15, 24, 29, 38},
163  {25, 24, 27, 26}, {23, 12, 37, 26}, {11, 12, 35, 36},
164  {-86, -59, 36, -80}, {-60, -61, 36, 35}, {-62, -63, 36, 35},
165  {-64, -65, 36, 35}, {-66, -67, 36, 35}, {-68, -69, 36, 35},
166  {-70, -71, 36, 35}, {-72, -73, 36, 35}, {-74, -75, 36, 35},
167  {42, 43, 53, 58}, {40, 41, 57, 56}, {38, 39, 55, 57},
168  {-81, -80, 37, 56}, {-83, -82, 55, 52}, {-85, -84, 51, 49},
169  {-87, -86, 48, 49}, {47, 50, 51, 48}, {46, 48, 51, 49},
170  {43, 46, 49, 44}, {-92, -91, 45, 42}, {-23, 49, 50, -20},
171  {-94, 40, 48, -24}, {-96, -22, 48, 49}, {-97, 48, 21, -90},
172  {-100, 36, 50, 23}, {22, 49, 48, -100}, {-101, 47, 46, 22},
173  {21, 45, 35, 25}, {33, 34, 44, 41}, {13, 14, 28, 24},
174  {-107, 26, 30, -106}, {14, 46, 45, 15}, {14, 44, 43, -110},
175  {-111, 42, 23, -110}, {6, 7, 45, 46}, {45, 44, 47, 46},
176  {45, 46, 47, 48}, {47, 46, 49, 48}, {17, 49, 47, 48},
177  {17, 36, 46, 48}, {35, 36, 44, 45}, {35, 36, 40, 43},
178  {35, 36, 38, 39}, {-4, -3, 37, 35}, {-123, 34, 33, 1},
179  {-9, -8, -7, -6}, {-10, -7, 32, -125}, {-127, -11, -126, -126},
180  {-7, -6, 5, 31}, {4, 5, 33, 30}, {4, 39, 33, 32},
181  {4, 35, 32, 38}, {20, 21, 39, 38}, {4, 37, 38, 5},
182  {-11, -10, 36, 3}, {-11, 15, 14, 35}, {13, 16, 34, 34},
183  {-13, 14, 13, 13}, {-3, 1, 30, 29}, {-3, 28, 29, 1},
184  {-2, 31, 28, -1}, {12, 13, 27, 30}, {-2, 26, 12, 12},
185  {35, 29, 42, 36}, {34, 35, 36, 33}, {32, 35, 36, 31},
186  {30, 35, 36, 29}, {28, 35, 36, 27}, {26, 35, 36, 25},
187  {34, 39, 38, 35}, {32, 39, 38, 33}, {30, 39, 38, 31},
188  {28, 39, 38, 29}, {26, 39, 38, 27}, {25, 31, 32, 38},
189  {-18, -17, 45, 44}, {-18, 17, 28, 44}, {-24, -20, 42, -23},
190  {11, 35, 27, 14}, {25, 28, 39, 41}, {37, 41, 40, 38},
191  {34, 40, 36, 35}, {32, 40, 39, 33}, {30, 39, 31, 40},
192  {21, 29, 39, 22}, {-31, 37, 28, 4}, {-32, 33, 35, 36},
193  {32, 33, 34, 34}, {18, 35, 36, 48}, {34, 25, 40, 35},
194  {24, 25, 38, 39}, {24, 25, 36, 37}, {24, 25, 34, 35},
195  {24, 25, 32, 33}, {24, 13, 41, 31}, {17, 11, 41, 35},
196  {15, 16, 34, 35}, {13, 14, 34, 35}, {11, 12, 34, 35},
197  {9, 10, 34, 35}, {7, 8, 34, 35}, {26, 25, 37, 36},
198  {35, 36, 37, 38}, {37, 36, 39, 38}, {37, 38, 39, 40},
199  {25, 31, 36, 39}, {18, 34, 35, 30}, {17, 22, 30, 33},
200  {19, 29, 21, 20}, {16, 26, 29, 17}, {24, 29, 28, 25},
201  {22, 31, 28, 23}, {20, 31, 30, 21}, {18, 31, 30, 19},
202  {16, 30, 17, 17}, {-21, -22, 35, 34}, {-21, -22, 33, 32},
203  {-21, -22, 31, 30}, {-21, -22, 29, 28}, {-21, -22, 27, 26},
204  {-28, -22, 25, 31}, {24, 28, 29, 30}, {23, 24, 26, 27},
205  {23, 24, 25, 25}, {-69, -35, -32, 27}, {-70, 26, 25, -66},
206  {-68, -67, 24, -33},
207 };
208 
209 static const float monkeyuvs[] = {
210  0.890955f, 0.590063f, 0.870622f, 0.589649f, 0.860081f, 0.560115f, 0.904571f, 0.559404f,
211  0.856226f, 0.850547f, 0.868067f, 0.821510f, 0.888398f, 0.821999f, 0.900640f, 0.853232f,
212  0.904571f, 0.559404f, 0.860081f, 0.560115f, 0.853018f, 0.521562f, 0.920166f, 0.524546f,
213  0.847458f, 0.888748f, 0.856226f, 0.850547f, 0.900640f, 0.853232f, 0.914672f, 0.888748f,
214  0.860081f, 0.560115f, 0.828900f, 0.590771f, 0.798481f, 0.569535f, 0.853018f, 0.521562f,
215  0.795104f, 0.838402f, 0.826436f, 0.818537f, 0.856226f, 0.850547f, 0.847458f, 0.888748f,
216  0.870622f, 0.589649f, 0.854402f, 0.604754f, 0.828900f, 0.590771f, 0.860081f, 0.560115f,
217  0.826436f, 0.818537f, 0.852534f, 0.805700f, 0.868067f, 0.821510f, 0.856226f, 0.850547f,
218  0.854402f, 0.604754f, 0.854107f, 0.625459f, 0.828171f, 0.633354f, 0.828900f, 0.590771f,
219  0.827598f, 0.775964f, 0.853157f, 0.785002f, 0.852534f, 0.805700f, 0.826436f, 0.818537f,
220  0.828900f, 0.590771f, 0.828171f, 0.633354f, 0.791018f, 0.645443f, 0.798481f, 0.569535f,
221  0.791018f, 0.762238f, 0.827598f, 0.775964f, 0.826436f, 0.818537f, 0.795104f, 0.838402f,
222  0.828171f, 0.633354f, 0.855181f, 0.668527f, 0.842358f, 0.702491f, 0.791018f, 0.645443f,
223  0.844839f, 0.707525f, 0.856142f, 0.742025f, 0.827598f, 0.775964f, 0.791018f, 0.762238f,
224  0.854107f, 0.625459f, 0.867508f, 0.642291f, 0.855181f, 0.668527f, 0.828171f, 0.633354f,
225  0.856142f, 0.742025f, 0.867293f, 0.768782f, 0.853157f, 0.785002f, 0.827598f, 0.775964f,
226  0.867508f, 0.642291f, 0.890474f, 0.641909f, 0.900375f, 0.666964f, 0.855181f, 0.668527f,
227  0.901223f, 0.745592f, 0.890219f, 0.770183f, 0.867293f, 0.768782f, 0.856142f, 0.742025f,
228  0.855181f, 0.668527f, 0.900375f, 0.666964f, 0.918898f, 0.699697f, 0.842358f, 0.702491f,
229  0.921180f, 0.713713f, 0.901223f, 0.745592f, 0.856142f, 0.742025f, 0.844839f, 0.707525f,
230  0.900375f, 0.666964f, 0.931889f, 0.636832f, 0.968392f, 0.645333f, 0.918898f, 0.699697f,
231  0.968213f, 0.770220f, 0.931368f, 0.777093f, 0.901223f, 0.745592f, 0.921180f, 0.713713f,
232  0.890474f, 0.641909f, 0.905882f, 0.627902f, 0.931889f, 0.636832f, 0.900375f, 0.666964f,
233  0.931368f, 0.777093f, 0.904990f, 0.784860f, 0.890219f, 0.770183f, 0.901223f, 0.745592f,
234  0.905882f, 0.627902f, 0.906232f, 0.605742f, 0.933717f, 0.593037f, 0.931889f, 0.636832f,
235  0.931250f, 0.820926f, 0.904357f, 0.807013f, 0.904990f, 0.784860f, 0.931368f, 0.777093f,
236  0.931889f, 0.636832f, 0.933717f, 0.593037f, 0.968392f, 0.573812f, 0.968392f, 0.645333f,
237  0.965038f, 0.841671f, 0.931250f, 0.820926f, 0.931368f, 0.777093f, 0.968213f, 0.770220f,
238  0.933717f, 0.593037f, 0.904571f, 0.559404f, 0.920166f, 0.524546f, 0.968392f, 0.573812f,
239  0.914672f, 0.888748f, 0.900640f, 0.853232f, 0.931250f, 0.820926f, 0.965038f, 0.841671f,
240  0.906232f, 0.605742f, 0.890955f, 0.590063f, 0.904571f, 0.559404f, 0.933717f, 0.593037f,
241  0.900640f, 0.853232f, 0.888398f, 0.821999f, 0.904357f, 0.807013f, 0.931250f, 0.820926f,
242  0.890955f, 0.590063f, 0.906232f, 0.605742f, 0.902359f, 0.607909f, 0.889591f, 0.593275f,
243  0.900583f, 0.804677f, 0.904357f, 0.807013f, 0.888398f, 0.821999f, 0.887178f, 0.818729f,
244  0.906232f, 0.605742f, 0.905882f, 0.627902f, 0.899781f, 0.626257f, 0.902359f, 0.607909f,
245  0.898822f, 0.786233f, 0.904990f, 0.784860f, 0.904357f, 0.807013f, 0.900583f, 0.804677f,
246  0.905882f, 0.627902f, 0.890474f, 0.641909f, 0.887842f, 0.636527f, 0.899781f, 0.626257f,
247  0.887351f, 0.775442f, 0.890219f, 0.770183f, 0.904990f, 0.784860f, 0.898822f, 0.786233f,
248  0.890474f, 0.641909f, 0.867508f, 0.642291f, 0.870908f, 0.635245f, 0.887842f, 0.636527f,
249  0.870376f, 0.775972f, 0.867293f, 0.768782f, 0.890219f, 0.770183f, 0.887351f, 0.775442f,
250  0.867508f, 0.642291f, 0.854107f, 0.625459f, 0.859881f, 0.623942f, 0.870908f, 0.635245f,
251  0.858859f, 0.786774f, 0.853157f, 0.785002f, 0.867293f, 0.768782f, 0.870376f, 0.775972f,
252  0.854107f, 0.625459f, 0.854402f, 0.604754f, 0.859664f, 0.608186f, 0.859881f, 0.623942f,
253  0.857942f, 0.802505f, 0.852534f, 0.805700f, 0.853157f, 0.785002f, 0.858859f, 0.786774f,
254  0.854402f, 0.604754f, 0.870622f, 0.589649f, 0.871664f, 0.593961f, 0.859664f, 0.608186f,
255  0.869299f, 0.817249f, 0.868067f, 0.821510f, 0.852534f, 0.805700f, 0.857942f, 0.802505f,
256  0.870622f, 0.589649f, 0.890955f, 0.590063f, 0.889591f, 0.593275f, 0.871664f, 0.593961f,
257  0.887178f, 0.818729f, 0.888398f, 0.821999f, 0.868067f, 0.821510f, 0.869299f, 0.817249f,
258  0.879400f, 0.616512f, 0.871664f, 0.593961f, 0.889591f, 0.593275f, 0.887178f, 0.818729f,
259  0.869299f, 0.817249f, 0.878029f, 0.795063f, 0.859664f, 0.608186f, 0.871664f, 0.593961f,
260  0.879400f, 0.616512f, 0.878029f, 0.795063f, 0.869299f, 0.817249f, 0.857942f, 0.802505f,
261  0.879400f, 0.616512f, 0.859881f, 0.623942f, 0.859664f, 0.608186f, 0.857942f, 0.802505f,
262  0.858859f, 0.786774f, 0.878029f, 0.795063f, 0.879400f, 0.616512f, 0.870908f, 0.635245f,
263  0.859881f, 0.623942f, 0.858859f, 0.786774f, 0.870376f, 0.775972f, 0.878029f, 0.795063f,
264  0.879400f, 0.616512f, 0.887842f, 0.636527f, 0.870908f, 0.635245f, 0.870376f, 0.775972f,
265  0.887351f, 0.775442f, 0.878029f, 0.795063f, 0.879400f, 0.616512f, 0.899781f, 0.626257f,
266  0.887842f, 0.636527f, 0.887351f, 0.775442f, 0.898822f, 0.786233f, 0.878029f, 0.795063f,
267  0.879400f, 0.616512f, 0.902359f, 0.607909f, 0.899781f, 0.626257f, 0.898822f, 0.786233f,
268  0.900583f, 0.804677f, 0.878029f, 0.795063f, 0.879400f, 0.616512f, 0.889591f, 0.593275f,
269  0.902359f, 0.607909f, 0.900583f, 0.804677f, 0.887178f, 0.818729f, 0.878029f, 0.795063f,
270  0.540260f, 0.053805f, 0.536419f, 0.062072f, 0.518925f, 0.059681f, 0.518916f, 0.050294f,
271  0.518925f, 0.059681f, 0.501452f, 0.062043f, 0.497626f, 0.053770f, 0.518916f, 0.050294f,
272  0.551930f, 0.058338f, 0.542788f, 0.064089f, 0.536419f, 0.062072f, 0.540260f, 0.053805f,
273  0.501452f, 0.062043f, 0.495083f, 0.064047f, 0.485955f, 0.058273f, 0.497626f, 0.053770f,
274  0.555073f, 0.061900f, 0.546290f, 0.072669f, 0.542788f, 0.064089f, 0.551930f, 0.058338f,
275  0.495083f, 0.064047f, 0.491565f, 0.072625f, 0.482805f, 0.061829f, 0.485955f, 0.058273f,
276  0.563812f, 0.076586f, 0.548333f, 0.084893f, 0.546290f, 0.072669f, 0.555073f, 0.061900f,
277  0.491565f, 0.072625f, 0.489507f, 0.084858f, 0.474014f, 0.076511f, 0.482805f, 0.061829f,
278  0.583135f, 0.108495f, 0.555621f, 0.121749f, 0.548333f, 0.084893f, 0.563812f, 0.076586f,
279  0.489507f, 0.084858f, 0.482177f, 0.121781f, 0.454527f, 0.108481f, 0.474014f, 0.076511f,
280  0.605512f, 0.165134f, 0.647395f, 0.200502f, 0.621513f, 0.227818f, 0.553118f, 0.209599f,
281  0.416514f, 0.229490f, 0.389677f, 0.201890f, 0.432024f, 0.165644f, 0.485339f, 0.210053f,
282  0.647395f, 0.200502f, 0.676379f, 0.233241f, 0.664761f, 0.253225f, 0.621513f, 0.227818f,
283  0.372747f, 0.256357f, 0.360308f, 0.235899f, 0.389677f, 0.201890f, 0.416514f, 0.229490f,
284  0.676379f, 0.233241f, 0.715342f, 0.265392f, 0.683908f, 0.279995f, 0.664761f, 0.253225f,
285  0.353696f, 0.284606f, 0.320452f, 0.270303f, 0.360308f, 0.235899f, 0.372747f, 0.256357f,
286  0.715342f, 0.265392f, 0.707254f, 0.310054f, 0.687515f, 0.311539f, 0.683908f, 0.279995f,
287  0.351187f, 0.317440f, 0.330721f, 0.316853f, 0.320452f, 0.270303f, 0.353696f, 0.284606f,
288  0.707254f, 0.310054f, 0.697446f, 0.332673f, 0.676824f, 0.323937f, 0.687515f, 0.311539f,
289  0.362723f, 0.329722f, 0.341964f, 0.339667f, 0.330721f, 0.316853f, 0.351187f, 0.317440f,
290  0.697446f, 0.332673f, 0.662817f, 0.372521f, 0.639050f, 0.357330f, 0.676824f, 0.323937f,
291  0.402772f, 0.362131f, 0.379297f, 0.378686f, 0.341964f, 0.339667f, 0.362723f, 0.329722f,
292  0.662817f, 0.372521f, 0.626842f, 0.395792f, 0.618316f, 0.375151f, 0.639050f, 0.357330f,
293  0.424583f, 0.379267f, 0.416915f, 0.400552f, 0.379297f, 0.378686f, 0.402772f, 0.362131f,
294  0.626842f, 0.395792f, 0.604826f, 0.397804f, 0.600808f, 0.377857f, 0.618316f, 0.375151f,
295  0.442396f, 0.381222f, 0.439252f, 0.401540f, 0.416915f, 0.400552f, 0.424583f, 0.379267f,
296  0.604826f, 0.397804f, 0.553095f, 0.390512f, 0.559674f, 0.357011f, 0.600808f, 0.377857f,
297  0.482938f, 0.358497f, 0.490934f, 0.391862f, 0.439252f, 0.401540f, 0.442396f, 0.381222f,
298  0.553095f, 0.390512f, 0.521923f, 0.386009f, 0.521086f, 0.343868f, 0.559674f, 0.357011f,
299  0.521086f, 0.343868f, 0.521923f, 0.386009f, 0.490934f, 0.391862f, 0.482938f, 0.358497f,
300  0.577279f, 0.340156f, 0.599845f, 0.344815f, 0.600808f, 0.377857f, 0.559674f, 0.357011f,
301  0.442396f, 0.381222f, 0.441977f, 0.347815f, 0.464579f, 0.342230f, 0.482938f, 0.358497f,
302  0.599845f, 0.344815f, 0.615546f, 0.342005f, 0.618316f, 0.375151f, 0.600808f, 0.377857f,
303  0.424583f, 0.379267f, 0.425972f, 0.345582f, 0.441977f, 0.347815f, 0.442396f, 0.381222f,
304  0.634472f, 0.332311f, 0.639050f, 0.357330f, 0.618316f, 0.375151f, 0.615546f, 0.342005f,
305  0.424583f, 0.379267f, 0.402772f, 0.362131f, 0.406362f, 0.336480f, 0.425972f, 0.345582f,
306  0.662406f, 0.312804f, 0.676824f, 0.323937f, 0.639050f, 0.357330f, 0.634472f, 0.332311f,
307  0.402772f, 0.362131f, 0.362723f, 0.329722f, 0.377061f, 0.317685f, 0.406362f, 0.336480f,
308  0.668440f, 0.297958f, 0.687515f, 0.311539f, 0.676824f, 0.323937f, 0.662406f, 0.312804f,
309  0.362723f, 0.329722f, 0.351187f, 0.317440f, 0.370304f, 0.302644f, 0.377061f, 0.317685f,
310  0.664101f, 0.277872f, 0.683908f, 0.279995f, 0.687515f, 0.311539f, 0.668440f, 0.297958f,
311  0.351187f, 0.317440f, 0.353696f, 0.284606f, 0.374100f, 0.281778f, 0.370304f, 0.302644f,
312  0.639236f, 0.253047f, 0.664761f, 0.253225f, 0.683908f, 0.279995f, 0.664101f, 0.277872f,
313  0.353696f, 0.284606f, 0.372747f, 0.256357f, 0.398938f, 0.255633f, 0.374100f, 0.281778f,
314  0.613992f, 0.242662f, 0.621513f, 0.227818f, 0.664761f, 0.253225f, 0.639236f, 0.253047f,
315  0.372747f, 0.256357f, 0.416514f, 0.229490f, 0.424464f, 0.244473f, 0.398938f, 0.255633f,
316  0.572941f, 0.258564f, 0.553118f, 0.209599f, 0.621513f, 0.227818f, 0.613992f, 0.242662f,
317  0.416514f, 0.229490f, 0.485339f, 0.210053f, 0.466409f, 0.259709f, 0.424464f, 0.244473f,
318  0.572941f, 0.258564f, 0.563905f, 0.272007f, 0.519760f, 0.248864f, 0.553118f, 0.209599f,
319  0.519760f, 0.248864f, 0.475886f, 0.273078f, 0.466409f, 0.259709f, 0.485339f, 0.210053f,
320  0.577279f, 0.340156f, 0.559674f, 0.357011f, 0.521086f, 0.343868f, 0.558527f, 0.316594f,
321  0.521086f, 0.343868f, 0.482938f, 0.358497f, 0.464579f, 0.342230f, 0.482619f, 0.317843f,
322  0.558527f, 0.316594f, 0.521086f, 0.343868f, 0.520277f, 0.294764f, 0.556923f, 0.291214f,
323  0.520277f, 0.294764f, 0.521086f, 0.343868f, 0.482619f, 0.317843f, 0.483433f, 0.292249f,
324  0.519760f, 0.248864f, 0.563905f, 0.272007f, 0.556923f, 0.291214f, 0.520277f, 0.294764f,
325  0.483433f, 0.292249f, 0.475886f, 0.273078f, 0.519760f, 0.248864f, 0.520277f, 0.294764f,
326  0.525483f, 0.068967f, 0.518928f, 0.067899f, 0.518925f, 0.059681f, 0.536419f, 0.062072f,
327  0.518925f, 0.059681f, 0.518928f, 0.067899f, 0.512375f, 0.068956f, 0.501452f, 0.062043f,
328  0.531231f, 0.073829f, 0.525483f, 0.068967f, 0.536419f, 0.062072f, 0.542788f, 0.064089f,
329  0.501452f, 0.062043f, 0.512375f, 0.068956f, 0.506626f, 0.073811f, 0.495083f, 0.064047f,
330  0.531019f, 0.087431f, 0.531231f, 0.073829f, 0.542788f, 0.064089f, 0.546290f, 0.072669f,
331  0.495083f, 0.064047f, 0.506626f, 0.073811f, 0.506827f, 0.087416f, 0.491565f, 0.072625f,
332  0.555621f, 0.121749f, 0.532042f, 0.127713f, 0.532669f, 0.090920f, 0.548333f, 0.084893f,
333  0.505177f, 0.090908f, 0.505828f, 0.127728f, 0.482177f, 0.121781f, 0.489507f, 0.084858f,
334  0.531019f, 0.087431f, 0.546290f, 0.072669f, 0.548333f, 0.084893f, 0.532669f, 0.090920f,
335  0.489507f, 0.084858f, 0.491565f, 0.072625f, 0.506827f, 0.087416f, 0.505177f, 0.090908f,
336  0.538112f, 0.158382f, 0.518981f, 0.151749f, 0.518941f, 0.128358f, 0.532042f, 0.127713f,
337  0.518941f, 0.128358f, 0.518981f, 0.151749f, 0.499851f, 0.158434f, 0.505828f, 0.127728f,
338  0.532669f, 0.090920f, 0.532042f, 0.127713f, 0.518941f, 0.128358f, 0.518925f, 0.093952f,
339  0.518941f, 0.128358f, 0.505828f, 0.127728f, 0.505177f, 0.090908f, 0.518925f, 0.093952f,
340  0.518927f, 0.085180f, 0.531019f, 0.087431f, 0.532669f, 0.090920f, 0.518925f, 0.093952f,
341  0.505177f, 0.090908f, 0.506827f, 0.087416f, 0.518927f, 0.085180f, 0.518925f, 0.093952f,
342  0.548362f, 0.173560f, 0.537959f, 0.175966f, 0.535214f, 0.166808f, 0.538112f, 0.158382f,
343  0.502799f, 0.166857f, 0.500100f, 0.176033f, 0.489683f, 0.173693f, 0.499851f, 0.158434f,
344  0.544281f, 0.193366f, 0.537248f, 0.187577f, 0.537959f, 0.175966f, 0.548362f, 0.173560f,
345  0.500100f, 0.176033f, 0.500890f, 0.187571f, 0.493996f, 0.193428f, 0.489683f, 0.173693f,
346  0.519841f, 0.200843f, 0.528757f, 0.191785f, 0.537248f, 0.187577f, 0.544281f, 0.193366f,
347  0.500890f, 0.187571f, 0.509219f, 0.191626f, 0.519841f, 0.200843f, 0.493996f, 0.193428f,
348  0.517577f, 0.190607f, 0.519132f, 0.185382f, 0.528757f, 0.191785f, 0.519841f, 0.200843f,
349  0.509219f, 0.191626f, 0.519132f, 0.185382f, 0.517577f, 0.190607f, 0.519841f, 0.200843f,
350  0.518981f, 0.151749f, 0.538112f, 0.158382f, 0.535214f, 0.166808f, 0.518998f, 0.159028f,
351  0.502799f, 0.166857f, 0.499851f, 0.158434f, 0.518981f, 0.151749f, 0.518998f, 0.159028f,
352  0.518998f, 0.159028f, 0.535214f, 0.166808f, 0.531131f, 0.171631f, 0.519016f, 0.165599f,
353  0.506910f, 0.171667f, 0.502799f, 0.166857f, 0.518998f, 0.159028f, 0.519016f, 0.165599f,
354  0.519132f, 0.185382f, 0.519099f, 0.179457f, 0.528222f, 0.186316f, 0.528757f, 0.191785f,
355  0.509787f, 0.186260f, 0.519099f, 0.179457f, 0.519132f, 0.185382f, 0.509219f, 0.191626f,
356  0.528757f, 0.191785f, 0.528222f, 0.186316f, 0.533528f, 0.184215f, 0.537248f, 0.187577f,
357  0.504547f, 0.184206f, 0.509787f, 0.186260f, 0.509219f, 0.191626f, 0.500890f, 0.187571f,
358  0.537248f, 0.187577f, 0.533528f, 0.184215f, 0.533449f, 0.176739f, 0.537959f, 0.175966f,
359  0.504604f, 0.176791f, 0.504547f, 0.184206f, 0.500890f, 0.187571f, 0.500100f, 0.176033f,
360  0.537959f, 0.175966f, 0.533449f, 0.176739f, 0.531131f, 0.171631f, 0.535214f, 0.166808f,
361  0.506910f, 0.171667f, 0.504604f, 0.176791f, 0.500100f, 0.176033f, 0.502799f, 0.166857f,
362  0.519099f, 0.179457f, 0.533449f, 0.176739f, 0.533528f, 0.184215f, 0.528222f, 0.186316f,
363  0.504547f, 0.184206f, 0.504604f, 0.176791f, 0.519099f, 0.179457f, 0.509787f, 0.186260f,
364  0.519099f, 0.179457f, 0.519016f, 0.165599f, 0.531131f, 0.171631f, 0.533449f, 0.176739f,
365  0.506910f, 0.171667f, 0.519016f, 0.165599f, 0.519099f, 0.179457f, 0.504604f, 0.176791f,
366  0.519841f, 0.200843f, 0.544281f, 0.193366f, 0.553118f, 0.209599f, 0.519760f, 0.248864f,
367  0.485339f, 0.210053f, 0.493996f, 0.193428f, 0.519841f, 0.200843f, 0.519760f, 0.248864f,
368  0.544281f, 0.193366f, 0.548362f, 0.173560f, 0.561572f, 0.167779f, 0.553118f, 0.209599f,
369  0.476363f, 0.167996f, 0.489683f, 0.173693f, 0.493996f, 0.193428f, 0.485339f, 0.210053f,
370  0.548362f, 0.173560f, 0.538112f, 0.158382f, 0.559475f, 0.149319f, 0.561572f, 0.167779f,
371  0.478371f, 0.149447f, 0.499851f, 0.158434f, 0.489683f, 0.173693f, 0.476363f, 0.167996f,
372  0.538112f, 0.158382f, 0.532042f, 0.127713f, 0.555621f, 0.121749f, 0.559475f, 0.149319f,
373  0.482177f, 0.121781f, 0.505828f, 0.127728f, 0.499851f, 0.158434f, 0.478371f, 0.149447f,
374  0.583135f, 0.108495f, 0.596138f, 0.133426f, 0.559475f, 0.149319f, 0.555621f, 0.121749f,
375  0.478371f, 0.149447f, 0.441395f, 0.133592f, 0.454527f, 0.108481f, 0.482177f, 0.121781f,
376  0.596138f, 0.133426f, 0.601169f, 0.147885f, 0.561572f, 0.167779f, 0.559475f, 0.149319f,
377  0.476363f, 0.167996f, 0.436337f, 0.148194f, 0.441395f, 0.133592f, 0.478371f, 0.149447f,
378  0.605512f, 0.165134f, 0.553118f, 0.209599f, 0.561572f, 0.167779f, 0.601169f, 0.147885f,
379  0.476363f, 0.167996f, 0.485339f, 0.210053f, 0.432024f, 0.165644f, 0.436337f, 0.148194f,
380  0.531019f, 0.087431f, 0.518927f, 0.085180f, 0.518925f, 0.083865f, 0.528933f, 0.084957f,
381  0.518925f, 0.083865f, 0.518927f, 0.085180f, 0.506827f, 0.087416f, 0.508915f, 0.084945f,
382  0.531231f, 0.073829f, 0.531019f, 0.087431f, 0.528933f, 0.084957f, 0.529036f, 0.075429f,
383  0.508915f, 0.084945f, 0.506827f, 0.087416f, 0.506626f, 0.073811f, 0.508820f, 0.075415f,
384  0.525483f, 0.068967f, 0.531231f, 0.073829f, 0.529036f, 0.075429f, 0.523751f, 0.070508f,
385  0.508820f, 0.075415f, 0.506626f, 0.073811f, 0.512375f, 0.068956f, 0.514106f, 0.070501f,
386  0.518928f, 0.067899f, 0.525483f, 0.068967f, 0.523751f, 0.070508f, 0.518929f, 0.069468f,
387  0.514106f, 0.070501f, 0.512375f, 0.068956f, 0.518928f, 0.067899f, 0.518929f, 0.069468f,
388  0.518929f, 0.069468f, 0.523751f, 0.070508f, 0.521560f, 0.074970f, 0.518928f, 0.074259f,
389  0.516297f, 0.074966f, 0.514106f, 0.070501f, 0.518929f, 0.069468f, 0.518928f, 0.074259f,
390  0.523751f, 0.070508f, 0.529036f, 0.075429f, 0.524236f, 0.076691f, 0.521560f, 0.074970f,
391  0.513619f, 0.076684f, 0.508820f, 0.075415f, 0.514106f, 0.070501f, 0.516297f, 0.074966f,
392  0.529036f, 0.075429f, 0.528933f, 0.084957f, 0.524601f, 0.079886f, 0.524236f, 0.076691f,
393  0.513252f, 0.079879f, 0.508915f, 0.084945f, 0.508820f, 0.075415f, 0.513619f, 0.076684f,
394  0.528933f, 0.084957f, 0.518925f, 0.083865f, 0.518926f, 0.079331f, 0.524601f, 0.079886f,
395  0.518926f, 0.079331f, 0.518925f, 0.083865f, 0.508915f, 0.084945f, 0.513252f, 0.079879f,
396  0.518926f, 0.079331f, 0.518928f, 0.074259f, 0.521560f, 0.074970f, 0.524601f, 0.079886f,
397  0.516297f, 0.074966f, 0.518928f, 0.074259f, 0.518926f, 0.079331f, 0.513252f, 0.079879f,
398  0.524601f, 0.079886f, 0.521560f, 0.074970f, 0.524236f, 0.076691f, 0.513619f, 0.076684f,
399  0.516297f, 0.074966f, 0.513252f, 0.079879f, 0.556923f, 0.291214f, 0.563905f, 0.272007f,
400  0.571787f, 0.277295f, 0.568351f, 0.292904f, 0.468070f, 0.278617f, 0.475886f, 0.273078f,
401  0.483433f, 0.292249f, 0.471978f, 0.294282f, 0.558527f, 0.316594f, 0.556923f, 0.291214f,
402  0.568351f, 0.292904f, 0.573085f, 0.311386f, 0.471978f, 0.294282f, 0.483433f, 0.292249f,
403  0.482619f, 0.317843f, 0.467790f, 0.313081f, 0.577279f, 0.340156f, 0.558527f, 0.316594f,
404  0.573085f, 0.311386f, 0.584855f, 0.327708f, 0.467790f, 0.313081f, 0.482619f, 0.317843f,
405  0.464579f, 0.342230f, 0.456477f, 0.329961f, 0.563905f, 0.272007f, 0.572941f, 0.258564f,
406  0.580734f, 0.266620f, 0.571787f, 0.277295f, 0.458737f, 0.268049f, 0.466409f, 0.259709f,
407  0.475886f, 0.273078f, 0.468070f, 0.278617f, 0.572941f, 0.258564f, 0.613992f, 0.242662f,
408  0.611720f, 0.255725f, 0.580734f, 0.266620f, 0.427062f, 0.257728f, 0.424464f, 0.244473f,
409  0.466409f, 0.259709f, 0.458737f, 0.268049f, 0.613992f, 0.242662f, 0.639236f, 0.253047f,
410  0.632494f, 0.262853f, 0.611720f, 0.255725f, 0.406068f, 0.265508f, 0.398938f, 0.255633f,
411  0.424464f, 0.244473f, 0.427062f, 0.257728f, 0.639236f, 0.253047f, 0.664101f, 0.277872f,
412  0.653658f, 0.279971f, 0.632494f, 0.262853f, 0.384904f, 0.283634f, 0.374100f, 0.281778f,
413  0.398938f, 0.255633f, 0.406068f, 0.265508f, 0.664101f, 0.277872f, 0.668440f, 0.297958f,
414  0.656064f, 0.297636f, 0.653658f, 0.279971f, 0.383015f, 0.301864f, 0.370304f, 0.302644f,
415  0.374100f, 0.281778f, 0.384904f, 0.283634f, 0.668440f, 0.297958f, 0.662406f, 0.312804f,
416  0.652752f, 0.310186f, 0.656064f, 0.297636f, 0.386858f, 0.314615f, 0.377061f, 0.317685f,
417  0.370304f, 0.302644f, 0.383015f, 0.301864f, 0.662406f, 0.312804f, 0.634472f, 0.332311f,
418  0.629040f, 0.323864f, 0.652752f, 0.310186f, 0.411556f, 0.327673f, 0.406362f, 0.336480f,
419  0.377061f, 0.317685f, 0.386858f, 0.314615f, 0.634472f, 0.332311f, 0.615546f, 0.342005f,
420  0.614408f, 0.331972f, 0.629040f, 0.323864f, 0.426727f, 0.335361f, 0.425972f, 0.345582f,
421  0.406362f, 0.336480f, 0.411556f, 0.327673f, 0.615546f, 0.342005f, 0.599845f, 0.344815f,
422  0.601033f, 0.333624f, 0.614408f, 0.331972f, 0.440344f, 0.336537f, 0.441977f, 0.347815f,
423  0.425972f, 0.345582f, 0.426727f, 0.335361f, 0.599845f, 0.344815f, 0.577279f, 0.340156f,
424  0.584855f, 0.327708f, 0.601033f, 0.333624f, 0.456477f, 0.329961f, 0.464579f, 0.342230f,
425  0.441977f, 0.347815f, 0.440344f, 0.336537f, 0.601033f, 0.333624f, 0.584855f, 0.327708f,
426  0.590644f, 0.321516f, 0.601799f, 0.328453f, 0.450408f, 0.323919f, 0.456477f, 0.329961f,
427  0.440344f, 0.336537f, 0.439372f, 0.331331f, 0.614408f, 0.331972f, 0.601033f, 0.333624f,
428  0.601799f, 0.328453f, 0.613335f, 0.327083f, 0.439372f, 0.331331f, 0.440344f, 0.336537f,
429  0.426727f, 0.335361f, 0.427623f, 0.330358f, 0.629040f, 0.323864f, 0.614408f, 0.331972f,
430  0.613335f, 0.327083f, 0.626851f, 0.320513f, 0.427623f, 0.330358f, 0.426727f, 0.335361f,
431  0.411556f, 0.327673f, 0.413648f, 0.324175f, 0.652752f, 0.310186f, 0.629040f, 0.323864f,
432  0.626851f, 0.320513f, 0.646248f, 0.306421f, 0.413648f, 0.324175f, 0.411556f, 0.327673f,
433  0.386858f, 0.314615f, 0.393381f, 0.310510f, 0.656064f, 0.297636f, 0.652752f, 0.310186f,
434  0.646248f, 0.306421f, 0.649541f, 0.296225f, 0.393381f, 0.310510f, 0.386858f, 0.314615f,
435  0.383015f, 0.301864f, 0.389662f, 0.300183f, 0.653658f, 0.279971f, 0.656064f, 0.297636f,
436  0.649541f, 0.296225f, 0.647785f, 0.283486f, 0.389662f, 0.300183f, 0.383015f, 0.301864f,
437  0.384904f, 0.283634f, 0.391040f, 0.287071f, 0.632494f, 0.262853f, 0.653658f, 0.279971f,
438  0.647785f, 0.283486f, 0.629829f, 0.267263f, 0.391040f, 0.287071f, 0.384904f, 0.283634f,
439  0.406068f, 0.265508f, 0.408893f, 0.269959f, 0.611720f, 0.255725f, 0.632494f, 0.262853f,
440  0.629829f, 0.267263f, 0.612641f, 0.261560f, 0.408893f, 0.269959f, 0.406068f, 0.265508f,
441  0.427062f, 0.257728f, 0.426254f, 0.263693f, 0.580734f, 0.266620f, 0.611720f, 0.255725f,
442  0.612641f, 0.261560f, 0.585166f, 0.270991f, 0.426254f, 0.263693f, 0.427062f, 0.257728f,
443  0.458737f, 0.268049f, 0.454369f, 0.272583f, 0.571787f, 0.277295f, 0.580734f, 0.266620f,
444  0.585166f, 0.270991f, 0.578124f, 0.281900f, 0.454369f, 0.272583f, 0.458737f, 0.268049f,
445  0.468070f, 0.278617f, 0.461798f, 0.283441f, 0.584855f, 0.327708f, 0.573085f, 0.311386f,
446  0.579548f, 0.309340f, 0.590644f, 0.321516f, 0.461204f, 0.311233f, 0.467790f, 0.313081f,
447  0.456477f, 0.329961f, 0.450408f, 0.323919f, 0.573085f, 0.311386f, 0.568351f, 0.292904f,
448  0.577524f, 0.293776f, 0.579548f, 0.309340f, 0.462754f, 0.295432f, 0.471978f, 0.294282f,
449  0.467790f, 0.313081f, 0.461204f, 0.311233f, 0.568351f, 0.292904f, 0.571787f, 0.277295f,
450  0.578124f, 0.281900f, 0.577524f, 0.293776f, 0.461798f, 0.283441f, 0.468070f, 0.278617f,
451  0.471978f, 0.294282f, 0.462754f, 0.295432f, 0.521923f, 0.386009f, 0.553095f, 0.390512f,
452  0.553209f, 0.433063f, 0.523031f, 0.433628f, 0.492809f, 0.434538f, 0.490934f, 0.391862f,
453  0.521923f, 0.386009f, 0.523031f, 0.433628f, 0.553095f, 0.390512f, 0.604826f, 0.397804f,
454  0.609819f, 0.431516f, 0.553209f, 0.433063f, 0.435860f, 0.435740f, 0.439252f, 0.401540f,
455  0.490934f, 0.391862f, 0.492809f, 0.434538f, 0.604826f, 0.397804f, 0.626842f, 0.395792f,
456  0.648174f, 0.419316f, 0.609819f, 0.431516f, 0.396518f, 0.425416f, 0.416915f, 0.400552f,
457  0.439252f, 0.401540f, 0.435860f, 0.435740f, 0.626842f, 0.395792f, 0.662817f, 0.372521f,
458  0.692106f, 0.388274f, 0.648174f, 0.419316f, 0.350292f, 0.396229f, 0.379297f, 0.378686f,
459  0.416915f, 0.400552f, 0.396518f, 0.425416f, 0.662817f, 0.372521f, 0.697446f, 0.332673f,
460  0.726332f, 0.341754f, 0.692106f, 0.388274f, 0.312756f, 0.350588f, 0.341964f, 0.339667f,
461  0.379297f, 0.378686f, 0.350292f, 0.396229f, 0.697446f, 0.332673f, 0.707254f, 0.310054f,
462  0.735879f, 0.312112f, 0.726332f, 0.341754f, 0.301067f, 0.320593f, 0.330721f, 0.316853f,
463  0.341964f, 0.339667f, 0.312756f, 0.350588f, 0.707254f, 0.310054f, 0.715342f, 0.265392f,
464  0.729900f, 0.256393f, 0.735879f, 0.312112f, 0.304876f, 0.261087f, 0.320452f, 0.270303f,
465  0.330721f, 0.316853f, 0.301067f, 0.320593f, 0.715342f, 0.265392f, 0.676379f, 0.233241f,
466  0.698172f, 0.216906f, 0.729900f, 0.256393f, 0.337414f, 0.219179f, 0.360308f, 0.235899f,
467  0.320452f, 0.270303f, 0.304876f, 0.261087f, 0.676379f, 0.233241f, 0.647395f, 0.200502f,
468  0.663103f, 0.190671f, 0.698172f, 0.216906f, 0.373474f, 0.191872f, 0.389677f, 0.201890f,
469  0.360308f, 0.235899f, 0.337414f, 0.219179f, 0.626908f, 0.015608f, 0.649444f, 0.022378f,
470  0.660451f, 0.076084f, 0.621440f, 0.048089f, 0.376796f, 0.075296f, 0.388827f, 0.021586f,
471  0.411318f, 0.015131f, 0.416419f, 0.047631f, 0.567460f, 0.000144f, 0.626908f, 0.015608f,
472  0.621440f, 0.048089f, 0.577206f, 0.032801f, 0.416419f, 0.047631f, 0.411318f, 0.015131f,
473  0.470636f, 0.000144f, 0.460782f, 0.032656f, 0.518922f, 0.024886f, 0.567460f, 0.000144f,
474  0.577206f, 0.032801f, 0.547413f, 0.041724f, 0.460782f, 0.032656f, 0.470636f, 0.000144f,
475  0.518922f, 0.024886f, 0.490511f, 0.041669f, 0.540260f, 0.053805f, 0.518916f, 0.050294f,
476  0.518922f, 0.024886f, 0.547413f, 0.041724f, 0.518922f, 0.024886f, 0.518916f, 0.050294f,
477  0.497626f, 0.053770f, 0.490511f, 0.041669f, 0.551930f, 0.058338f, 0.540260f, 0.053805f,
478  0.547413f, 0.041724f, 0.558059f, 0.053871f, 0.490511f, 0.041669f, 0.497626f, 0.053770f,
479  0.485955f, 0.058273f, 0.479842f, 0.053785f, 0.555073f, 0.061900f, 0.551930f, 0.058338f,
480  0.558059f, 0.053871f, 0.576951f, 0.057998f, 0.479842f, 0.053785f, 0.485955f, 0.058273f,
481  0.482805f, 0.061829f, 0.460920f, 0.057845f, 0.563812f, 0.076586f, 0.555073f, 0.061900f,
482  0.576951f, 0.057998f, 0.611687f, 0.078268f, 0.460920f, 0.057845f, 0.482805f, 0.061829f,
483  0.474014f, 0.076511f, 0.425932f, 0.077985f, 0.576951f, 0.057998f, 0.577206f, 0.032801f,
484  0.621440f, 0.048089f, 0.611687f, 0.078268f, 0.416419f, 0.047631f, 0.460782f, 0.032656f,
485  0.460920f, 0.057845f, 0.425932f, 0.077985f, 0.576951f, 0.057998f, 0.558059f, 0.053871f,
486  0.547413f, 0.041724f, 0.577206f, 0.032801f, 0.490511f, 0.041669f, 0.479842f, 0.053785f,
487  0.460920f, 0.057845f, 0.460782f, 0.032656f, 0.626663f, 0.111357f, 0.611687f, 0.078268f,
488  0.621440f, 0.048089f, 0.660451f, 0.076084f, 0.416419f, 0.047631f, 0.425932f, 0.077985f,
489  0.410618f, 0.111244f, 0.376796f, 0.075296f, 0.583135f, 0.108495f, 0.563812f, 0.076586f,
490  0.611687f, 0.078268f, 0.626663f, 0.111357f, 0.425932f, 0.077985f, 0.474014f, 0.076511f,
491  0.454527f, 0.108481f, 0.410618f, 0.111244f, 0.596138f, 0.133426f, 0.629482f, 0.130456f,
492  0.623495f, 0.146796f, 0.601169f, 0.147885f, 0.413741f, 0.147158f, 0.407648f, 0.130594f,
493  0.441395f, 0.133592f, 0.436337f, 0.148194f, 0.583135f, 0.108495f, 0.626663f, 0.111357f,
494  0.629482f, 0.130456f, 0.596138f, 0.133426f, 0.407648f, 0.130594f, 0.410618f, 0.111244f,
495  0.454527f, 0.108481f, 0.441395f, 0.133592f, 0.605512f, 0.165134f, 0.601169f, 0.147885f,
496  0.623495f, 0.146796f, 0.619303f, 0.159841f, 0.413741f, 0.147158f, 0.436337f, 0.148194f,
497  0.432024f, 0.165644f, 0.418035f, 0.160361f, 0.605512f, 0.165134f, 0.619303f, 0.159841f,
498  0.663103f, 0.190671f, 0.647395f, 0.200502f, 0.373474f, 0.191872f, 0.418035f, 0.160361f,
499  0.432024f, 0.165644f, 0.389677f, 0.201890f, 0.945900f, 0.079569f, 0.886245f, 0.121777f,
500  0.849114f, 0.099732f, 0.891780f, 0.036916f, 0.183115f, 0.092127f, 0.141314f, 0.112482f,
501  0.078961f, 0.060719f, 0.142277f, 0.021467f, 0.891780f, 0.036916f, 0.849114f, 0.099732f,
502  0.788458f, 0.080826f, 0.805584f, 0.010786f, 0.246353f, 0.076510f, 0.183115f, 0.092127f,
503  0.142277f, 0.021467f, 0.232648f, 0.003484f, 0.805584f, 0.010786f, 0.788458f, 0.080826f,
504  0.687018f, 0.077204f, 0.672384f, 0.022201f, 0.349875f, 0.075955f, 0.246353f, 0.076510f,
505  0.232648f, 0.003484f, 0.365979f, 0.020991f, 0.672384f, 0.022201f, 0.687018f, 0.077204f,
506  0.660451f, 0.076084f, 0.649444f, 0.022378f, 0.376796f, 0.075296f, 0.349875f, 0.075955f,
507  0.365979f, 0.020991f, 0.388827f, 0.021586f, 0.626663f, 0.111357f, 0.660451f, 0.076084f,
508  0.687018f, 0.077204f, 0.629482f, 0.130456f, 0.349875f, 0.075955f, 0.376796f, 0.075296f,
509  0.410618f, 0.111244f, 0.407648f, 0.130594f, 0.729900f, 0.256393f, 0.698172f, 0.216906f,
510  0.760215f, 0.193244f, 0.789046f, 0.233323f, 0.271553f, 0.193871f, 0.337414f, 0.219179f,
511  0.304876f, 0.261087f, 0.241255f, 0.236977f, 0.994525f, 0.167705f, 0.909112f, 0.183261f,
512  0.886245f, 0.121777f, 0.945900f, 0.079569f, 0.141314f, 0.112482f, 0.107928f, 0.179083f,
513  0.011829f, 0.155367f, 0.078961f, 0.060719f, 0.911671f, 0.402429f, 0.862868f, 0.338556f,
514  0.894128f, 0.301884f, 0.962901f, 0.344752f, 0.123776f, 0.315519f, 0.160557f, 0.356821f,
515  0.106400f, 0.432652f, 0.043968f, 0.367038f, 0.962901f, 0.344752f, 0.894128f, 0.301884f,
516  0.915360f, 0.259804f, 0.999856f, 0.254640f, 0.098965f, 0.266968f, 0.123776f, 0.315519f,
517  0.043968f, 0.367038f, 0.000144f, 0.259113f, 0.999856f, 0.254640f, 0.915360f, 0.259804f,
518  0.909112f, 0.183261f, 0.994525f, 0.167705f, 0.107928f, 0.179083f, 0.098965f, 0.266968f,
519  0.000144f, 0.259113f, 0.011829f, 0.155367f, 0.749542f, 0.334683f, 0.735879f, 0.312112f,
520  0.766337f, 0.300809f, 0.789162f, 0.313727f, 0.267408f, 0.310142f, 0.301067f, 0.320593f,
521  0.288183f, 0.346496f, 0.242992f, 0.325552f, 0.789162f, 0.313727f, 0.766337f, 0.300809f,
522  0.815314f, 0.276388f, 0.846174f, 0.293397f, 0.213065f, 0.285164f, 0.267408f, 0.310142f,
523  0.242992f, 0.325552f, 0.178537f, 0.304983f, 0.846174f, 0.293397f, 0.815314f, 0.276388f,
524  0.845007f, 0.256352f, 0.873517f, 0.265922f, 0.179662f, 0.263312f, 0.213065f, 0.285164f,
525  0.178537f, 0.304983f, 0.147089f, 0.274284f, 0.873517f, 0.265922f, 0.845007f, 0.256352f,
526  0.859075f, 0.228168f, 0.886999f, 0.233769f, 0.162803f, 0.231720f, 0.179662f, 0.263312f,
527  0.147089f, 0.274284f, 0.131514f, 0.237587f, 0.842355f, 0.195160f, 0.875030f, 0.184705f,
528  0.886999f, 0.233769f, 0.859075f, 0.228168f, 0.131514f, 0.237587f, 0.145224f, 0.182749f,
529  0.176788f, 0.196179f, 0.162803f, 0.231720f, 0.909112f, 0.183261f, 0.915360f, 0.259804f,
530  0.886999f, 0.233769f, 0.875030f, 0.184705f, 0.131514f, 0.237587f, 0.098965f, 0.266968f,
531  0.107928f, 0.179083f, 0.145224f, 0.182749f, 0.915360f, 0.259804f, 0.894128f, 0.301884f,
532  0.873517f, 0.265922f, 0.886999f, 0.233769f, 0.147089f, 0.274284f, 0.123776f, 0.315519f,
533  0.098965f, 0.266968f, 0.131514f, 0.237587f, 0.894128f, 0.301884f, 0.862868f, 0.338556f,
534  0.846174f, 0.293397f, 0.873517f, 0.265922f, 0.178537f, 0.304983f, 0.160557f, 0.356821f,
535  0.123776f, 0.315519f, 0.147089f, 0.274284f, 0.862868f, 0.338556f, 0.794286f, 0.364062f,
536  0.789162f, 0.313727f, 0.846174f, 0.293397f, 0.242992f, 0.325552f, 0.239776f, 0.382592f,
537  0.160557f, 0.356821f, 0.178537f, 0.304983f, 0.770185f, 0.379538f, 0.749542f, 0.334683f,
538  0.789162f, 0.313727f, 0.794286f, 0.364062f, 0.242992f, 0.325552f, 0.288183f, 0.346496f,
539  0.268122f, 0.398737f, 0.239776f, 0.382592f, 0.845499f, 0.449967f, 0.794286f, 0.364062f,
540  0.862868f, 0.338556f, 0.911671f, 0.402429f, 0.160557f, 0.356821f, 0.239776f, 0.382592f,
541  0.185281f, 0.484099f, 0.106400f, 0.432652f, 0.815858f, 0.445381f, 0.770572f, 0.444261f,
542  0.755700f, 0.418603f, 0.770185f, 0.379538f, 0.287033f, 0.442912f, 0.271364f, 0.473316f,
543  0.219260f, 0.477186f, 0.268122f, 0.398737f, 0.815858f, 0.445381f, 0.770185f, 0.379538f,
544  0.794286f, 0.364062f, 0.845499f, 0.449967f, 0.239776f, 0.382592f, 0.268122f, 0.398737f,
545  0.219260f, 0.477186f, 0.185281f, 0.484099f, 0.819845f, 0.468071f, 0.815858f, 0.445381f,
546  0.845499f, 0.449967f, 0.185281f, 0.484099f, 0.219260f, 0.477186f, 0.215894f, 0.503605f,
547  0.735879f, 0.312112f, 0.729900f, 0.256393f, 0.789046f, 0.233323f, 0.766337f, 0.300809f,
548  0.241255f, 0.236977f, 0.304876f, 0.261087f, 0.301067f, 0.320593f, 0.267408f, 0.310142f,
549  0.789046f, 0.233323f, 0.809631f, 0.233887f, 0.815314f, 0.276388f, 0.766337f, 0.300809f,
550  0.213065f, 0.285164f, 0.219168f, 0.237388f, 0.241255f, 0.236977f, 0.267408f, 0.310142f,
551  0.809631f, 0.233887f, 0.829287f, 0.219562f, 0.845007f, 0.256352f, 0.815314f, 0.276388f,
552  0.179662f, 0.263312f, 0.199067f, 0.222464f, 0.219168f, 0.237388f, 0.213065f, 0.285164f,
553  0.842355f, 0.195160f, 0.859075f, 0.228168f, 0.845007f, 0.256352f, 0.829287f, 0.219562f,
554  0.179662f, 0.263312f, 0.162803f, 0.231720f, 0.176788f, 0.196179f, 0.199067f, 0.222464f,
555  0.687018f, 0.077204f, 0.788458f, 0.080826f, 0.786480f, 0.117591f, 0.715482f, 0.139727f,
556  0.246666f, 0.114850f, 0.246353f, 0.076510f, 0.349875f, 0.075955f, 0.319538f, 0.139409f,
557  0.760215f, 0.193244f, 0.715482f, 0.139727f, 0.786480f, 0.117591f, 0.785486f, 0.152330f,
558  0.246666f, 0.114850f, 0.319538f, 0.139409f, 0.271553f, 0.193871f, 0.245969f, 0.151002f,
559  0.698172f, 0.216906f, 0.663103f, 0.190671f, 0.715482f, 0.139727f, 0.760215f, 0.193244f,
560  0.319538f, 0.139409f, 0.373474f, 0.191872f, 0.337414f, 0.219179f, 0.271553f, 0.193871f,
561  0.663103f, 0.190671f, 0.623495f, 0.146796f, 0.629482f, 0.130456f, 0.715482f, 0.139727f,
562  0.407648f, 0.130594f, 0.413741f, 0.147158f, 0.373474f, 0.191872f, 0.319538f, 0.139409f,
563  0.629482f, 0.130456f, 0.687018f, 0.077204f, 0.715482f, 0.139727f, 0.319538f, 0.139409f,
564  0.349875f, 0.075955f, 0.407648f, 0.130594f, 0.663103f, 0.190671f, 0.619303f, 0.159841f,
565  0.623495f, 0.146796f, 0.413741f, 0.147158f, 0.418035f, 0.160361f, 0.373474f, 0.191872f,
566  0.842355f, 0.195160f, 0.837382f, 0.156361f, 0.858171f, 0.137775f, 0.875030f, 0.184705f,
567  0.171653f, 0.132294f, 0.196622f, 0.155241f, 0.176788f, 0.196179f, 0.145224f, 0.182749f,
568  0.909112f, 0.183261f, 0.875030f, 0.184705f, 0.858171f, 0.137775f, 0.886245f, 0.121777f,
569  0.171653f, 0.132294f, 0.145224f, 0.182749f, 0.107928f, 0.179083f, 0.141314f, 0.112482f,
570  0.785486f, 0.152330f, 0.786480f, 0.117591f, 0.858171f, 0.137775f, 0.837382f, 0.156361f,
571  0.171653f, 0.132294f, 0.246666f, 0.114850f, 0.245969f, 0.151002f, 0.196622f, 0.155241f,
572  0.788458f, 0.080826f, 0.849114f, 0.099732f, 0.858171f, 0.137775f, 0.786480f, 0.117591f,
573  0.171653f, 0.132294f, 0.183115f, 0.092127f, 0.246353f, 0.076510f, 0.246666f, 0.114850f,
574  0.886245f, 0.121777f, 0.858171f, 0.137775f, 0.849114f, 0.099732f, 0.183115f, 0.092127f,
575  0.171653f, 0.132294f, 0.141314f, 0.112482f, 0.506166f, 0.904851f, 0.432388f, 0.894943f,
576  0.438797f, 0.870229f, 0.491058f, 0.881714f, 0.315867f, 0.868209f, 0.321637f, 0.893225f,
577  0.247207f, 0.901159f, 0.263032f, 0.878321f, 0.506166f, 0.904851f, 0.491058f, 0.881714f,
578  0.572792f, 0.860484f, 0.604825f, 0.879946f, 0.181486f, 0.854693f, 0.263032f, 0.878321f,
579  0.247207f, 0.901159f, 0.148729f, 0.873349f, 0.604825f, 0.879946f, 0.572792f, 0.860484f,
580  0.586396f, 0.793977f, 0.619962f, 0.791615f, 0.169745f, 0.787474f, 0.181486f, 0.854693f,
581  0.148729f, 0.873349f, 0.136063f, 0.784093f, 0.619962f, 0.791615f, 0.586396f, 0.793977f,
582  0.549027f, 0.746412f, 0.563786f, 0.739211f, 0.208656f, 0.740879f, 0.169745f, 0.787474f,
583  0.136063f, 0.784093f, 0.194086f, 0.733241f, 0.563786f, 0.739211f, 0.549027f, 0.746412f,
584  0.500314f, 0.711729f, 0.508270f, 0.697693f, 0.258399f, 0.707497f, 0.208656f, 0.740879f,
585  0.194086f, 0.733241f, 0.250811f, 0.693249f, 0.508270f, 0.697693f, 0.500314f, 0.711729f,
586  0.438641f, 0.680683f, 0.434803f, 0.658882f, 0.320962f, 0.677959f, 0.258399f, 0.707497f,
587  0.250811f, 0.693249f, 0.325318f, 0.656224f, 0.500314f, 0.711729f, 0.505666f, 0.730944f,
588  0.452955f, 0.700023f, 0.438641f, 0.680683f, 0.306136f, 0.696976f, 0.252524f, 0.726592f,
589  0.258399f, 0.707497f, 0.320962f, 0.677959f, 0.549027f, 0.746412f, 0.542850f, 0.755753f,
590  0.505666f, 0.730944f, 0.500314f, 0.711729f, 0.252524f, 0.726592f, 0.214575f, 0.750414f,
591  0.208656f, 0.740879f, 0.258399f, 0.707497f, 0.586396f, 0.793977f, 0.568148f, 0.787367f,
592  0.542850f, 0.755753f, 0.549027f, 0.746412f, 0.214575f, 0.750414f, 0.188269f, 0.781375f,
593  0.169745f, 0.787474f, 0.208656f, 0.740879f, 0.572792f, 0.860484f, 0.555495f, 0.826352f,
594  0.568148f, 0.787367f, 0.586396f, 0.793977f, 0.188269f, 0.781375f, 0.199850f, 0.820889f,
595  0.181486f, 0.854693f, 0.169745f, 0.787474f, 0.491058f, 0.881714f, 0.501231f, 0.844356f,
596  0.555495f, 0.826352f, 0.572792f, 0.860484f, 0.199850f, 0.820889f, 0.253846f, 0.840502f,
597  0.263032f, 0.878321f, 0.181486f, 0.854693f, 0.491058f, 0.881714f, 0.438797f, 0.870229f,
598  0.457832f, 0.840040f, 0.501231f, 0.844356f, 0.297562f, 0.837358f, 0.315867f, 0.868209f,
599  0.263032f, 0.878321f, 0.253846f, 0.840502f, 0.760215f, 0.193244f, 0.785486f, 0.152330f,
600  0.796021f, 0.176969f, 0.783193f, 0.187449f, 0.233625f, 0.175620f, 0.245969f, 0.151002f,
601  0.271553f, 0.193871f, 0.246955f, 0.187075f, 0.391039f, 0.611891f, 0.434803f, 0.658882f,
602  0.438641f, 0.680683f, 0.394766f, 0.686125f, 0.320962f, 0.677959f, 0.325318f, 0.656224f,
603  0.369913f, 0.610196f, 0.364838f, 0.684445f, 0.789046f, 0.233323f, 0.760215f, 0.193244f,
604  0.783193f, 0.187449f, 0.809631f, 0.233887f, 0.246955f, 0.187075f, 0.271553f, 0.193871f,
605  0.241255f, 0.236977f, 0.219168f, 0.237388f, 0.391747f, 0.862097f, 0.401605f, 0.841460f,
606  0.438797f, 0.870229f, 0.432388f, 0.894943f, 0.315867f, 0.868209f, 0.354026f, 0.840297f,
607  0.363377f, 0.861308f, 0.321637f, 0.893225f, 0.438641f, 0.680683f, 0.452955f, 0.700023f,
608  0.435018f, 0.718280f, 0.394766f, 0.686125f, 0.323658f, 0.715731f, 0.306136f, 0.696976f,
609  0.320962f, 0.677959f, 0.364838f, 0.684445f, 0.433669f, 0.729661f, 0.384658f, 0.710299f,
610  0.394766f, 0.686125f, 0.435018f, 0.718280f, 0.364838f, 0.684445f, 0.374400f, 0.708969f,
611  0.324726f, 0.727177f, 0.323658f, 0.715731f, 0.410995f, 0.747662f, 0.384658f, 0.710299f,
612  0.433669f, 0.729661f, 0.427812f, 0.742828f, 0.324726f, 0.727177f, 0.374400f, 0.708969f,
613  0.347028f, 0.745816f, 0.330270f, 0.740536f, 0.418086f, 0.784946f, 0.384657f, 0.795423f,
614  0.384658f, 0.710299f, 0.410995f, 0.747662f, 0.374400f, 0.708969f, 0.372270f, 0.794472f,
615  0.338952f, 0.783073f, 0.347028f, 0.745816f, 0.401605f, 0.841460f, 0.384657f, 0.795423f,
616  0.418086f, 0.784946f, 0.431333f, 0.817535f, 0.338952f, 0.783073f, 0.372270f, 0.794472f,
617  0.354026f, 0.840297f, 0.324790f, 0.815460f, 0.438797f, 0.870229f, 0.401605f, 0.841460f,
618  0.431333f, 0.817535f, 0.457832f, 0.840040f, 0.324790f, 0.815460f, 0.354026f, 0.840297f,
619  0.315867f, 0.868209f, 0.297562f, 0.837358f, 0.809631f, 0.233887f, 0.816266f, 0.203086f,
620  0.825107f, 0.209762f, 0.829287f, 0.219562f, 0.199767f, 0.214827f, 0.209828f, 0.206161f,
621  0.219168f, 0.237388f, 0.199067f, 0.222464f, 0.809631f, 0.233887f, 0.783193f, 0.187449f,
622  0.802192f, 0.184609f, 0.816266f, 0.203086f, 0.226485f, 0.183086f, 0.246955f, 0.187075f,
623  0.219168f, 0.237388f, 0.209828f, 0.206161f, 0.783193f, 0.187449f, 0.796021f, 0.176969f,
624  0.802192f, 0.184609f, 0.226485f, 0.183086f, 0.233625f, 0.175620f, 0.246955f, 0.187075f,
625  0.457832f, 0.840040f, 0.431333f, 0.817535f, 0.448505f, 0.804621f, 0.473386f, 0.824700f,
626  0.307886f, 0.802031f, 0.324790f, 0.815460f, 0.297562f, 0.837358f, 0.282357f, 0.821525f,
627  0.431333f, 0.817535f, 0.418086f, 0.784946f, 0.435868f, 0.779569f, 0.448505f, 0.804621f,
628  0.321237f, 0.777208f, 0.338952f, 0.783073f, 0.324790f, 0.815460f, 0.307886f, 0.802031f,
629  0.418086f, 0.784946f, 0.410995f, 0.747662f, 0.423718f, 0.754191f, 0.435868f, 0.779569f,
630  0.334089f, 0.752045f, 0.347028f, 0.745816f, 0.338952f, 0.783073f, 0.321237f, 0.777208f,
631  0.410995f, 0.747662f, 0.427812f, 0.742828f, 0.437950f, 0.749777f, 0.423718f, 0.754191f,
632  0.319919f, 0.747250f, 0.330270f, 0.740536f, 0.347028f, 0.745816f, 0.334089f, 0.752045f,
633  0.427812f, 0.742828f, 0.433669f, 0.729661f, 0.445392f, 0.731997f, 0.437950f, 0.749777f,
634  0.312907f, 0.729222f, 0.324726f, 0.727177f, 0.330270f, 0.740536f, 0.319919f, 0.747250f,
635  0.433669f, 0.729661f, 0.435018f, 0.718280f, 0.440995f, 0.724383f, 0.445392f, 0.731997f,
636  0.317510f, 0.721697f, 0.323658f, 0.715731f, 0.324726f, 0.727177f, 0.312907f, 0.729222f,
637  0.435018f, 0.718280f, 0.452955f, 0.700023f, 0.455277f, 0.713731f, 0.440995f, 0.724383f,
638  0.303460f, 0.710657f, 0.306136f, 0.696976f, 0.323658f, 0.715731f, 0.317510f, 0.721697f,
639  0.501231f, 0.844356f, 0.457832f, 0.840040f, 0.473386f, 0.824700f, 0.512485f, 0.828811f,
640  0.282357f, 0.821525f, 0.297562f, 0.837358f, 0.253846f, 0.840502f, 0.242975f, 0.824574f,
641  0.555495f, 0.826352f, 0.501231f, 0.844356f, 0.512485f, 0.828811f, 0.550942f, 0.811814f,
642  0.242975f, 0.824574f, 0.253846f, 0.840502f, 0.199850f, 0.820889f, 0.204839f, 0.806417f,
643  0.568148f, 0.787367f, 0.555495f, 0.826352f, 0.550942f, 0.811814f, 0.552139f, 0.787682f,
644  0.204839f, 0.806417f, 0.199850f, 0.820889f, 0.188269f, 0.781375f, 0.204331f, 0.782156f,
645  0.542850f, 0.755753f, 0.568148f, 0.787367f, 0.552139f, 0.787682f, 0.539407f, 0.764539f,
646  0.204331f, 0.782156f, 0.188269f, 0.781375f, 0.214575f, 0.750414f, 0.217774f, 0.759319f,
647  0.505666f, 0.730944f, 0.542850f, 0.755753f, 0.539407f, 0.764539f, 0.508439f, 0.743135f,
648  0.217774f, 0.759319f, 0.214575f, 0.750414f, 0.252524f, 0.726592f, 0.249419f, 0.738732f,
649  0.452955f, 0.700023f, 0.505666f, 0.730944f, 0.508439f, 0.743135f, 0.455277f, 0.713731f,
650  0.249419f, 0.738732f, 0.252524f, 0.726592f, 0.306136f, 0.696976f, 0.303460f, 0.710657f,
651  0.437950f, 0.749777f, 0.445392f, 0.731997f, 0.470841f, 0.748408f, 0.454776f, 0.761665f,
652  0.286960f, 0.745020f, 0.312907f, 0.729222f, 0.319919f, 0.747250f, 0.302729f, 0.758742f,
653  0.454776f, 0.761665f, 0.470841f, 0.748408f, 0.488870f, 0.770464f, 0.475403f, 0.783904f,
654  0.268291f, 0.766661f, 0.286960f, 0.745020f, 0.302729f, 0.758742f, 0.281439f, 0.780511f,
655  0.475403f, 0.783904f, 0.488870f, 0.770464f, 0.503673f, 0.787562f, 0.494476f, 0.802470f,
656  0.252972f, 0.783410f, 0.268291f, 0.766661f, 0.281439f, 0.780511f, 0.261790f, 0.798626f,
657  0.494476f, 0.802470f, 0.503673f, 0.787562f, 0.518562f, 0.791602f, 0.516802f, 0.807339f,
658  0.237920f, 0.787045f, 0.252972f, 0.783410f, 0.261790f, 0.798626f, 0.239243f, 0.802891f,
659  0.512485f, 0.828811f, 0.473386f, 0.824700f, 0.494476f, 0.802470f, 0.516802f, 0.807339f,
660  0.261790f, 0.798626f, 0.282357f, 0.821525f, 0.242975f, 0.824574f, 0.239243f, 0.802891f,
661  0.448505f, 0.804621f, 0.475403f, 0.783904f, 0.494476f, 0.802470f, 0.473386f, 0.824700f,
662  0.261790f, 0.798626f, 0.281439f, 0.780511f, 0.307886f, 0.802031f, 0.282357f, 0.821525f,
663  0.448505f, 0.804621f, 0.435868f, 0.779569f, 0.454776f, 0.761665f, 0.475403f, 0.783904f,
664  0.302729f, 0.758742f, 0.321237f, 0.777208f, 0.307886f, 0.802031f, 0.281439f, 0.780511f,
665  0.437950f, 0.749777f, 0.454776f, 0.761665f, 0.435868f, 0.779569f, 0.423718f, 0.754191f,
666  0.321237f, 0.777208f, 0.302729f, 0.758742f, 0.319919f, 0.747250f, 0.334089f, 0.752045f,
667  0.440995f, 0.724383f, 0.455277f, 0.713731f, 0.470841f, 0.748408f, 0.445392f, 0.731997f,
668  0.286960f, 0.745020f, 0.303460f, 0.710657f, 0.317510f, 0.721697f, 0.312907f, 0.729222f,
669  0.508439f, 0.743135f, 0.488870f, 0.770464f, 0.470841f, 0.748408f, 0.455277f, 0.713731f,
670  0.286960f, 0.745020f, 0.268291f, 0.766661f, 0.249419f, 0.738732f, 0.303460f, 0.710657f,
671  0.539407f, 0.764539f, 0.503673f, 0.787562f, 0.488870f, 0.770464f, 0.508439f, 0.743135f,
672  0.268291f, 0.766661f, 0.252972f, 0.783410f, 0.217774f, 0.759319f, 0.249419f, 0.738732f,
673  0.552139f, 0.787682f, 0.518562f, 0.791602f, 0.503673f, 0.787562f, 0.539407f, 0.764539f,
674  0.252972f, 0.783410f, 0.237920f, 0.787045f, 0.204331f, 0.782156f, 0.217774f, 0.759319f,
675  0.550942f, 0.811814f, 0.516802f, 0.807339f, 0.518562f, 0.791602f, 0.552139f, 0.787682f,
676  0.237920f, 0.787045f, 0.239243f, 0.802891f, 0.204839f, 0.806417f, 0.204331f, 0.782156f,
677  0.512485f, 0.828811f, 0.516802f, 0.807339f, 0.550942f, 0.811814f, 0.204839f, 0.806417f,
678  0.239243f, 0.802891f, 0.242975f, 0.824574f, 0.508270f, 0.697693f, 0.434803f, 0.658882f,
679  0.484068f, 0.628776f, 0.543385f, 0.683538f, 0.276936f, 0.625067f, 0.325318f, 0.656224f,
680  0.250811f, 0.693249f, 0.216123f, 0.678120f, 0.563786f, 0.739211f, 0.508270f, 0.697693f,
681  0.543385f, 0.683538f, 0.581052f, 0.726933f, 0.216123f, 0.678120f, 0.250811f, 0.693249f,
682  0.194086f, 0.733241f, 0.177176f, 0.720426f, 0.619962f, 0.791615f, 0.563786f, 0.739211f,
683  0.581052f, 0.726933f, 0.616701f, 0.759965f, 0.177176f, 0.720426f, 0.194086f, 0.733241f,
684  0.136063f, 0.784093f, 0.140379f, 0.752377f, 0.707492f, 0.759884f, 0.619962f, 0.791615f,
685  0.616701f, 0.759965f, 0.660647f, 0.741167f, 0.140379f, 0.752377f, 0.136063f, 0.784093f,
686  0.049526f, 0.748824f, 0.097038f, 0.732052f, 0.745511f, 0.652100f, 0.707492f, 0.759884f,
687  0.660647f, 0.741167f, 0.677256f, 0.670436f, 0.097038f, 0.732052f, 0.049526f, 0.748824f,
688  0.019409f, 0.639749f, 0.083564f, 0.662038f, 0.740843f, 0.572428f, 0.745511f, 0.652100f,
689  0.677256f, 0.670436f, 0.671403f, 0.592656f, 0.083564f, 0.662038f, 0.019409f, 0.639749f,
690  0.033664f, 0.564403f, 0.092820f, 0.589862f, 0.677256f, 0.670436f, 0.543385f, 0.683538f,
691  0.484068f, 0.628776f, 0.671403f, 0.592656f, 0.276936f, 0.625067f, 0.216123f, 0.678120f,
692  0.083564f, 0.662038f, 0.092820f, 0.589862f, 0.677256f, 0.670436f, 0.660647f, 0.741167f,
693  0.581052f, 0.726933f, 0.543385f, 0.683538f, 0.177176f, 0.720426f, 0.097038f, 0.732052f,
694  0.083564f, 0.662038f, 0.216123f, 0.678120f, 0.660647f, 0.741167f, 0.616701f, 0.759965f,
695  0.581052f, 0.726933f, 0.177176f, 0.720426f, 0.140379f, 0.752377f, 0.097038f, 0.732052f,
696  0.842355f, 0.195160f, 0.829287f, 0.219562f, 0.834578f, 0.206879f, 0.834705f, 0.206959f,
697  0.033664f, 0.564403f, 0.051216f, 0.522659f, 0.145041f, 0.562595f, 0.092820f, 0.589862f,
698  0.620420f, 0.565675f, 0.671403f, 0.592656f, 0.484068f, 0.628776f, 0.498072f, 0.552315f,
699  0.276936f, 0.625067f, 0.092820f, 0.589862f, 0.145041f, 0.562595f, 0.264218f, 0.550140f,
700  0.391039f, 0.611891f, 0.498072f, 0.552315f, 0.484068f, 0.628776f, 0.434803f, 0.658882f,
701  0.276936f, 0.625067f, 0.264218f, 0.550140f, 0.369913f, 0.610196f, 0.325318f, 0.656224f,
702 };
703 
704 #define VERT_MARK 1
705 
706 #define EDGE_ORIG 1
707 #define EDGE_MARK 2
708 
709 #define FACE_MARK 1
710 #define FACE_NEW 2
711 
713 {
714  BMOpSlot *slot_verts_out = BMO_slot_get(op->slots_out, "verts.out");
715 
716  const float dia = BMO_slot_float_get(op->slots_in, "size");
717  const uint xtot = max_ii(1, BMO_slot_int_get(op->slots_in, "x_segments"));
718  const uint ytot = max_ii(1, BMO_slot_int_get(op->slots_in, "y_segments"));
719  const float xtot_inv2 = 2.0f / (xtot);
720  const float ytot_inv2 = 2.0f / (ytot);
721 
722  const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
723  const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
724 
725  BMVert **varr;
726  BMVert *vquad[4];
727 
728  float mat[4][4];
729  float vec[3], tvec[3];
730 
731  uint x, y, i;
732 
733  BMO_slot_mat4_get(op->slots_in, "matrix", mat);
734 
735  BMO_slot_buffer_alloc(op, op->slots_out, "verts.out", (xtot + 1) * (ytot + 1));
736  varr = (BMVert **)slot_verts_out->data.buf;
737 
738  i = 0;
739  vec[2] = 0.0f;
740  for (y = 0; y <= ytot; y++) {
741  vec[1] = ((y * ytot_inv2) - 1.0f) * dia;
742  for (x = 0; x <= xtot; x++) {
743  vec[0] = ((x * xtot_inv2) - 1.0f) * dia;
744  mul_v3_m4v3(tvec, mat, vec);
745  varr[i] = BM_vert_create(bm, tvec, NULL, BM_CREATE_NOP);
746  BMO_vert_flag_enable(bm, varr[i], VERT_MARK);
747  i++;
748  }
749  }
750 
751 #define XY(_x, _y) ((_x) + ((_y) * (xtot + 1)))
752 
753  for (y = 1; y <= ytot; y++) {
754  for (x = 1; x <= xtot; x++) {
755  BMFace *f;
756 
757  vquad[0] = varr[XY(x - 1, y - 1)];
758  vquad[1] = varr[XY(x, y - 1)];
759  vquad[2] = varr[XY(x, y)];
760  vquad[3] = varr[XY(x - 1, y)];
761 
762  f = BM_face_create_verts(bm, vquad, 4, NULL, BM_CREATE_NOP, true);
763  if (calc_uvs) {
765  }
766  }
767  }
768 
769 #undef XY
770 
771  if (calc_uvs) {
772  BM_mesh_calc_uvs_grid(bm, xtot, ytot, FACE_MARK, cd_loop_uv_offset);
773  }
774 }
775 
777  const uint x_segments,
778  const uint y_segments,
779  const short oflag,
780  const int cd_loop_uv_offset)
781 {
782  BMFace *f;
783  BMLoop *l;
784  BMIter iter, liter;
785 
786  const float dx = 1.0f / (float)(x_segments);
787  const float dy = 1.0f / (float)(y_segments);
788  const float dx_wrap = 1.0 - (dx / 2.0f);
789  float x = 0.0f;
790  float y = dy;
791 
792  int loop_index;
793 
794  BLI_assert(cd_loop_uv_offset != -1);
795 
796  BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
797  if (!BMO_face_flag_test(bm, f, oflag)) {
798  continue;
799  }
800 
801  BM_ITER_ELEM_INDEX (l, &liter, f, BM_LOOPS_OF_FACE, loop_index) {
802  MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
803 
804  switch (loop_index) {
805  case 0:
806  y -= dy;
807  break;
808  case 1:
809  x += dx;
810  break;
811  case 2:
812  y += dy;
813  break;
814  case 3:
815  x -= dx;
816  break;
817  default:
818  break;
819  }
820 
821  luv->uv[0] = x;
822  luv->uv[1] = y;
823  }
824 
825  x += dx;
826  if (x >= dx_wrap) {
827  x = 0.0f;
828  y += dy;
829  }
830  }
831 }
832 
834 {
835  const float rad = BMO_slot_float_get(op->slots_in, "radius");
836  const int seg = BMO_slot_int_get(op->slots_in, "u_segments");
837  const int tot = BMO_slot_int_get(op->slots_in, "v_segments");
838 
839  const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
840  const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
841 
842  BMOperator bmop, prevop;
843  BMVert *eve, *preveve;
844  BMEdge *e;
845  BMIter iter;
846  const float axis[3] = {0, 0, 1};
847  float vec[3], mat[4][4], cmat[3][3];
848  int a;
849 
850  BMO_slot_mat4_get(op->slots_in, "matrix", mat);
851 
852  const float phid = (float)M_PI / tot;
853  /* phi = 0.25f * (float)M_PI; */ /* UNUSED */
854 
855  /* one segment first */
856  for (a = 0; a <= tot; a++) {
857  /* Going in this direction, then edge extruding, makes normals face outward */
858  float sin_phi, cos_phi;
859  sin_cos_from_fraction(a, 2 * tot, &sin_phi, &cos_phi);
860 
861  vec[0] = 0.0f;
862  vec[1] = rad * sin_phi;
863  vec[2] = rad * cos_phi;
864  eve = BM_vert_create(bm, vec, NULL, BM_CREATE_NOP);
866 
867  if (a != 0) {
868  e = BM_edge_create(bm, preveve, eve, NULL, BM_CREATE_NOP);
870  }
871 
872  preveve = eve;
873  }
874 
875  /* extrude and rotate; negative phi to make normals face outward */
876  axis_angle_to_mat3(cmat, axis, -(M_PI * 2) / seg);
877 
878  for (a = 0; a < seg; a++) {
879  if (a) {
880  BMO_op_initf(bm, &bmop, op->flag, "extrude_edge_only edges=%S", &prevop, "geom.out");
881  BMO_op_exec(bm, &bmop);
882  BMO_op_finish(bm, &prevop);
883  }
884  else {
885  BMO_op_initf(bm, &bmop, op->flag, "extrude_edge_only edges=%fe", EDGE_ORIG);
886  BMO_op_exec(bm, &bmop);
887  }
888 
890  BMO_op_callf(bm, op->flag, "rotate cent=%v matrix=%m3 verts=%S", vec, cmat, &bmop, "geom.out");
891 
892  prevop = bmop;
893  }
894 
895  if (a) {
896  BMO_op_finish(bm, &bmop);
897  }
898 
899  {
900  float len, len2, vec2[3];
901 
902  len = 2 * rad * sinf(phid / 2.0f);
903 
904  /* Length of one segment in shortest parallel. */
905  vec[0] = rad * sinf(phid);
906  vec[1] = 0.0f;
907  vec[2] = rad * cosf(phid);
908 
909  mul_v3_m3v3(vec2, cmat, vec);
910  len2 = len_v3v3(vec, vec2);
911 
912  /* use shortest segment length divided by 3 as merge threshold */
913  BMO_op_callf(
914  bm, op->flag, "remove_doubles verts=%fv dist=%f", VERT_MARK, min_ff(len, len2) / 3.0f);
915  }
916 
917  if (calc_uvs) {
918  BMFace *f;
919  BMLoop *l;
920  BMIter fiter, liter;
921 
922  /* We cannot tag faces for UVs computing above,
923  * so we have to do it now, based on all its vertices being tagged. */
924  BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
925  bool valid = true;
926 
927  BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
928  if (!BMO_vert_flag_test(bm, l->v, VERT_MARK)) {
929  valid = false;
930  break;
931  }
932  }
933 
934  if (valid) {
936  }
937  }
938 
939  BM_mesh_calc_uvs_sphere(bm, FACE_MARK, cd_loop_uv_offset);
940  }
941 
942  /* Now apply the inverse matrix. */
943  BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
944  if (BMO_vert_flag_test(bm, eve, VERT_MARK)) {
945  mul_m4_v3(mat, eve->co);
946  }
947  }
948 
950 }
951 
953 {
954  const float rad = BMO_slot_float_get(op->slots_in, "radius");
955  const float rad_div = rad / 200.0f;
956  const int subdiv = BMO_slot_int_get(op->slots_in, "subdivisions");
957 
958  const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
959  const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
960 
961  BMVert *eva[12];
962  BMVert *v;
963  BMIter liter;
964  BMIter viter;
965  BMLoop *l;
966  float vec[3], mat[4][4] /* , phi, phid */;
967  int a;
968 
969  BMO_slot_mat4_get(op->slots_in, "matrix", mat);
970 
971  /* phid = 2.0f * (float)M_PI / subdiv; */ /* UNUSED */
972  /* phi = 0.25f * (float)M_PI; */ /* UNUSED */
973 
974  for (a = 0; a < 12; a++) {
975  vec[0] = rad_div * icovert[a][0];
976  vec[1] = rad_div * icovert[a][1];
977  vec[2] = rad_div * icovert[a][2];
978  eva[a] = BM_vert_create(bm, vec, NULL, BM_CREATE_NOP);
979 
981  }
982 
983  int uvi = 0;
984  for (a = 0; a < 20; a++) {
985  BMFace *f;
986  BMVert *v1, *v2, *v3;
987 
988  v1 = eva[icoface[a][0]];
989  v2 = eva[icoface[a][1]];
990  v3 = eva[icoface[a][2]];
991 
993 
994  BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
996  }
997 
998  /* Set the UVs here, the iteration order of the faces is not guaranteed,
999  * so it's best to set the UVs right after the face is created. */
1000  if (calc_uvs) {
1001  int loop_index;
1002  BM_ITER_ELEM_INDEX (l, &liter, f, BM_LOOPS_OF_FACE, loop_index) {
1003  MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
1004  luv->uv[0] = icouvs[uvi][0];
1005  luv->uv[1] = icouvs[uvi][1];
1006  uvi++;
1007  }
1008  }
1009  }
1010 
1011  if (subdiv > 1) {
1012  BMOperator bmop;
1013 
1014  BMO_op_initf(bm,
1015  &bmop,
1016  op->flag,
1017  "subdivide_edges edges=%fe "
1018  "smooth=%f "
1019  "cuts=%i "
1020  "use_grid_fill=%b use_sphere=%b",
1021  EDGE_MARK,
1022  rad,
1023  (1 << (subdiv - 1)) - 1,
1024  true,
1025  true);
1026 
1027  BMO_op_exec(bm, &bmop);
1030  BMO_op_finish(bm, &bmop);
1031  }
1032 
1033  /* must transform after because of sphere subdivision */
1034  BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
1035  if (BMO_vert_flag_test(bm, v, VERT_MARK)) {
1036  mul_m4_v3(mat, v->co);
1037  }
1038  }
1039 
1041 }
1042 
1043 static void bm_mesh_calc_uvs_sphere_face(BMFace *f, const int cd_loop_uv_offset)
1044 {
1045  float *uvs[4];
1046  BMLoop *l;
1047  BMIter iter;
1048  float dx;
1049  int loop_index, loop_index_max_x;
1050 
1051  BLI_assert(f->len <= 4);
1052 
1053  /* If face has 3 vertices, it's a polar face, in which case we need to
1054  * compute a nearby to determine its latitude. */
1055  float avgx = 0.0f, avgy = 0.0f;
1056  BM_ITER_ELEM_INDEX (l, &iter, f, BM_LOOPS_OF_FACE, loop_index) {
1057  if (f->len == 3) {
1058  avgx += l->v->co[0];
1059  avgy += l->v->co[1];
1060  }
1061  }
1062  avgx /= 3.0f;
1063  avgy /= 3.0f;
1064 
1065  BM_ITER_ELEM_INDEX (l, &iter, f, BM_LOOPS_OF_FACE, loop_index) {
1066  MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
1067  float x = l->v->co[0];
1068  float y = l->v->co[1];
1069  float z = l->v->co[2];
1070  float len = len_v3(l->v->co);
1071 
1072  /* Use neighboring point to compute angle for poles. */
1073  float theta;
1074  if (f->len == 3 && fabsf(x) < 0.0001f && fabsf(y) < 0.0001f) {
1075  theta = atan2f(avgy, avgx);
1076  }
1077  else {
1078  theta = atan2f(y, x);
1079  }
1080 
1081  /* Shift borderline coordinates to the left. */
1082  if (fabsf(theta - (float)M_PI) < 0.0001f) {
1083  theta = -M_PI;
1084  }
1085 
1086  float phi = saacos(z / len);
1087  luv->uv[0] = 0.5f + theta / ((float)M_PI * 2);
1088  luv->uv[1] = 1.0f - phi / (float)M_PI;
1089 
1090  uvs[loop_index] = luv->uv;
1091  }
1092 
1093  /* Fix awkwardly-wrapping UVs */
1094  loop_index_max_x = 0;
1095  for (loop_index = 1; loop_index < f->len; loop_index++) {
1096  if (uvs[loop_index][0] > uvs[loop_index_max_x][0]) {
1097  loop_index_max_x = loop_index;
1098  }
1099  }
1100 
1101  for (loop_index = 0; loop_index < f->len; loop_index++) {
1102  if (loop_index != loop_index_max_x) {
1103  dx = uvs[loop_index_max_x][0] - uvs[loop_index][0];
1104  if (dx > 0.5f) {
1105  uvs[loop_index][0] += 1.0f;
1106  }
1107  }
1108  }
1109 }
1110 
1111 void BM_mesh_calc_uvs_sphere(BMesh *bm, const short oflag, const int cd_loop_uv_offset)
1112 {
1113  BMFace *f;
1114  BMIter iter;
1115 
1116  BLI_assert(cd_loop_uv_offset != -1); /* caller is responsible for giving us UVs */
1117 
1118  BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
1119  if (!BMO_face_flag_test(bm, f, oflag)) {
1120  continue;
1121  }
1122 
1123  bm_mesh_calc_uvs_sphere_face(f, cd_loop_uv_offset);
1124  }
1125 
1126  BMIter iter2;
1127  BMLoop *l;
1128  int loop_index;
1129  float minx = 1.0f;
1130 
1131  BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
1132  if (!BMO_face_flag_test(bm, f, oflag)) {
1133  continue;
1134  }
1135  BM_ITER_ELEM_INDEX (l, &iter2, f, BM_LOOPS_OF_FACE, loop_index) {
1136  MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
1137  if (luv->uv[0] < minx) {
1138  minx = luv->uv[0];
1139  }
1140  }
1141  }
1142 
1143  BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
1144  if (!BMO_face_flag_test(bm, f, oflag)) {
1145  continue;
1146  }
1147  BM_ITER_ELEM_INDEX (l, &iter2, f, BM_LOOPS_OF_FACE, loop_index) {
1148  MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
1149  luv->uv[0] -= minx;
1150  }
1151  }
1152 }
1153 
1155 {
1156  BMVert **tv = MEM_mallocN(sizeof(*tv) * monkeynv * 2, "tv");
1157  float mat[4][4];
1158  int i;
1159 
1160  BMO_slot_mat4_get(op->slots_in, "matrix", mat);
1161 
1162  const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
1163  const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
1164 
1165  for (i = 0; i < monkeynv; i++) {
1166  float v[3];
1167 
1168  /* rotate to face in the -Y axis */
1169  v[0] = (monkeyv[i][0] + 127) / 128.0;
1170  v[2] = monkeyv[i][1] / 128.0;
1171  v[1] = monkeyv[i][2] / -128.0;
1172 
1173  tv[i] = BM_vert_create(bm, v, NULL, BM_CREATE_NOP);
1175 
1176  if (fabsf(v[0] = -v[0]) < 0.001f) {
1177  tv[monkeynv + i] = tv[i];
1178  }
1179  else {
1181  mul_m4_v3(mat, eve->co);
1182  tv[monkeynv + i] = eve;
1183  }
1184 
1186 
1187  mul_m4_v3(mat, tv[i]->co);
1188  }
1189 
1190  int uvi = 0;
1191  for (i = 0; i < monkeynf; i++) {
1192  BMFace *f_new_a = BM_face_create_quad_tri(
1193  bm,
1194  tv[monkeyf[i][0] + i - monkeyo],
1195  tv[monkeyf[i][1] + i - monkeyo],
1196  tv[monkeyf[i][2] + i - monkeyo],
1197  (monkeyf[i][3] != monkeyf[i][2]) ? tv[monkeyf[i][3] + i - monkeyo] : NULL,
1198  NULL,
1199  BM_CREATE_NOP);
1200 
1201  BMFace *f_new_b = BM_face_create_quad_tri(
1202  bm,
1203  tv[monkeynv + monkeyf[i][2] + i - monkeyo],
1204  tv[monkeynv + monkeyf[i][1] + i - monkeyo],
1205  tv[monkeynv + monkeyf[i][0] + i - monkeyo],
1206  (monkeyf[i][3] != monkeyf[i][2]) ? tv[monkeynv + monkeyf[i][3] + i - monkeyo] : NULL,
1207  NULL,
1208  BM_CREATE_NOP);
1209 
1210  /* Set the UVs here, the iteration order of the faces is not guaranteed,
1211  * so it's best to set the UVs right after the face is created. */
1212  if (calc_uvs) {
1213  BMLoop *l;
1214  BMIter liter;
1215  BM_ITER_ELEM (l, &liter, f_new_a, BM_LOOPS_OF_FACE) {
1216  MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
1217  luv->uv[0] = monkeyuvs[uvi * 2 + 0];
1218  luv->uv[1] = monkeyuvs[uvi * 2 + 1];
1219  uvi++;
1220  }
1221  BM_ITER_ELEM (l, &liter, f_new_b, BM_LOOPS_OF_FACE) {
1222  MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
1223  luv->uv[0] = monkeyuvs[uvi * 2 + 0];
1224  luv->uv[1] = monkeyuvs[uvi * 2 + 1];
1225  uvi++;
1226  }
1227  }
1228  }
1229 
1230  MEM_freeN(tv);
1231 
1233 }
1234 
1236 {
1237  const float radius = BMO_slot_float_get(op->slots_in, "radius");
1238  const int segs = BMO_slot_int_get(op->slots_in, "segments");
1239  const bool cap_ends = BMO_slot_bool_get(op->slots_in, "cap_ends");
1240  const bool cap_tris = BMO_slot_bool_get(op->slots_in, "cap_tris");
1241 
1242  const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
1243  const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
1244 
1245  BMVert *v1, *lastv1 = NULL, *cent1, *firstv1 = NULL;
1246  float vec[3], mat[4][4];
1247  int a;
1248 
1249  if (!segs) {
1250  return;
1251  }
1252 
1253  BMO_slot_mat4_get(op->slots_in, "matrix", mat);
1254 
1255  if (cap_ends) {
1256  zero_v3(vec);
1257  mul_m4_v3(mat, vec);
1258 
1259  cent1 = BM_vert_create(bm, vec, NULL, BM_CREATE_NOP);
1261  }
1262 
1263  for (a = 0; a < segs; a++) {
1264  /* Going this way ends up with normal(s) upward */
1265  sin_cos_from_fraction(a, segs, &vec[0], &vec[1]);
1266  vec[0] *= -radius;
1267  vec[1] *= radius;
1268  vec[2] = 0.0f;
1269  mul_m4_v3(mat, vec);
1271 
1273 
1274  if (lastv1) {
1275  BM_edge_create(bm, v1, lastv1, NULL, BM_CREATE_NOP);
1276  }
1277 
1278  if (a && cap_ends) {
1279  BMFace *f;
1280 
1281  f = BM_face_create_quad_tri(bm, cent1, lastv1, v1, NULL, NULL, BM_CREATE_NOP);
1283  }
1284 
1285  if (!firstv1) {
1286  firstv1 = v1;
1287  }
1288 
1289  lastv1 = v1;
1290  }
1291 
1292  if (!a) {
1293  return;
1294  }
1295 
1296  BM_edge_create(bm, firstv1, lastv1, NULL, 0);
1297 
1298  if (cap_ends) {
1299  BMFace *f;
1300 
1301  f = BM_face_create_quad_tri(bm, cent1, v1, firstv1, NULL, NULL, BM_CREATE_NOP);
1303 
1304  if (calc_uvs) {
1305  BM_mesh_calc_uvs_circle(bm, mat, radius, FACE_NEW, cd_loop_uv_offset);
1306  }
1307  }
1308 
1309  if (!cap_tris) {
1310  BMO_op_callf(bm, op->flag, "dissolve_faces faces=%ff", FACE_NEW);
1311  }
1312 
1314 }
1315 
1317  BMesh *bm, float mat[4][4], const float radius, const short oflag, const int cd_loop_uv_offset)
1318 {
1319  BMFace *f;
1320  BMLoop *l;
1321  BMIter fiter, liter;
1322 
1323  const float uv_scale = 0.5f / radius;
1324  const float uv_center = 0.5f;
1325 
1326  float inv_mat[4][4];
1327 
1328  BLI_assert(cd_loop_uv_offset != -1); /* caller must ensure we have UVs already */
1329 
1330  invert_m4_m4(inv_mat, mat);
1331 
1332  BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
1333  if (!BMO_face_flag_test(bm, f, oflag)) {
1334  continue;
1335  }
1336 
1337  BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
1338  MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
1339 
1340  float uv_vco[3];
1341  copy_v3_v3(uv_vco, l->v->co);
1342  /* transform back into the unit circle flat on the Z-axis */
1343  mul_m4_v3(inv_mat, uv_vco);
1344 
1345  /* then just take those coords for UVs */
1346  luv->uv[0] = uv_center + uv_scale * uv_vco[0];
1347  luv->uv[1] = uv_center + uv_scale * uv_vco[1];
1348  }
1349  }
1350 }
1351 
1353 {
1354  BMVert *v1, *v2, *lastv1 = NULL, *lastv2 = NULL, *cent1, *cent2, *firstv1, *firstv2;
1355  BMFace *f;
1356  float vec[3], mat[4][4];
1357  const float rad1 = BMO_slot_float_get(op->slots_in, "radius1");
1358  const float rad2 = BMO_slot_float_get(op->slots_in, "radius2");
1359  const float depth_half = 0.5f * BMO_slot_float_get(op->slots_in, "depth");
1360  int segs = BMO_slot_int_get(op->slots_in, "segments");
1361  const bool cap_ends = BMO_slot_bool_get(op->slots_in, "cap_ends");
1362  const bool cap_tris = BMO_slot_bool_get(op->slots_in, "cap_tris");
1363 
1364  const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
1365  const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
1366 
1367  if (!segs) {
1368  return;
1369  }
1370 
1371  BMO_slot_mat4_get(op->slots_in, "matrix", mat);
1372 
1373  if (cap_ends) {
1374  vec[0] = vec[1] = 0.0f;
1375  vec[2] = -depth_half;
1376  mul_m4_v3(mat, vec);
1377 
1378  cent1 = BM_vert_create(bm, vec, NULL, BM_CREATE_NOP);
1379 
1380  vec[0] = vec[1] = 0.0f;
1381  vec[2] = depth_half;
1382  mul_m4_v3(mat, vec);
1383 
1384  cent2 = BM_vert_create(bm, vec, NULL, BM_CREATE_NOP);
1385 
1388  }
1389 
1390  const int side_faces_len = segs - 1;
1391  BMFace **side_faces = MEM_mallocN(sizeof(*side_faces) * side_faces_len, __func__);
1392 
1393  for (int i = 0; i < segs; i++) {
1394  /* Calculate with higher precision, see: T87779. */
1395  float sin_phi, cos_phi;
1396  sin_cos_from_fraction(i, segs, &sin_phi, &cos_phi);
1397 
1398  vec[0] = rad1 * sin_phi;
1399  vec[1] = rad1 * cos_phi;
1400  vec[2] = -depth_half;
1401  mul_m4_v3(mat, vec);
1403 
1404  vec[0] = rad2 * sin_phi;
1405  vec[1] = rad2 * cos_phi;
1406  vec[2] = depth_half;
1407  mul_m4_v3(mat, vec);
1409 
1412 
1413  if (i) {
1414  if (cap_ends) {
1415  f = BM_face_create_quad_tri(bm, cent1, lastv1, v1, NULL, NULL, BM_CREATE_NOP);
1416  if (calc_uvs) {
1418  }
1420 
1421  f = BM_face_create_quad_tri(bm, cent2, v2, lastv2, NULL, NULL, BM_CREATE_NOP);
1422  if (calc_uvs) {
1424  }
1426  }
1427 
1428  f = BM_face_create_quad_tri(bm, lastv1, lastv2, v2, v1, NULL, BM_CREATE_NOP);
1429  if (calc_uvs) {
1431  }
1432  side_faces[i - 1] = f;
1433  }
1434  else {
1435  firstv1 = v1;
1436  firstv2 = v2;
1437  }
1438 
1439  lastv1 = v1;
1440  lastv2 = v2;
1441  }
1442 
1443  if (cap_ends) {
1444  f = BM_face_create_quad_tri(bm, cent1, v1, firstv1, NULL, NULL, BM_CREATE_NOP);
1445  if (calc_uvs) {
1447  }
1449 
1450  f = BM_face_create_quad_tri(bm, cent2, firstv2, v2, NULL, NULL, BM_CREATE_NOP);
1451  if (calc_uvs) {
1453  }
1455  }
1456 
1457  f = BM_face_create_quad_tri(bm, v1, v2, firstv2, firstv1, NULL, BM_CREATE_NOP);
1458  if (calc_uvs) {
1460  }
1461 
1462  if (calc_uvs) {
1463  BM_mesh_calc_uvs_cone(bm, mat, rad2, rad1, segs, cap_ends, FACE_MARK, cd_loop_uv_offset);
1464  }
1465 
1466  /* Collapse vertices at the first end. */
1467  if (rad1 == 0.0f) {
1468  if (cap_ends) {
1469  BM_vert_kill(bm, cent1);
1470  }
1471  for (int i = 0; i < side_faces_len; i++) {
1472  f = side_faces[i];
1473  BMLoop *l = BM_FACE_FIRST_LOOP(f);
1474  BM_edge_collapse(bm, l->prev->e, l->prev->v, true, true);
1475  }
1476  }
1477 
1478  /* Collapse vertices at the second end. */
1479  if (rad2 == 0.0f) {
1480  if (cap_ends) {
1481  BM_vert_kill(bm, cent2);
1482  }
1483  for (int i = 0; i < side_faces_len; i++) {
1484  f = side_faces[i];
1485  BMLoop *l = BM_FACE_FIRST_LOOP(f);
1486  BM_edge_collapse(bm, l->next->e, l->next->v, true, true);
1487  }
1488  }
1489 
1490  if (!cap_tris) {
1491  BMO_op_callf(bm, op->flag, "dissolve_faces faces=%ff", FACE_NEW);
1492  }
1493 
1494  if (side_faces != NULL) {
1495  MEM_freeN(side_faces);
1496  }
1497 
1499 }
1500 
1502  float mat[4][4],
1503  const float radius_top,
1504  const float radius_bottom,
1505  const int segments,
1506  const bool cap_ends,
1507  const short oflag,
1508  const int cd_loop_uv_offset)
1509 {
1510  BMFace *f;
1511  BMLoop *l;
1512  BMIter fiter, liter;
1513 
1514  const float uv_width = 1.0f / (float)segments;
1515  const float uv_height = cap_ends ? 0.5f : 1.0f;
1516 
1517  /* Note that all this allows us to handle all cases
1518  * (real cone, truncated cone, with or without ends capped)
1519  * with a single common code. */
1520  const float uv_center_y = cap_ends ? 0.25f : 0.5f;
1521  const float uv_center_x_top = cap_ends ? 0.25f : 0.5f;
1522  const float uv_center_x_bottom = cap_ends ? 0.75f : 0.5f;
1523  const float uv_radius = cap_ends ? 0.24f : 0.5f;
1524 
1525  /* Using the opposite's end uv_scale as fallback allows us to handle 'real cone' case. */
1526  const float uv_scale_top = (radius_top != 0.0f) ?
1527  (uv_radius / radius_top) :
1528  ((radius_bottom != 0.0f) ? (uv_radius / radius_bottom) :
1529  uv_radius);
1530  const float uv_scale_bottom = (radius_bottom != 0.0f) ? (uv_radius / radius_bottom) :
1531  uv_scale_top;
1532 
1533  float local_up[3] = {0.0f, 0.0f, 1.0f};
1534 
1535  float x, y;
1536  float inv_mat[4][4];
1537  int loop_index;
1538 
1539  /* Transform the up-vector like we did the cone itself, without location. */
1540  mul_mat3_m4_v3(mat, local_up);
1541  /* Remove global scaling. */
1542  normalize_v3(local_up);
1543 
1544  invert_m4_m4(inv_mat, mat);
1545 
1546  BLI_assert(cd_loop_uv_offset != -1); /* caller is responsible for ensuring the mesh has UVs */
1547 
1548  x = 1.0f;
1549  y = 1.0f - uv_height;
1550 
1551  BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
1552  if (!BMO_face_flag_test(bm, f, oflag)) {
1553  continue;
1554  }
1555 
1556  if (f->len == 4 && radius_top && radius_bottom) {
1557  /* side face - so unwrap it in a rectangle */
1558  BM_ITER_ELEM_INDEX (l, &liter, f, BM_LOOPS_OF_FACE, loop_index) {
1559  MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
1560 
1561  switch (loop_index) {
1562  case 0:
1563  /* Continue in the last position */
1564  break;
1565  case 1:
1566  y += uv_height;
1567  break;
1568  case 2:
1569  x -= uv_width;
1570  break;
1571  case 3:
1572  y -= uv_height;
1573  break;
1574  default:
1575  break;
1576  }
1577 
1578  luv->uv[0] = x;
1579  luv->uv[1] = y;
1580  }
1581  }
1582  else {
1583  /* Top or bottom face - so unwrap it by transforming
1584  * back to a circle and using the X/Y coords. */
1586 
1587  BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
1588  MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
1589  float uv_vco[3];
1590 
1591  mul_v3_m4v3(uv_vco, inv_mat, l->v->co);
1592 
1593  if (dot_v3v3(f->no, local_up) > 0.0f) { /* if this is a top face of the cone */
1594  luv->uv[0] = uv_center_x_top + uv_vco[0] * uv_scale_top;
1595  luv->uv[1] = uv_center_y + uv_vco[1] * uv_scale_top;
1596  }
1597  else {
1598  luv->uv[0] = uv_center_x_bottom + uv_vco[0] * uv_scale_bottom;
1599  luv->uv[1] = uv_center_y + uv_vco[1] * uv_scale_bottom;
1600  }
1601  }
1602  }
1603  }
1604 }
1605 
1607 {
1608  BMVert *verts[8];
1609  float mat[4][4];
1610  float off = BMO_slot_float_get(op->slots_in, "size") / 2.0f;
1611 
1612  const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
1613  const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
1614 
1615  /* rotation order set to match 'BM_mesh_calc_uvs_cube' */
1616  const char faces[6][4] = {
1617  {0, 1, 3, 2},
1618  {2, 3, 7, 6},
1619  {6, 7, 5, 4},
1620  {4, 5, 1, 0},
1621  {2, 6, 4, 0},
1622  {7, 3, 1, 5},
1623  };
1624 
1625  BMO_slot_mat4_get(op->slots_in, "matrix", mat);
1626 
1627  if (!off) {
1628  off = 0.5f;
1629  }
1630  int i = 0;
1631 
1632  for (int x = -1; x < 2; x += 2) {
1633  for (int y = -1; y < 2; y += 2) {
1634  for (int z = -1; z < 2; z += 2) {
1635  float vec[3] = {(float)x * off, (float)y * off, (float)z * off};
1636  mul_m4_v3(mat, vec);
1637  verts[i] = BM_vert_create(bm, vec, NULL, BM_CREATE_NOP);
1639  i++;
1640  }
1641  }
1642  }
1643 
1644  for (i = 0; i < ARRAY_SIZE(faces); i++) {
1645  BMFace *f;
1646  BMVert *quad[4] = {
1647  verts[faces[i][0]],
1648  verts[faces[i][1]],
1649  verts[faces[i][2]],
1650  verts[faces[i][3]],
1651  };
1652 
1653  f = BM_face_create_verts(bm, quad, 4, NULL, BM_CREATE_NOP, true);
1654  if (calc_uvs) {
1656  }
1657  }
1658 
1659  if (calc_uvs) {
1661  }
1662 
1664 }
1665 
1667 {
1668  BMFace *f;
1669  BMLoop *l;
1670  BMIter fiter, liter;
1671  const float width = 0.25f;
1672 
1673  const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
1674 
1675  float x = 0.375f;
1676  float y = 0.0f;
1677 
1678  int loop_index;
1679 
1680  BLI_assert(cd_loop_uv_offset != -1); /* the caller can ensure that we have UVs */
1681 
1682  BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
1683  if (!BMO_face_flag_test(bm, f, oflag)) {
1684  continue;
1685  }
1686 
1687  BM_ITER_ELEM_INDEX (l, &liter, f, BM_LOOPS_OF_FACE, loop_index) {
1688  MLoopUV *luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
1689 
1690  luv->uv[0] = x;
1691  luv->uv[1] = y;
1692 
1693  switch (loop_index) {
1694  case 0:
1695  x += width;
1696  break;
1697  case 1:
1698  y += width;
1699  break;
1700  case 2:
1701  x -= width;
1702  break;
1703  case 3:
1704  y -= width;
1705  break;
1706  default:
1707  break;
1708  }
1709  }
1710 
1711  if (y >= 0.75f && x > 0.125f) {
1712  x = 0.125f;
1713  y = 0.5f;
1714  }
1715  else if (x <= 0.125f) {
1716  x = 0.625f;
1717  y = 0.5f;
1718  }
1719  else {
1720  y += 0.25f;
1721  }
1722  }
1723 }
typedef float(TangentPoint)[2]
CustomData interface, see also DNA_customdata_types.h.
int CustomData_get_offset(const struct CustomData *data, int type)
#define BLI_assert(a)
Definition: BLI_assert.h:46
MINLINE float saacos(float fac)
MINLINE float min_ff(float a, float b)
MINLINE int max_ii(int a, int b)
#define M_PI
Definition: BLI_math_base.h:20
void mul_mat3_m4_v3(const float M[4][4], float r[3])
Definition: math_matrix.c:790
bool invert_m4_m4(float R[4][4], const float A[4][4])
Definition: math_matrix.c:1287
void mul_m4_v3(const float M[4][4], float r[3])
Definition: math_matrix.c:729
void mul_v3_m4v3(float r[3], const float M[4][4], const float v[3])
Definition: math_matrix.c:739
void mul_v3_m3v3(float r[3], const float M[3][3], const float a[3])
Definition: math_matrix.c:897
void sin_cos_from_fraction(int numerator, int denominator, float *r_sin, float *r_cos)
void axis_angle_to_mat3(float R[3][3], const float axis[3], float angle)
MINLINE float len_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE float normalize_v3(float r[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE float dot_v3v3(const float a[3], const float b[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void zero_v3(float r[3])
MINLINE float len_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
unsigned int uint
Definition: BLI_sys_types.h:67
#define ARRAY_SIZE(arr)
@ CD_MLOOPUV
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble z
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei width
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
Read Guarded memory(de)allocation.
#define BM_FACE_FIRST_LOOP(p)
Definition: bmesh_class.h:622
@ BM_VERT
Definition: bmesh_class.h:383
@ BM_EDGE
Definition: bmesh_class.h:384
#define BM_ELEM_CD_GET_VOID_P(ele, offset)
Definition: bmesh_class.h:541
BMFace * BM_face_create_quad_tri(BMesh *bm, BMVert *v1, BMVert *v2, BMVert *v3, BMVert *v4, const BMFace *f_example, const eBMCreateFlag create_flag)
Make Quad/Triangle.
BMVert * BM_vert_create(BMesh *bm, const float co[3], const BMVert *v_example, const eBMCreateFlag create_flag)
Main function for creating a new vertex.
Definition: bmesh_core.c:41
BMFace * BM_face_create_verts(BMesh *bm, BMVert **vert_arr, const int len, const BMFace *f_example, const eBMCreateFlag create_flag, const bool create_edges)
Definition: bmesh_core.c:464
void BM_vert_kill(BMesh *bm, BMVert *v)
Definition: bmesh_core.c:939
BMEdge * BM_edge_create(BMesh *bm, BMVert *v1, BMVert *v2, const BMEdge *e_example, const eBMCreateFlag create_flag)
Main function for creating a new edge.
Definition: bmesh_core.c:123
@ BM_CREATE_NOP
Definition: bmesh_core.h:12
#define BM_ITER_ELEM(ele, iter, data, itype)
#define BM_ITER_MESH(ele, iter, bm, itype)
@ BM_VERTS_OF_MESH
@ BM_FACES_OF_MESH
@ BM_LOOPS_OF_FACE
#define BM_ITER_ELEM_INDEX(ele, iter, data, itype, indexvar)
ATTR_WARN_UNUSED_RESULT BMesh * bm
BMVert * BM_edge_collapse(BMesh *bm, BMEdge *e_kill, BMVert *v_kill, const bool do_del, const bool kill_degenerate_faces)
Definition: bmesh_mods.c:442
void BMO_slot_mat4_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, float r_mat[4][4])
void * BMO_slot_buffer_alloc(BMOperator *op, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, int len)
void BMO_slot_buffer_flag_enable(BMesh *bm, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, char htype, short oflag)
BMO_FLAG_BUFFER.
#define BMO_edge_flag_enable(bm, e, oflag)
float BMO_slot_float_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name)
#define BMO_vert_flag_enable(bm, e, oflag)
void BMO_op_exec(BMesh *bm, BMOperator *op)
BMESH OPSTACK EXEC OP.
void BMO_slot_buffer_from_enabled_flag(BMesh *bm, BMOperator *op, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, char htype, short oflag)
#define BMO_face_flag_enable(bm, e, oflag)
#define BMO_vert_flag_test(bm, e, oflag)
bool BMO_op_initf(BMesh *bm, BMOperator *op, int flag, const char *fmt,...)
int BMO_slot_int_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name)
void BMO_op_finish(BMesh *bm, BMOperator *op)
BMESH OPSTACK FINISH OP.
bool BMO_op_callf(BMesh *bm, int flag, const char *fmt,...)
BMOpSlot * BMO_slot_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *identifier)
BMESH OPSTACK GET SLOT.
#define BMO_face_flag_test(bm, e, oflag)
bool BMO_slot_bool_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name)
ATTR_WARN_UNUSED_RESULT const BMFlagLayer const short oflag
void BM_face_normal_update(BMFace *f)
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMLoop * l
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
ATTR_WARN_UNUSED_RESULT const BMVert * v
#define XY(_x, _y)
static const short icoface[20][3]
Definition: bmo_primitive.c:37
static const int monkeyo
Definition: bmo_primitive.c:61
#define VERT_MARK
void BM_mesh_calc_uvs_cube(BMesh *bm, const short oflag)
static const float icovert[12][3]
Definition: bmo_primitive.c:22
static signed char monkeyf[250][4]
#define FACE_NEW
void bmo_create_grid_exec(BMesh *bm, BMOperator *op)
static const int monkeynf
Definition: bmo_primitive.c:63
void bmo_create_circle_exec(BMesh *bm, BMOperator *op)
void bmo_create_monkey_exec(BMesh *bm, BMOperator *op)
#define FACE_MARK
void BM_mesh_calc_uvs_circle(BMesh *bm, float mat[4][4], const float radius, const short oflag, const int cd_loop_uv_offset)
void BM_mesh_calc_uvs_cone(BMesh *bm, float mat[4][4], const float radius_top, const float radius_bottom, const int segments, const bool cap_ends, const short oflag, const int cd_loop_uv_offset)
void bmo_create_icosphere_exec(BMesh *bm, BMOperator *op)
void bmo_create_cone_exec(BMesh *bm, BMOperator *op)
#define EDGE_MARK
static void bm_mesh_calc_uvs_sphere_face(BMFace *f, const int cd_loop_uv_offset)
void BM_mesh_calc_uvs_sphere(BMesh *bm, const short oflag, const int cd_loop_uv_offset)
void bmo_create_cube_exec(BMesh *bm, BMOperator *op)
static const float icouvs[60][2]
Definition: bmo_primitive.c:43
#define EDGE_ORIG
static const float monkeyuvs[]
void BM_mesh_calc_uvs_grid(BMesh *bm, const uint x_segments, const uint y_segments, const short oflag, const int cd_loop_uv_offset)
void bmo_create_uvsphere_exec(BMesh *bm, BMOperator *op)
static const signed char monkeyv[271][3]
Definition: bmo_primitive.c:64
static const int monkeynv
Definition: bmo_primitive.c:62
#define sinf(x)
Definition: cuda/compat.h:102
#define cosf(x)
Definition: cuda/compat.h:101
int len
Definition: draw_manager.c:108
static float verts[][3]
GPUBatch * quad
void(* MEM_freeN)(void *vmemh)
Definition: mallocn.c:27
void *(* MEM_mallocN)(size_t len, const char *str)
Definition: mallocn.c:33
static char faces[256]
#define atan2f(x, y)
Definition: metal/compat.h:227
#define fabsf(x)
Definition: metal/compat.h:219
static unsigned a[3]
Definition: RandGen.cpp:78
int len
Definition: bmesh_class.h:267
float no[3]
Definition: bmesh_class.h:271
struct BMVert * v
Definition: bmesh_class.h:153
struct BMEdge * e
Definition: bmesh_class.h:164
struct BMLoop * prev
Definition: bmesh_class.h:233
struct BMLoop * next
Definition: bmesh_class.h:233
union BMOpSlot::@145 data
struct BMOpSlot slots_out[BMO_OP_MAX_SLOTS]
struct BMOpSlot slots_in[BMO_OP_MAX_SLOTS]
float co[3]
Definition: bmesh_class.h:87
CustomData ldata
Definition: bmesh_class.h:337