Blender V5.0
bmo_primitive.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
10
11#include <algorithm>
12
13#include "MEM_guardedalloc.h"
14
15#include "BLI_math_base_safe.h"
16#include "BLI_math_matrix.h"
17#include "BLI_math_rotation.h"
18#include "BLI_math_vector.h"
19
20#include "BKE_customdata.hh"
21
22#include "bmesh.hh"
24
25/* ************************ primitives ******************* */
26
27static const float icovert[12][3] = {
28 {0.0f, 0.0f, -200.0f},
29 {144.72f, -105.144f, -89.443f},
30 {-55.277f, -170.128, -89.443f},
31 {-178.885f, 0.0f, -89.443f},
32 {-55.277f, 170.128f, -89.443f},
33 {144.72f, 105.144f, -89.443f},
34 {55.277f, -170.128f, 89.443f},
35 {-144.72f, -105.144f, 89.443f},
36 {-144.72f, 105.144f, 89.443f},
37 {55.277f, 170.128f, 89.443f},
38 {178.885f, 0.0f, 89.443f},
39 {0.0f, 0.0f, 200.0f},
40};
41
42static const short icoface[20][3] = {
43 {0, 1, 2}, {1, 0, 5}, {0, 2, 3}, {0, 3, 4}, {0, 4, 5}, {1, 5, 10}, {2, 1, 6},
44 {3, 2, 7}, {4, 3, 8}, {5, 4, 9}, {1, 10, 6}, {2, 6, 7}, {3, 7, 8}, {4, 8, 9},
45 {5, 9, 10}, {6, 10, 11}, {7, 6, 11}, {8, 7, 11}, {9, 8, 11}, {10, 9, 11},
46};
47
48static const float icouvs[60][2] = {
49 {0.181819f, 0.000000f}, {0.272728f, 0.157461f}, {0.090910f, 0.157461f}, {0.272728f, 0.157461f},
50 {0.363637f, 0.000000f}, {0.454546f, 0.157461f}, {0.909091f, 0.000000f}, {1.000000f, 0.157461f},
51 {0.818182f, 0.157461f}, {0.727273f, 0.000000f}, {0.818182f, 0.157461f}, {0.636364f, 0.157461f},
52 {0.545455f, 0.000000f}, {0.636364f, 0.157461f}, {0.454546f, 0.157461f}, {0.272728f, 0.157461f},
53 {0.454546f, 0.157461f}, {0.363637f, 0.314921f}, {0.090910f, 0.157461f}, {0.272728f, 0.157461f},
54 {0.181819f, 0.314921f}, {0.818182f, 0.157461f}, {1.000000f, 0.157461f}, {0.909091f, 0.314921f},
55 {0.636364f, 0.157461f}, {0.818182f, 0.157461f}, {0.727273f, 0.314921f}, {0.454546f, 0.157461f},
56 {0.636364f, 0.157461f}, {0.545455f, 0.314921f}, {0.272728f, 0.157461f}, {0.363637f, 0.314921f},
57 {0.181819f, 0.314921f}, {0.090910f, 0.157461f}, {0.181819f, 0.314921f}, {0.000000f, 0.314921f},
58 {0.818182f, 0.157461f}, {0.909091f, 0.314921f}, {0.727273f, 0.314921f}, {0.636364f, 0.157461f},
59 {0.727273f, 0.314921f}, {0.545455f, 0.314921f}, {0.454546f, 0.157461f}, {0.545455f, 0.314921f},
60 {0.363637f, 0.314921f}, {0.181819f, 0.314921f}, {0.363637f, 0.314921f}, {0.272728f, 0.472382f},
61 {0.000000f, 0.314921f}, {0.181819f, 0.314921f}, {0.090910f, 0.472382f}, {0.727273f, 0.314921f},
62 {0.909091f, 0.314921f}, {0.818182f, 0.472382f}, {0.545455f, 0.314921f}, {0.727273f, 0.314921f},
63 {0.636364f, 0.472382f}, {0.363637f, 0.314921f}, {0.545455f, 0.314921f}, {0.454546f, 0.472382f},
64};
65
66static const int monkeyo = 4;
67static const int monkeynv = 271;
68static const int monkeynf = 250;
69static const signed char monkeyv[271][3] = {
70 {-71, 21, 98}, {-63, 12, 88}, {-57, 7, 74}, {-82, -3, 79}, {-82, 4, 92},
71 {-82, 17, 100}, {-92, 21, 102}, {-101, 12, 95}, {-107, 7, 83}, {-117, 31, 84},
72 {-109, 31, 95}, {-96, 31, 102}, {-92, 42, 102}, {-101, 50, 95}, {-107, 56, 83},
73 {-82, 66, 79}, {-82, 58, 92}, {-82, 46, 100}, {-71, 42, 98}, {-63, 50, 88},
74 {-57, 56, 74}, {-47, 31, 72}, {-55, 31, 86}, {-67, 31, 97}, {-66, 31, 99},
75 {-70, 43, 100}, {-82, 48, 103}, {-93, 43, 105}, {-98, 31, 105}, {-93, 20, 105},
76 {-82, 31, 106}, {-82, 15, 103}, {-70, 20, 100}, {-127, 55, 95}, {-127, 45, 105},
77 {-127, -87, 94}, {-127, -41, 100}, {-127, -24, 102}, {-127, -99, 92}, {-127, 52, 77},
78 {-127, 73, 73}, {-127, 115, -70}, {-127, 72, -109}, {-127, 9, -106}, {-127, -49, -45},
79 {-101, -24, 72}, {-87, -56, 73}, {-82, -89, 73}, {-80, -114, 68}, {-85, -121, 67},
80 {-104, -124, 71}, {-127, -126, 74}, {-71, -18, 68}, {-46, -5, 69}, {-21, 19, 57},
81 {-17, 55, 76}, {-36, 62, 80}, {-64, 77, 88}, {-86, 97, 94}, {-107, 92, 97},
82 {-119, 63, 96}, {-106, 53, 99}, {-111, 39, 98}, {-101, 12, 95}, {-79, 2, 90},
83 {-64, 8, 86}, {-47, 24, 83}, {-45, 38, 83}, {-50, 48, 85}, {-72, 56, 92},
84 {-95, 60, 97}, {-127, -98, 94}, {-113, -92, 94}, {-112, -107, 91}, {-119, -113, 89},
85 {-127, -114, 88}, {-127, -25, 96}, {-127, -18, 95}, {-114, -19, 95}, {-111, -29, 96},
86 {-116, -37, 95}, {-76, -6, 86}, {-48, 7, 80}, {-34, 26, 77}, {-32, 48, 84},
87 {-39, 53, 93}, {-71, 70, 102}, {-87, 82, 107}, {-101, 79, 109}, {-114, 55, 108},
88 {-111, -13, 104}, {-100, -57, 91}, {-95, -90, 88}, {-93, -105, 85}, {-97, -117, 81},
89 {-106, -119, 81}, {-127, -121, 82}, {-127, 6, 93}, {-127, 27, 98}, {-85, 61, 95},
90 {-106, 18, 96}, {-110, 27, 97}, {-112, -88, 94}, {-117, -57, 96}, {-127, -57, 96},
91 {-127, -42, 95}, {-115, -35, 100}, {-110, -29, 102}, {-113, -17, 100}, {-122, -16, 100},
92 {-127, -26, 106}, {-121, -19, 104}, {-115, -20, 104}, {-113, -29, 106}, {-117, -32, 103},
93 {-127, -37, 103}, {-94, -40, 71}, {-106, -31, 91}, {-104, -40, 91}, {-97, -32, 71},
94 {-127, -112, 88}, {-121, -111, 88}, {-115, -105, 91}, {-115, -95, 93}, {-127, -100, 84},
95 {-115, -96, 85}, {-115, -104, 82}, {-121, -109, 81}, {-127, -110, 81}, {-105, 28, 100},
96 {-103, 20, 99}, {-84, 55, 97}, {-92, 54, 99}, {-73, 51, 99}, {-55, 45, 89},
97 {-52, 37, 88}, {-53, 25, 87}, {-66, 13, 92}, {-79, 8, 95}, {-98, 14, 100},
98 {-104, 38, 100}, {-100, 48, 100}, {-97, 46, 97}, {-102, 38, 97}, {-96, 16, 97},
99 {-79, 11, 93}, {-68, 15, 90}, {-57, 27, 86}, {-56, 36, 86}, {-59, 43, 87},
100 {-74, 50, 96}, {-91, 51, 98}, {-84, 52, 96}, {-101, 22, 96}, {-102, 29, 96},
101 {-113, 59, 78}, {-102, 85, 79}, {-84, 88, 76}, {-65, 71, 71}, {-40, 58, 63},
102 {-25, 52, 59}, {-28, 21, 48}, {-50, 0, 53}, {-71, -12, 60}, {-127, 115, 37},
103 {-127, 126, -10}, {-127, -25, -86}, {-127, -59, 24}, {-127, -125, 59}, {-127, -103, 44},
104 {-127, -73, 41}, {-127, -62, 36}, {-18, 30, 7}, {-17, 41, -6}, {-28, 34, -56},
105 {-68, 56, -90}, {-33, -6, 9}, {-51, -16, -21}, {-45, -1, -55}, {-84, 7, -85},
106 {-97, -45, 52}, {-104, -53, 33}, {-90, -91, 49}, {-95, -64, 50}, {-85, -117, 51},
107 {-109, -97, 47}, {-111, -69, 46}, {-106, -121, 56}, {-99, -36, 55}, {-100, -29, 60},
108 {-101, -22, 64}, {-100, -50, 21}, {-89, -40, -34}, {-83, -19, -69}, {-69, 111, -49},
109 {-69, 119, -9}, {-69, 109, 30}, {-68, 67, 55}, {-34, 52, 43}, {-46, 58, 36},
110 {-45, 90, 7}, {-25, 72, 16}, {-25, 79, -15}, {-45, 96, -25}, {-45, 87, -57},
111 {-25, 69, -46}, {-48, 42, -75}, {-65, 3, -70}, {-22, 42, -26}, {-75, -22, 19},
112 {-72, -25, -27}, {-13, 52, -30}, {-28, -18, -16}, {6, -13, -42}, {37, 7, -55},
113 {46, 41, -54}, {31, 65, -54}, {4, 61, -40}, {3, 53, -37}, {25, 56, -50},
114 {35, 37, -52}, {28, 10, -52}, {5, -5, -39}, {-21, -9, -17}, {-9, 46, -28},
115 {-6, 39, -37}, {-14, -3, -27}, {6, 0, -47}, {25, 12, -57}, {31, 32, -57},
116 {23, 46, -56}, {4, 44, -46}, {-19, 37, -27}, {-20, 22, -35}, {-30, 12, -35},
117 {-22, 11, -35}, {-19, 2, -35}, {-23, -2, -35}, {-34, 0, -9}, {-35, -3, -22},
118 {-35, 5, -24}, {-25, 26, -27}, {-13, 31, -34}, {-13, 30, -41}, {-23, -2, -41},
119 {-18, 2, -41}, {-21, 10, -41}, {-29, 12, -41}, {-19, 22, -41}, {6, 42, -53},
120 {25, 44, -62}, {34, 31, -63}, {28, 11, -62}, {7, 0, -54}, {-14, -2, -34},
121 {-5, 37, -44}, {-13, 14, -42}, {-7, 8, -43}, {1, 16, -47}, {-4, 22, -45},
122 {3, 30, -48}, {8, 24, -49}, {15, 27, -50}, {12, 35, -50}, {4, 56, -62},
123 {33, 60, -70}, {48, 38, -64}, {41, 7, -68}, {6, -11, -63}, {-26, -16, -42},
124 {-17, 49, -49},
125};
126
127static signed char monkeyf[250][4] = {
128 {27, 4, 5, 26}, {25, 4, 5, 24}, {3, 6, 5, 4},
129 {1, 6, 5, 2}, {5, 6, 7, 4}, {3, 6, 7, 2},
130 {5, 8, 7, 6}, {3, 8, 7, 4}, {7, 8, 9, 6},
131 {5, 8, 9, 4}, {7, 10, 9, 8}, {5, 10, 9, 6},
132 {9, 10, 11, 8}, {7, 10, 11, 6}, {9, 12, 11, 10},
133 {7, 12, 11, 8}, {11, 6, 13, 12}, {5, 4, 13, 12},
134 {3, -2, 13, 12}, {-3, -4, 13, 12}, {-5, -10, 13, 12},
135 {-11, -12, 14, 12}, {-13, -18, 14, 13}, {-19, 4, 5, 13},
136 {10, 12, 4, 4}, {10, 11, 9, 9}, {8, 7, 9, 9},
137 {7, 5, 6, 6}, {6, 3, 4, 4}, {5, 1, 2, 2},
138 {4, -1, 0, 0}, {3, -3, -2, -2}, {22, 67, 68, 23},
139 {20, 65, 66, 21}, {18, 63, 64, 19}, {16, 61, 62, 17},
140 {14, 59, 60, 15}, {12, 19, 48, 57}, {18, 19, 48, 47},
141 {18, 19, 48, 47}, {18, 19, 48, 47}, {18, 19, 48, 47},
142 {18, 19, 48, 47}, {18, 19, 48, 47}, {18, 19, 48, 47},
143 {18, 19, 48, 47}, {18, -9, -8, 47}, {18, 27, 45, 46},
144 {26, 55, 43, 44}, {24, 41, 42, 54}, {22, 39, 40, 23},
145 {20, 37, 38, 21}, {18, 35, 36, 19}, {16, 33, 34, 17},
146 {14, 31, 32, 15}, {12, 39, 30, 13}, {11, 48, 45, 38},
147 {8, 36, -19, 9}, {8, -20, 44, 47}, {42, 45, 46, 43},
148 {18, 19, 40, 39}, {16, 17, 38, 37}, {14, 15, 36, 35},
149 {32, 44, 43, 33}, {12, 33, 32, 42}, {19, 44, 43, 42},
150 {40, 41, 42, -27}, {8, 9, 39, -28}, {15, 43, 42, 16},
151 {13, 43, 42, 14}, {11, 43, 42, 12}, {9, -30, 42, 10},
152 {37, 12, 38, -32}, {-33, 37, 45, 46}, {-33, 40, 41, 39},
153 {38, 40, 41, 37}, {36, 40, 41, 35}, {34, 40, 41, 33},
154 {36, 39, 38, 37}, {35, 40, 39, 38}, {1, 2, 14, 21},
155 {1, 2, 40, 13}, {1, 2, 40, 39}, {1, 24, 12, 39},
156 {-34, 36, 38, 11}, {35, 38, 36, 37}, {-37, 8, 35, 37},
157 {-11, -12, -45, 40}, {-11, -12, 39, 38}, {-11, -12, 37, 36},
158 {-11, -12, 35, 34}, {33, 34, 40, 41}, {33, 34, 38, 39},
159 {33, 34, 36, 37}, {33, -52, 34, 35}, {33, 37, 36, 34},
160 {33, 35, 34, 34}, {8, 7, 37, 36}, {-32, 7, 35, 46},
161 {-34, -33, 45, 46}, {4, -33, 43, 34}, {-34, -33, 41, 42},
162 {-34, -33, 39, 40}, {-34, -33, 37, 38}, {-34, -33, 35, 36},
163 {-34, -33, 33, 34}, {-34, -33, 31, 32}, {-34, -4, 28, 30},
164 {-5, -34, 28, 27}, {-35, -44, 36, 27}, {26, 35, 36, 45},
165 {24, 25, 44, 45}, {25, 23, 44, 42}, {25, 24, 41, 40},
166 {25, 24, 39, 38}, {25, 24, 37, 36}, {25, 24, 35, 34},
167 {25, 24, 33, 32}, {25, 24, 31, 30}, {15, 24, 29, 38},
168 {25, 24, 27, 26}, {23, 12, 37, 26}, {11, 12, 35, 36},
169 {-86, -59, 36, -80}, {-60, -61, 36, 35}, {-62, -63, 36, 35},
170 {-64, -65, 36, 35}, {-66, -67, 36, 35}, {-68, -69, 36, 35},
171 {-70, -71, 36, 35}, {-72, -73, 36, 35}, {-74, -75, 36, 35},
172 {42, 43, 53, 58}, {40, 41, 57, 56}, {38, 39, 55, 57},
173 {-81, -80, 37, 56}, {-83, -82, 55, 52}, {-85, -84, 51, 49},
174 {-87, -86, 48, 49}, {47, 50, 51, 48}, {46, 48, 51, 49},
175 {43, 46, 49, 44}, {-92, -91, 45, 42}, {-23, 49, 50, -20},
176 {-94, 40, 48, -24}, {-96, -22, 48, 49}, {-97, 48, 21, -90},
177 {-100, 36, 50, 23}, {22, 49, 48, -100}, {-101, 47, 46, 22},
178 {21, 45, 35, 25}, {33, 34, 44, 41}, {13, 14, 28, 24},
179 {-107, 26, 30, -106}, {14, 46, 45, 15}, {14, 44, 43, -110},
180 {-111, 42, 23, -110}, {6, 7, 45, 46}, {45, 44, 47, 46},
181 {45, 46, 47, 48}, {47, 46, 49, 48}, {17, 49, 47, 48},
182 {17, 36, 46, 48}, {35, 36, 44, 45}, {35, 36, 40, 43},
183 {35, 36, 38, 39}, {-4, -3, 37, 35}, {-123, 34, 33, 1},
184 {-9, -8, -7, -6}, {-10, -7, 32, -125}, {-127, -11, -126, -126},
185 {-7, -6, 5, 31}, {4, 5, 33, 30}, {4, 39, 33, 32},
186 {4, 35, 32, 38}, {20, 21, 39, 38}, {4, 37, 38, 5},
187 {-11, -10, 36, 3}, {-11, 15, 14, 35}, {13, 16, 34, 34},
188 {-13, 14, 13, 13}, {-3, 1, 30, 29}, {-3, 28, 29, 1},
189 {-2, 31, 28, -1}, {12, 13, 27, 30}, {-2, 26, 12, 12},
190 {35, 29, 42, 36}, {34, 35, 36, 33}, {32, 35, 36, 31},
191 {30, 35, 36, 29}, {28, 35, 36, 27}, {26, 35, 36, 25},
192 {34, 39, 38, 35}, {32, 39, 38, 33}, {30, 39, 38, 31},
193 {28, 39, 38, 29}, {26, 39, 38, 27}, {25, 31, 32, 38},
194 {-18, -17, 45, 44}, {-18, 17, 28, 44}, {-24, -20, 42, -23},
195 {11, 35, 27, 14}, {25, 28, 39, 41}, {37, 41, 40, 38},
196 {34, 40, 36, 35}, {32, 40, 39, 33}, {30, 39, 31, 40},
197 {21, 29, 39, 22}, {-31, 37, 28, 4}, {-32, 33, 35, 36},
198 {32, 33, 34, 34}, {18, 35, 36, 48}, {34, 25, 40, 35},
199 {24, 25, 38, 39}, {24, 25, 36, 37}, {24, 25, 34, 35},
200 {24, 25, 32, 33}, {24, 13, 41, 31}, {17, 11, 41, 35},
201 {15, 16, 34, 35}, {13, 14, 34, 35}, {11, 12, 34, 35},
202 {9, 10, 34, 35}, {7, 8, 34, 35}, {26, 25, 37, 36},
203 {35, 36, 37, 38}, {37, 36, 39, 38}, {37, 38, 39, 40},
204 {25, 31, 36, 39}, {18, 34, 35, 30}, {17, 22, 30, 33},
205 {19, 29, 21, 20}, {16, 26, 29, 17}, {24, 29, 28, 25},
206 {22, 31, 28, 23}, {20, 31, 30, 21}, {18, 31, 30, 19},
207 {16, 30, 17, 17}, {-21, -22, 35, 34}, {-21, -22, 33, 32},
208 {-21, -22, 31, 30}, {-21, -22, 29, 28}, {-21, -22, 27, 26},
209 {-28, -22, 25, 31}, {24, 28, 29, 30}, {23, 24, 26, 27},
210 {23, 24, 25, 25}, {-69, -35, -32, 27}, {-70, 26, 25, -66},
211 {-68, -67, 24, -33},
212};
213
214static const float monkeyuvs[] = {
215 0.843250f, 0.588863f, 0.833697f, 0.611927f, 0.794218f, 0.611927f, 0.815334f, 0.560948f,
216 0.866314f, 0.937441f, 0.866314f, 0.897962f, 0.889378f, 0.888409f, 0.917293f, 0.916324f,
217 0.815334f, 0.560948f, 0.794218f, 0.611927f, 0.746541f, 0.611927f, 0.781622f, 0.527235f,
218 0.866314f, 0.985118f, 0.866314f, 0.937441f, 0.917293f, 0.916324f, 0.951006f, 0.950037f,
219 0.794218f, 0.611927f, 0.815334f, 0.662907f, 0.781622f, 0.696619f, 0.746541f, 0.611927f,
220 0.781622f, 0.950037f, 0.815334f, 0.916325f, 0.866314f, 0.937441f, 0.866314f, 0.985118f,
221 0.833697f, 0.611927f, 0.843250f, 0.634991f, 0.815334f, 0.662907f, 0.794218f, 0.611927f,
222 0.815334f, 0.916325f, 0.843250f, 0.888409f, 0.866314f, 0.897962f, 0.866314f, 0.937441f,
223 0.843250f, 0.634991f, 0.866314f, 0.644544f, 0.866314f, 0.684023f, 0.815334f, 0.662907f,
224 0.794218f, 0.865345f, 0.833697f, 0.865345f, 0.843250f, 0.888409f, 0.815334f, 0.916325f,
225 0.815334f, 0.662907f, 0.866314f, 0.684023f, 0.866314f, 0.731700f, 0.781622f, 0.696619f,
226 0.746541f, 0.865345f, 0.794218f, 0.865345f, 0.815334f, 0.916325f, 0.781622f, 0.950037f,
227 0.866314f, 0.684023f, 0.917293f, 0.662907f, 0.951006f, 0.696619f, 0.866314f, 0.731700f,
228 0.781622f, 0.780653f, 0.815334f, 0.814366f, 0.794218f, 0.865345f, 0.746541f, 0.865345f,
229 0.866314f, 0.644544f, 0.889378f, 0.634991f, 0.917293f, 0.662907f, 0.866314f, 0.684023f,
230 0.815334f, 0.814366f, 0.843250f, 0.842281f, 0.833697f, 0.865345f, 0.794218f, 0.865345f,
231 0.889378f, 0.634991f, 0.898931f, 0.611927f, 0.938410f, 0.611927f, 0.917293f, 0.662907f,
232 0.866314f, 0.793249f, 0.866314f, 0.832728f, 0.843250f, 0.842281f, 0.815334f, 0.814366f,
233 0.917293f, 0.662907f, 0.938410f, 0.611927f, 0.986087f, 0.611927f, 0.951006f, 0.696619f,
234 0.866314f, 0.745572f, 0.866314f, 0.793249f, 0.815334f, 0.814366f, 0.781622f, 0.780653f,
235 0.938410f, 0.611927f, 0.917294f, 0.560947f, 0.951006f, 0.527235f, 0.986087f, 0.611927f,
236 0.951006f, 0.780653f, 0.917294f, 0.814365f, 0.866314f, 0.793249f, 0.866314f, 0.745572f,
237 0.898931f, 0.611927f, 0.889378f, 0.588863f, 0.917294f, 0.560947f, 0.938410f, 0.611927f,
238 0.917294f, 0.814365f, 0.889378f, 0.842281f, 0.866314f, 0.832728f, 0.866314f, 0.793249f,
239 0.889378f, 0.588863f, 0.866314f, 0.579310f, 0.866314f, 0.539831f, 0.917294f, 0.560947f,
240 0.938410f, 0.865345f, 0.898931f, 0.865345f, 0.889378f, 0.842281f, 0.917294f, 0.814365f,
241 0.917294f, 0.560947f, 0.866314f, 0.539831f, 0.866314f, 0.492154f, 0.951006f, 0.527235f,
242 0.986087f, 0.865345f, 0.938410f, 0.865345f, 0.917294f, 0.814365f, 0.951006f, 0.780653f,
243 0.866314f, 0.539831f, 0.815334f, 0.560948f, 0.781622f, 0.527235f, 0.866314f, 0.492154f,
244 0.951006f, 0.950037f, 0.917293f, 0.916324f, 0.938410f, 0.865345f, 0.986087f, 0.865345f,
245 0.866314f, 0.579310f, 0.843250f, 0.588863f, 0.815334f, 0.560948f, 0.866314f, 0.539831f,
246 0.917293f, 0.916324f, 0.889378f, 0.888409f, 0.898931f, 0.865345f, 0.938410f, 0.865345f,
247 0.843250f, 0.588863f, 0.866314f, 0.579310f, 0.866314f, 0.585461f, 0.847600f, 0.593213f,
248 0.892780f, 0.865345f, 0.898931f, 0.865345f, 0.889378f, 0.888409f, 0.885028f, 0.884059f,
249 0.866314f, 0.579310f, 0.889378f, 0.588863f, 0.885028f, 0.593213f, 0.866314f, 0.585461f,
250 0.885028f, 0.846631f, 0.889378f, 0.842281f, 0.898931f, 0.865345f, 0.892780f, 0.865345f,
251 0.889378f, 0.588863f, 0.898931f, 0.611927f, 0.892780f, 0.611927f, 0.885028f, 0.593213f,
252 0.866314f, 0.838879f, 0.866314f, 0.832728f, 0.889378f, 0.842281f, 0.885028f, 0.846631f,
253 0.898931f, 0.611927f, 0.889378f, 0.634991f, 0.885028f, 0.630641f, 0.892780f, 0.611927f,
254 0.847600f, 0.846631f, 0.843250f, 0.842281f, 0.866314f, 0.832728f, 0.866314f, 0.838879f,
255 0.889378f, 0.634991f, 0.866314f, 0.644544f, 0.866314f, 0.638393f, 0.885028f, 0.630641f,
256 0.839848f, 0.865345f, 0.833697f, 0.865345f, 0.843250f, 0.842281f, 0.847600f, 0.846631f,
257 0.866314f, 0.644544f, 0.843250f, 0.634991f, 0.847600f, 0.630641f, 0.866314f, 0.638393f,
258 0.847600f, 0.884059f, 0.843250f, 0.888409f, 0.833697f, 0.865345f, 0.839848f, 0.865345f,
259 0.843250f, 0.634991f, 0.833697f, 0.611927f, 0.839848f, 0.611927f, 0.847600f, 0.630641f,
260 0.866314f, 0.891811f, 0.866314f, 0.897962f, 0.843250f, 0.888409f, 0.847600f, 0.884059f,
261 0.833697f, 0.611927f, 0.843250f, 0.588863f, 0.847600f, 0.593213f, 0.839848f, 0.611927f,
262 0.885028f, 0.884059f, 0.889378f, 0.888409f, 0.866314f, 0.897962f, 0.866314f, 0.891811f,
263 0.866314f, 0.611927f, 0.839848f, 0.611927f, 0.847600f, 0.593213f, 0.885028f, 0.884059f,
264 0.866314f, 0.891811f, 0.866314f, 0.865345f, 0.847600f, 0.630641f, 0.839848f, 0.611927f,
265 0.866314f, 0.611927f, 0.866314f, 0.865345f, 0.866314f, 0.891811f, 0.847600f, 0.884059f,
266 0.866314f, 0.611927f, 0.866314f, 0.638393f, 0.847600f, 0.630641f, 0.847600f, 0.884059f,
267 0.839848f, 0.865345f, 0.866314f, 0.865345f, 0.866314f, 0.611927f, 0.885028f, 0.630641f,
268 0.866314f, 0.638393f, 0.839848f, 0.865345f, 0.847600f, 0.846631f, 0.866314f, 0.865345f,
269 0.866314f, 0.611927f, 0.892780f, 0.611927f, 0.885028f, 0.630641f, 0.847600f, 0.846631f,
270 0.866314f, 0.838879f, 0.866314f, 0.865345f, 0.866314f, 0.611927f, 0.885028f, 0.593213f,
271 0.892780f, 0.611927f, 0.866314f, 0.838879f, 0.885028f, 0.846631f, 0.866314f, 0.865345f,
272 0.866314f, 0.611927f, 0.866314f, 0.585461f, 0.885028f, 0.593213f, 0.885028f, 0.846631f,
273 0.892780f, 0.865345f, 0.866314f, 0.865345f, 0.866314f, 0.611927f, 0.847600f, 0.593213f,
274 0.866314f, 0.585461f, 0.892780f, 0.865345f, 0.885028f, 0.884059f, 0.866314f, 0.865345f,
275 0.520711f, 0.060503f, 0.517028f, 0.068490f, 0.500000f, 0.064527f, 0.500000f, 0.054411f,
276 0.500000f, 0.064527f, 0.482972f, 0.068490f, 0.479289f, 0.060503f, 0.500000f, 0.054411f,
277 0.530457f, 0.065062f, 0.522612f, 0.070678f, 0.517028f, 0.068490f, 0.520711f, 0.060503f,
278 0.482972f, 0.068490f, 0.477388f, 0.070678f, 0.469543f, 0.065062f, 0.479289f, 0.060503f,
279 0.532878f, 0.067822f, 0.526301f, 0.079422f, 0.522612f, 0.070678f, 0.530457f, 0.065062f,
280 0.477388f, 0.070678f, 0.473699f, 0.079422f, 0.467122f, 0.067822f, 0.469543f, 0.065062f,
281 0.544695f, 0.083023f, 0.529228f, 0.091098f, 0.526301f, 0.079422f, 0.532878f, 0.067822f,
282 0.473699f, 0.079422f, 0.470772f, 0.091098f, 0.455305f, 0.083023f, 0.467122f, 0.067822f,
283 0.565647f, 0.115495f, 0.537536f, 0.127779f, 0.529228f, 0.091098f, 0.544695f, 0.083023f,
284 0.470772f, 0.091098f, 0.462464f, 0.127779f, 0.434353f, 0.115495f, 0.455305f, 0.083023f,
285 0.586916f, 0.172042f, 0.626605f, 0.208159f, 0.600470f, 0.238288f, 0.535885f, 0.215568f,
286 0.399530f, 0.238288f, 0.373395f, 0.208159f, 0.413084f, 0.172042f, 0.464115f, 0.215568f,
287 0.626605f, 0.208159f, 0.650908f, 0.240294f, 0.636962f, 0.261221f, 0.600470f, 0.238288f,
288 0.363038f, 0.261221f, 0.349092f, 0.240294f, 0.373395f, 0.208159f, 0.399530f, 0.238288f,
289 0.650908f, 0.240294f, 0.689501f, 0.268805f, 0.655896f, 0.284413f, 0.636962f, 0.261221f,
290 0.344104f, 0.284413f, 0.310499f, 0.268805f, 0.349092f, 0.240294f, 0.363038f, 0.261221f,
291 0.689501f, 0.268805f, 0.684517f, 0.317795f, 0.659507f, 0.313152f, 0.655896f, 0.284413f,
292 0.340493f, 0.313152f, 0.315483f, 0.317795f, 0.310499f, 0.268805f, 0.344104f, 0.284413f,
293 0.684517f, 0.317795f, 0.671357f, 0.334694f, 0.649107f, 0.322437f, 0.659507f, 0.313152f,
294 0.350893f, 0.322437f, 0.328643f, 0.334694f, 0.315483f, 0.317795f, 0.340493f, 0.313152f,
295 0.671357f, 0.334694f, 0.636775f, 0.370732f, 0.613636f, 0.353108f, 0.649107f, 0.322437f,
296 0.386364f, 0.353108f, 0.363225f, 0.370732f, 0.328643f, 0.334694f, 0.350893f, 0.322437f,
297 0.636775f, 0.370732f, 0.602261f, 0.395588f, 0.594178f, 0.371277f, 0.613636f, 0.353108f,
298 0.405822f, 0.371277f, 0.397739f, 0.395588f, 0.363225f, 0.370732f, 0.386364f, 0.353108f,
299 0.602261f, 0.395588f, 0.581044f, 0.398468f, 0.577351f, 0.373341f, 0.594178f, 0.371277f,
300 0.422649f, 0.373341f, 0.418956f, 0.398468f, 0.397739f, 0.395588f, 0.405822f, 0.371277f,
301 0.581044f, 0.398468f, 0.532016f, 0.387365f, 0.539817f, 0.354339f, 0.577351f, 0.373341f,
302 0.460183f, 0.354339f, 0.467984f, 0.387365f, 0.418956f, 0.398468f, 0.422649f, 0.373341f,
303 0.532016f, 0.387365f, 0.500000f, 0.382860f, 0.500000f, 0.340417f, 0.539817f, 0.354339f,
304 0.500000f, 0.340417f, 0.500000f, 0.382860f, 0.467984f, 0.387365f, 0.460183f, 0.354339f,
305 0.559135f, 0.334326f, 0.579057f, 0.335646f, 0.577351f, 0.373341f, 0.539817f, 0.354339f,
306 0.422649f, 0.373341f, 0.420943f, 0.335646f, 0.440865f, 0.334326f, 0.460183f, 0.354339f,
307 0.579057f, 0.335646f, 0.592090f, 0.332885f, 0.594178f, 0.371277f, 0.577351f, 0.373341f,
308 0.405822f, 0.371277f, 0.407910f, 0.332885f, 0.420943f, 0.335646f, 0.422649f, 0.373341f,
309 0.606163f, 0.325516f, 0.613636f, 0.353108f, 0.594178f, 0.371277f, 0.592090f, 0.332885f,
310 0.405822f, 0.371277f, 0.386364f, 0.353108f, 0.393837f, 0.325516f, 0.407910f, 0.332885f,
311 0.628251f, 0.311636f, 0.649107f, 0.322437f, 0.613636f, 0.353108f, 0.606163f, 0.325516f,
312 0.386364f, 0.353108f, 0.350893f, 0.322437f, 0.371749f, 0.311636f, 0.393837f, 0.325516f,
313 0.635551f, 0.300507f, 0.659507f, 0.313152f, 0.649107f, 0.322437f, 0.628251f, 0.311636f,
314 0.350893f, 0.322437f, 0.340493f, 0.313152f, 0.364449f, 0.300507f, 0.371749f, 0.311636f,
315 0.631484f, 0.283889f, 0.655896f, 0.284413f, 0.659507f, 0.313152f, 0.635551f, 0.300507f,
316 0.340493f, 0.313152f, 0.344104f, 0.284413f, 0.368516f, 0.283889f, 0.364449f, 0.300507f,
317 0.611331f, 0.264411f, 0.636962f, 0.261221f, 0.655896f, 0.284413f, 0.631484f, 0.283889f,
318 0.344104f, 0.284413f, 0.363038f, 0.261221f, 0.388669f, 0.264411f, 0.368516f, 0.283889f,
319 0.592372f, 0.254897f, 0.600470f, 0.238288f, 0.636962f, 0.261221f, 0.611331f, 0.264411f,
320 0.363038f, 0.261221f, 0.399530f, 0.238288f, 0.407628f, 0.254897f, 0.388669f, 0.264411f,
321 0.559669f, 0.267717f, 0.535885f, 0.215568f, 0.600470f, 0.238288f, 0.592372f, 0.254897f,
322 0.399530f, 0.238288f, 0.464115f, 0.215568f, 0.440331f, 0.267717f, 0.407628f, 0.254897f,
323 0.559669f, 0.267717f, 0.550878f, 0.277832f, 0.500000f, 0.252445f, 0.535885f, 0.215568f,
324 0.500000f, 0.252445f, 0.449122f, 0.277832f, 0.440331f, 0.267717f, 0.464115f, 0.215568f,
325 0.559135f, 0.334326f, 0.539817f, 0.354339f, 0.500000f, 0.340417f, 0.544001f, 0.314523f,
326 0.500000f, 0.340417f, 0.460183f, 0.354339f, 0.440865f, 0.334326f, 0.455999f, 0.314523f,
327 0.544001f, 0.314523f, 0.500000f, 0.340417f, 0.500000f, 0.295691f, 0.543637f, 0.293371f,
328 0.500000f, 0.295691f, 0.500000f, 0.340417f, 0.455999f, 0.314523f, 0.456363f, 0.293371f,
329 0.500000f, 0.252445f, 0.550878f, 0.277832f, 0.543637f, 0.293371f, 0.500000f, 0.295691f,
330 0.456363f, 0.293371f, 0.449122f, 0.277832f, 0.500000f, 0.252445f, 0.500000f, 0.295691f,
331 0.506819f, 0.075382f, 0.500000f, 0.073497f, 0.500000f, 0.064527f, 0.517028f, 0.068490f,
332 0.500000f, 0.064527f, 0.500000f, 0.073497f, 0.493181f, 0.075382f, 0.482972f, 0.068490f,
333 0.511782f, 0.080633f, 0.506819f, 0.075382f, 0.517028f, 0.068490f, 0.522612f, 0.070678f,
334 0.482972f, 0.068490f, 0.493181f, 0.075382f, 0.488218f, 0.080633f, 0.477388f, 0.070678f,
335 0.512172f, 0.093457f, 0.511782f, 0.080633f, 0.522612f, 0.070678f, 0.526301f, 0.079422f,
336 0.477388f, 0.070678f, 0.488218f, 0.080633f, 0.487828f, 0.093457f, 0.473699f, 0.079422f,
337 0.537536f, 0.127779f, 0.514257f, 0.133422f, 0.513874f, 0.097191f, 0.529228f, 0.091098f,
338 0.486126f, 0.097191f, 0.485743f, 0.133422f, 0.462464f, 0.127779f, 0.470772f, 0.091098f,
339 0.512172f, 0.093457f, 0.526301f, 0.079422f, 0.529228f, 0.091098f, 0.513874f, 0.097191f,
340 0.470772f, 0.091098f, 0.473699f, 0.079422f, 0.487828f, 0.093457f, 0.486126f, 0.097191f,
341 0.520226f, 0.164615f, 0.500000f, 0.157864f, 0.500000f, 0.134352f, 0.514257f, 0.133422f,
342 0.500000f, 0.134352f, 0.500000f, 0.157864f, 0.479774f, 0.164615f, 0.485743f, 0.133422f,
343 0.513874f, 0.097191f, 0.514257f, 0.133422f, 0.500000f, 0.134352f, 0.500000f, 0.100063f,
344 0.500000f, 0.134352f, 0.485743f, 0.133422f, 0.486126f, 0.097191f, 0.500000f, 0.100063f,
345 0.500000f, 0.091346f, 0.512172f, 0.093457f, 0.513874f, 0.097191f, 0.500000f, 0.100063f,
346 0.486126f, 0.097191f, 0.487828f, 0.093457f, 0.500000f, 0.091346f, 0.500000f, 0.100063f,
347 0.530258f, 0.180239f, 0.521901f, 0.181560f, 0.517666f, 0.172353f, 0.520226f, 0.164615f,
348 0.482334f, 0.172353f, 0.478099f, 0.181560f, 0.469742f, 0.180239f, 0.479774f, 0.164615f,
349 0.523673f, 0.198817f, 0.518957f, 0.194728f, 0.521901f, 0.181560f, 0.530258f, 0.180239f,
350 0.478099f, 0.181560f, 0.481043f, 0.194728f, 0.476327f, 0.198817f, 0.469742f, 0.180239f,
351 0.500000f, 0.203867f, 0.508211f, 0.197295f, 0.518957f, 0.194728f, 0.523673f, 0.198817f,
352 0.481043f, 0.194728f, 0.491789f, 0.197295f, 0.500000f, 0.203867f, 0.476327f, 0.198817f,
353 0.500000f, 0.197278f, 0.500000f, 0.192167f, 0.508211f, 0.197295f, 0.500000f, 0.203867f,
354 0.491789f, 0.197295f, 0.500000f, 0.192167f, 0.500000f, 0.197278f, 0.500000f, 0.203867f,
355 0.500000f, 0.157864f, 0.520226f, 0.164615f, 0.517666f, 0.172353f, 0.500000f, 0.165170f,
356 0.482334f, 0.172353f, 0.479774f, 0.164615f, 0.500000f, 0.157864f, 0.500000f, 0.165170f,
357 0.500000f, 0.165170f, 0.517666f, 0.172353f, 0.513538f, 0.176949f, 0.500000f, 0.171718f,
358 0.486462f, 0.176949f, 0.482334f, 0.172353f, 0.500000f, 0.165170f, 0.500000f, 0.171718f,
359 0.500000f, 0.192167f, 0.500000f, 0.186182f, 0.508818f, 0.192407f, 0.508211f, 0.197295f,
360 0.491182f, 0.192407f, 0.500000f, 0.186182f, 0.500000f, 0.192167f, 0.491789f, 0.197295f,
361 0.508211f, 0.197295f, 0.508818f, 0.192407f, 0.515232f, 0.190709f, 0.518957f, 0.194728f,
362 0.484768f, 0.190709f, 0.491182f, 0.192407f, 0.491789f, 0.197295f, 0.481043f, 0.194728f,
363 0.518957f, 0.194728f, 0.515232f, 0.190709f, 0.516908f, 0.181873f, 0.521901f, 0.181560f,
364 0.483092f, 0.181873f, 0.484768f, 0.190709f, 0.481043f, 0.194728f, 0.478099f, 0.181560f,
365 0.521901f, 0.181560f, 0.516908f, 0.181873f, 0.513538f, 0.176949f, 0.517666f, 0.172353f,
366 0.486462f, 0.176949f, 0.483092f, 0.181873f, 0.478099f, 0.181560f, 0.482334f, 0.172353f,
367 0.500000f, 0.186182f, 0.516908f, 0.181873f, 0.515232f, 0.190709f, 0.508818f, 0.192407f,
368 0.484768f, 0.190709f, 0.483092f, 0.181873f, 0.500000f, 0.186182f, 0.491182f, 0.192407f,
369 0.500000f, 0.186182f, 0.500000f, 0.171718f, 0.513538f, 0.176949f, 0.516908f, 0.181873f,
370 0.486462f, 0.176949f, 0.500000f, 0.171718f, 0.500000f, 0.186182f, 0.483092f, 0.181873f,
371 0.500000f, 0.203867f, 0.523673f, 0.198817f, 0.535885f, 0.215568f, 0.500000f, 0.252445f,
372 0.464115f, 0.215568f, 0.476327f, 0.198817f, 0.500000f, 0.203867f, 0.500000f, 0.252445f,
373 0.523673f, 0.198817f, 0.530258f, 0.180239f, 0.544209f, 0.172814f, 0.535885f, 0.215568f,
374 0.455791f, 0.172814f, 0.469742f, 0.180239f, 0.476327f, 0.198817f, 0.464115f, 0.215568f,
375 0.530258f, 0.180239f, 0.520226f, 0.164615f, 0.541327f, 0.154899f, 0.544209f, 0.172814f,
376 0.458673f, 0.154899f, 0.479774f, 0.164615f, 0.469742f, 0.180239f, 0.455791f, 0.172814f,
377 0.520226f, 0.164615f, 0.514257f, 0.133422f, 0.537536f, 0.127779f, 0.541327f, 0.154899f,
378 0.462464f, 0.127779f, 0.485743f, 0.133422f, 0.479774f, 0.164615f, 0.458673f, 0.154899f,
379 0.565647f, 0.115495f, 0.578661f, 0.139176f, 0.541327f, 0.154899f, 0.537536f, 0.127779f,
380 0.458673f, 0.154899f, 0.421339f, 0.139176f, 0.434353f, 0.115495f, 0.462464f, 0.127779f,
381 0.578661f, 0.139176f, 0.583245f, 0.154155f, 0.544209f, 0.172814f, 0.541327f, 0.154899f,
382 0.455791f, 0.172814f, 0.416755f, 0.154155f, 0.421339f, 0.139176f, 0.458673f, 0.154899f,
383 0.586916f, 0.172042f, 0.535885f, 0.215568f, 0.544209f, 0.172814f, 0.583245f, 0.154155f,
384 0.455791f, 0.172814f, 0.464115f, 0.215568f, 0.413084f, 0.172042f, 0.416755f, 0.154155f,
385 0.512172f, 0.093457f, 0.500000f, 0.091346f, 0.500000f, 0.089977f, 0.509911f, 0.090724f,
386 0.500000f, 0.089977f, 0.500000f, 0.091346f, 0.487828f, 0.093457f, 0.490089f, 0.090724f,
387 0.511782f, 0.080633f, 0.512172f, 0.093457f, 0.509911f, 0.090724f, 0.509713f, 0.082236f,
388 0.490089f, 0.090724f, 0.487828f, 0.093457f, 0.488218f, 0.080633f, 0.490287f, 0.082236f,
389 0.506819f, 0.075382f, 0.511782f, 0.080633f, 0.509713f, 0.082236f, 0.505196f, 0.077083f,
390 0.490287f, 0.082236f, 0.488218f, 0.080633f, 0.493181f, 0.075382f, 0.494804f, 0.077083f,
391 0.500000f, 0.073497f, 0.506819f, 0.075382f, 0.505196f, 0.077083f, 0.500000f, 0.075473f,
392 0.494804f, 0.077083f, 0.493181f, 0.075382f, 0.500000f, 0.073497f, 0.500000f, 0.075473f,
393 0.500000f, 0.075473f, 0.505196f, 0.077083f, 0.503445f, 0.080840f, 0.500000f, 0.080320f,
394 0.496555f, 0.080840f, 0.494804f, 0.077083f, 0.500000f, 0.075473f, 0.500000f, 0.080320f,
395 0.505196f, 0.077083f, 0.509713f, 0.082236f, 0.506660f, 0.083289f, 0.503445f, 0.080840f,
396 0.493340f, 0.083289f, 0.490287f, 0.082236f, 0.494804f, 0.077083f, 0.496555f, 0.080840f,
397 0.509713f, 0.082236f, 0.509911f, 0.090724f, 0.506822f, 0.086791f, 0.506660f, 0.083289f,
398 0.493178f, 0.086791f, 0.490089f, 0.090724f, 0.490287f, 0.082236f, 0.493340f, 0.083289f,
399 0.509911f, 0.090724f, 0.500000f, 0.089977f, 0.500000f, 0.085637f, 0.506822f, 0.086791f,
400 0.500000f, 0.085637f, 0.500000f, 0.089977f, 0.490089f, 0.090724f, 0.493178f, 0.086791f,
401 0.500000f, 0.085637f, 0.500000f, 0.080320f, 0.503445f, 0.080840f, 0.506822f, 0.086791f,
402 0.496555f, 0.080840f, 0.500000f, 0.080320f, 0.500000f, 0.085637f, 0.493178f, 0.086791f,
403 0.506822f, 0.086791f, 0.503445f, 0.080840f, 0.506660f, 0.083289f, 0.493340f, 0.083289f,
404 0.496555f, 0.080840f, 0.493178f, 0.086791f, 0.543637f, 0.293371f, 0.550878f, 0.277832f,
405 0.562361f, 0.284338f, 0.559190f, 0.294882f, 0.437639f, 0.284338f, 0.449122f, 0.277832f,
406 0.456363f, 0.293371f, 0.440810f, 0.294882f, 0.544001f, 0.314523f, 0.543637f, 0.293371f,
407 0.559190f, 0.294882f, 0.563180f, 0.307151f, 0.440810f, 0.294882f, 0.456363f, 0.293371f,
408 0.455999f, 0.314523f, 0.436820f, 0.307151f, 0.559135f, 0.334326f, 0.544001f, 0.314523f,
409 0.563180f, 0.307151f, 0.570458f, 0.318697f, 0.436820f, 0.307151f, 0.455999f, 0.314523f,
410 0.440865f, 0.334326f, 0.429542f, 0.318697f, 0.550878f, 0.277832f, 0.559669f, 0.267717f,
411 0.569243f, 0.278245f, 0.562361f, 0.284338f, 0.430757f, 0.278245f, 0.440331f, 0.267717f,
412 0.449122f, 0.277832f, 0.437639f, 0.284338f, 0.559669f, 0.267717f, 0.592372f, 0.254897f,
413 0.589914f, 0.271772f, 0.569243f, 0.278245f, 0.410086f, 0.271772f, 0.407628f, 0.254897f,
414 0.440331f, 0.267717f, 0.430757f, 0.278245f, 0.592372f, 0.254897f, 0.611331f, 0.264411f,
415 0.602190f, 0.277180f, 0.589914f, 0.271772f, 0.397810f, 0.277180f, 0.388669f, 0.264411f,
416 0.407628f, 0.254897f, 0.410086f, 0.271772f, 0.611331f, 0.264411f, 0.631484f, 0.283889f,
417 0.617110f, 0.287175f, 0.602190f, 0.277180f, 0.382890f, 0.287175f, 0.368516f, 0.283889f,
418 0.388669f, 0.264411f, 0.397810f, 0.277180f, 0.631484f, 0.283889f, 0.635551f, 0.300507f,
419 0.618074f, 0.299197f, 0.617110f, 0.287175f, 0.381926f, 0.299197f, 0.364449f, 0.300507f,
420 0.368516f, 0.283889f, 0.382890f, 0.287175f, 0.635551f, 0.300507f, 0.628251f, 0.311636f,
421 0.615871f, 0.307438f, 0.618074f, 0.299197f, 0.384129f, 0.307438f, 0.371749f, 0.311636f,
422 0.364449f, 0.300507f, 0.381926f, 0.299197f, 0.628251f, 0.311636f, 0.606163f, 0.325516f,
423 0.598424f, 0.313725f, 0.615871f, 0.307438f, 0.401576f, 0.313725f, 0.393837f, 0.325516f,
424 0.371749f, 0.311636f, 0.384129f, 0.307438f, 0.606163f, 0.325516f, 0.592090f, 0.332885f,
425 0.590828f, 0.319797f, 0.598424f, 0.313725f, 0.409172f, 0.319797f, 0.407910f, 0.332885f,
426 0.393837f, 0.325516f, 0.401576f, 0.313725f, 0.592090f, 0.332885f, 0.579057f, 0.335646f,
427 0.582130f, 0.320991f, 0.590828f, 0.319797f, 0.417870f, 0.320991f, 0.420943f, 0.335646f,
428 0.407910f, 0.332885f, 0.409172f, 0.319797f, 0.579057f, 0.335646f, 0.559135f, 0.334326f,
429 0.570458f, 0.318697f, 0.582130f, 0.320991f, 0.429542f, 0.318697f, 0.440865f, 0.334326f,
430 0.420943f, 0.335646f, 0.417870f, 0.320991f, 0.582130f, 0.320991f, 0.570458f, 0.318697f,
431 0.578615f, 0.309394f, 0.583998f, 0.312892f, 0.421385f, 0.309394f, 0.429542f, 0.318697f,
432 0.417870f, 0.320991f, 0.416002f, 0.312892f, 0.590828f, 0.319797f, 0.582130f, 0.320991f,
433 0.583998f, 0.312892f, 0.589656f, 0.312336f, 0.416002f, 0.312892f, 0.417870f, 0.320991f,
434 0.409172f, 0.319797f, 0.410344f, 0.312336f, 0.598424f, 0.313725f, 0.590828f, 0.319797f,
435 0.589656f, 0.312336f, 0.596347f, 0.309249f, 0.410344f, 0.312336f, 0.409172f, 0.319797f,
436 0.401576f, 0.313725f, 0.403653f, 0.309249f, 0.615871f, 0.307438f, 0.598424f, 0.313725f,
437 0.596347f, 0.309249f, 0.606014f, 0.302517f, 0.403653f, 0.309249f, 0.401576f, 0.313725f,
438 0.384129f, 0.307438f, 0.393986f, 0.302517f, 0.618074f, 0.299197f, 0.615871f, 0.307438f,
439 0.606014f, 0.302517f, 0.607735f, 0.297520f, 0.393986f, 0.302517f, 0.384129f, 0.307438f,
440 0.381926f, 0.299197f, 0.392265f, 0.297520f, 0.617110f, 0.287175f, 0.618074f, 0.299197f,
441 0.607735f, 0.297520f, 0.606985f, 0.291216f, 0.392265f, 0.297520f, 0.381926f, 0.299197f,
442 0.382890f, 0.287175f, 0.393015f, 0.291216f, 0.602190f, 0.277180f, 0.617110f, 0.287175f,
443 0.606985f, 0.291216f, 0.598275f, 0.283083f, 0.393015f, 0.291216f, 0.382890f, 0.287175f,
444 0.397810f, 0.277180f, 0.401725f, 0.283083f, 0.589914f, 0.271772f, 0.602190f, 0.277180f,
445 0.598275f, 0.283083f, 0.589866f, 0.280167f, 0.401725f, 0.283083f, 0.397810f, 0.277180f,
446 0.410086f, 0.271772f, 0.410134f, 0.280167f, 0.569243f, 0.278245f, 0.589914f, 0.271772f,
447 0.589866f, 0.280167f, 0.576352f, 0.284624f, 0.410134f, 0.280167f, 0.410086f, 0.271772f,
448 0.430757f, 0.278245f, 0.423648f, 0.284624f, 0.562361f, 0.284338f, 0.569243f, 0.278245f,
449 0.576352f, 0.284624f, 0.572831f, 0.289915f, 0.423648f, 0.284624f, 0.430757f, 0.278245f,
450 0.437639f, 0.284338f, 0.427169f, 0.289915f, 0.570458f, 0.318697f, 0.563180f, 0.307151f,
451 0.573307f, 0.303342f, 0.578615f, 0.309394f, 0.426693f, 0.303342f, 0.436820f, 0.307151f,
452 0.429542f, 0.318697f, 0.421385f, 0.309394f, 0.563180f, 0.307151f, 0.559190f, 0.294882f,
453 0.572447f, 0.295716f, 0.573307f, 0.303342f, 0.427553f, 0.295716f, 0.440810f, 0.294882f,
454 0.436820f, 0.307151f, 0.426693f, 0.303342f, 0.559190f, 0.294882f, 0.562361f, 0.284338f,
455 0.572831f, 0.289915f, 0.572447f, 0.295716f, 0.427169f, 0.289915f, 0.437639f, 0.284338f,
456 0.440810f, 0.294882f, 0.427553f, 0.295716f, 0.500000f, 0.382860f, 0.532016f, 0.387365f,
457 0.529647f, 0.428636f, 0.500000f, 0.428636f, 0.470353f, 0.428636f, 0.467984f, 0.387365f,
458 0.500000f, 0.382860f, 0.500000f, 0.428636f, 0.532016f, 0.387365f, 0.581044f, 0.398468f,
459 0.584616f, 0.428636f, 0.529647f, 0.428636f, 0.415384f, 0.428636f, 0.418956f, 0.398468f,
460 0.467984f, 0.387365f, 0.470353f, 0.428636f, 0.581044f, 0.398468f, 0.602261f, 0.395588f,
461 0.622301f, 0.417889f, 0.584616f, 0.428636f, 0.377699f, 0.417889f, 0.397739f, 0.395588f,
462 0.418956f, 0.398468f, 0.415384f, 0.428636f, 0.602261f, 0.395588f, 0.636775f, 0.370732f,
463 0.666214f, 0.388954f, 0.622301f, 0.417889f, 0.333786f, 0.388954f, 0.363225f, 0.370732f,
464 0.397739f, 0.395588f, 0.377699f, 0.417889f, 0.636775f, 0.370732f, 0.671357f, 0.334694f,
465 0.701481f, 0.344467f, 0.666214f, 0.388954f, 0.298519f, 0.344467f, 0.328643f, 0.334694f,
466 0.363225f, 0.370732f, 0.333786f, 0.388954f, 0.671357f, 0.334694f, 0.684517f, 0.317795f,
467 0.712163f, 0.315527f, 0.701481f, 0.344467f, 0.287837f, 0.315527f, 0.315483f, 0.317795f,
468 0.328643f, 0.334694f, 0.298519f, 0.344467f, 0.684517f, 0.317795f, 0.689501f, 0.268805f,
469 0.704305f, 0.260225f, 0.712163f, 0.315527f, 0.295695f, 0.260225f, 0.310499f, 0.268805f,
470 0.315483f, 0.317795f, 0.287837f, 0.315527f, 0.689501f, 0.268805f, 0.650908f, 0.240294f,
471 0.672947f, 0.224880f, 0.704305f, 0.260225f, 0.327053f, 0.224880f, 0.349092f, 0.240294f,
472 0.310499f, 0.268805f, 0.295695f, 0.260225f, 0.650908f, 0.240294f, 0.626605f, 0.208159f,
473 0.640497f, 0.198841f, 0.672947f, 0.224880f, 0.359503f, 0.198841f, 0.373395f, 0.208159f,
474 0.349092f, 0.240294f, 0.327053f, 0.224880f, 0.603553f, 0.023452f, 0.625128f, 0.029461f,
475 0.635753f, 0.082198f, 0.598617f, 0.056841f, 0.364247f, 0.082198f, 0.374872f, 0.029461f,
476 0.396447f, 0.023452f, 0.401383f, 0.056841f, 0.546781f, 0.009442f, 0.603553f, 0.023452f,
477 0.598617f, 0.056841f, 0.556354f, 0.040906f, 0.401383f, 0.056841f, 0.396447f, 0.023452f,
478 0.453219f, 0.009442f, 0.443646f, 0.040906f, 0.500000f, 0.033223f, 0.546781f, 0.009442f,
479 0.556354f, 0.040906f, 0.527159f, 0.049514f, 0.443646f, 0.040906f, 0.453219f, 0.009442f,
480 0.500000f, 0.033223f, 0.472841f, 0.049514f, 0.520711f, 0.060503f, 0.500000f, 0.054411f,
481 0.500000f, 0.033223f, 0.527159f, 0.049514f, 0.500000f, 0.033223f, 0.500000f, 0.054411f,
482 0.479289f, 0.060503f, 0.472841f, 0.049514f, 0.530457f, 0.065062f, 0.520711f, 0.060503f,
483 0.527159f, 0.049514f, 0.537222f, 0.060794f, 0.472841f, 0.049514f, 0.479289f, 0.060503f,
484 0.469543f, 0.065062f, 0.462778f, 0.060794f, 0.532878f, 0.067822f, 0.530457f, 0.065062f,
485 0.537222f, 0.060794f, 0.558499f, 0.065137f, 0.462778f, 0.060794f, 0.469543f, 0.065062f,
486 0.467122f, 0.067822f, 0.441501f, 0.065137f, 0.544695f, 0.083023f, 0.532878f, 0.067822f,
487 0.558499f, 0.065137f, 0.588127f, 0.085177f, 0.441501f, 0.065137f, 0.467122f, 0.067822f,
488 0.455305f, 0.083023f, 0.411873f, 0.085177f, 0.558499f, 0.065137f, 0.556354f, 0.040906f,
489 0.598617f, 0.056841f, 0.588127f, 0.085177f, 0.401383f, 0.056841f, 0.443646f, 0.040906f,
490 0.441501f, 0.065137f, 0.411873f, 0.085177f, 0.558499f, 0.065137f, 0.537222f, 0.060794f,
491 0.527159f, 0.049514f, 0.556354f, 0.040906f, 0.472841f, 0.049514f, 0.462778f, 0.060794f,
492 0.441501f, 0.065137f, 0.443646f, 0.040906f, 0.607239f, 0.113940f, 0.588127f, 0.085177f,
493 0.598617f, 0.056841f, 0.635753f, 0.082198f, 0.401383f, 0.056841f, 0.411873f, 0.085177f,
494 0.392761f, 0.113940f, 0.364247f, 0.082198f, 0.565647f, 0.115495f, 0.544695f, 0.083023f,
495 0.588127f, 0.085177f, 0.607239f, 0.113940f, 0.411873f, 0.085177f, 0.455305f, 0.083023f,
496 0.434353f, 0.115495f, 0.392761f, 0.113940f, 0.578661f, 0.139176f, 0.612663f, 0.133675f,
497 0.605467f, 0.151503f, 0.583245f, 0.154155f, 0.394533f, 0.151503f, 0.387337f, 0.133675f,
498 0.421339f, 0.139176f, 0.416755f, 0.154155f, 0.565647f, 0.115495f, 0.607239f, 0.113940f,
499 0.612663f, 0.133675f, 0.578661f, 0.139176f, 0.387337f, 0.133675f, 0.392761f, 0.113940f,
500 0.434353f, 0.115495f, 0.421339f, 0.139176f, 0.586916f, 0.172042f, 0.583245f, 0.154155f,
501 0.605467f, 0.151503f, 0.600708f, 0.162985f, 0.394533f, 0.151503f, 0.416755f, 0.154155f,
502 0.413084f, 0.172042f, 0.399292f, 0.162985f, 0.586916f, 0.172042f, 0.600708f, 0.162985f,
503 0.640497f, 0.198841f, 0.626605f, 0.208159f, 0.359503f, 0.198841f, 0.399292f, 0.162985f,
504 0.413084f, 0.172042f, 0.373395f, 0.208159f, 0.922374f, 0.064228f, 0.859647f, 0.117994f,
505 0.823287f, 0.101559f, 0.861342f, 0.027230f, 0.176713f, 0.101559f, 0.140353f, 0.117994f,
506 0.077626f, 0.064228f, 0.138658f, 0.027230f, 0.861342f, 0.027230f, 0.823287f, 0.101559f,
507 0.765863f, 0.087001f, 0.774604f, 0.010837f, 0.234137f, 0.087001f, 0.176713f, 0.101559f,
508 0.138658f, 0.027230f, 0.225396f, 0.010837f, 0.774604f, 0.010837f, 0.765863f, 0.087001f,
509 0.661952f, 0.087561f, 0.647010f, 0.028716f, 0.338048f, 0.087561f, 0.234137f, 0.087001f,
510 0.225396f, 0.010837f, 0.352990f, 0.028716f, 0.647010f, 0.028716f, 0.661952f, 0.087561f,
511 0.635753f, 0.082198f, 0.625128f, 0.029461f, 0.364247f, 0.082198f, 0.338048f, 0.087561f,
512 0.352990f, 0.028716f, 0.374872f, 0.029461f, 0.607239f, 0.113940f, 0.635753f, 0.082198f,
513 0.661952f, 0.087561f, 0.612663f, 0.133675f, 0.338048f, 0.087561f, 0.364247f, 0.082198f,
514 0.392761f, 0.113940f, 0.387337f, 0.133675f, 0.704305f, 0.260225f, 0.672947f, 0.224880f,
515 0.743592f, 0.198572f, 0.766410f, 0.233065f, 0.256408f, 0.198572f, 0.327053f, 0.224880f,
516 0.295695f, 0.260225f, 0.233590f, 0.233065f, 0.987633f, 0.154243f, 0.889478f, 0.177602f,
517 0.859647f, 0.117994f, 0.922374f, 0.064228f, 0.140353f, 0.117994f, 0.110522f, 0.177602f,
518 0.012367f, 0.154243f, 0.077626f, 0.064228f, 0.899807f, 0.420886f, 0.844317f, 0.347370f,
519 0.881169f, 0.309153f, 0.958963f, 0.357385f, 0.118831f, 0.309153f, 0.155683f, 0.347370f,
520 0.100193f, 0.420886f, 0.041037f, 0.357385f, 0.958963f, 0.357385f, 0.881169f, 0.309153f,
521 0.903302f, 0.261367f, 0.999860f, 0.253531f, 0.096698f, 0.261367f, 0.118831f, 0.309153f,
522 0.041037f, 0.357385f, 0.000140f, 0.253531f, 0.999860f, 0.253531f, 0.903302f, 0.261367f,
523 0.889478f, 0.177602f, 0.987633f, 0.154243f, 0.110522f, 0.177602f, 0.096698f, 0.261367f,
524 0.000140f, 0.253531f, 0.012367f, 0.154243f, 0.724763f, 0.340212f, 0.712163f, 0.315527f,
525 0.744725f, 0.304629f, 0.766113f, 0.319494f, 0.255275f, 0.304629f, 0.287837f, 0.315527f,
526 0.275237f, 0.340212f, 0.233887f, 0.319494f, 0.766113f, 0.319494f, 0.744725f, 0.304629f,
527 0.793427f, 0.280495f, 0.826663f, 0.297810f, 0.206573f, 0.280495f, 0.255275f, 0.304629f,
528 0.233887f, 0.319494f, 0.173337f, 0.297810f, 0.826663f, 0.297810f, 0.793427f, 0.280495f,
529 0.823620f, 0.254612f, 0.855331f, 0.267956f, 0.176380f, 0.254612f, 0.206573f, 0.280495f,
530 0.173337f, 0.297810f, 0.144669f, 0.267956f, 0.855331f, 0.267956f, 0.823620f, 0.254612f,
531 0.835860f, 0.225225f, 0.868309f, 0.233525f, 0.164140f, 0.225225f, 0.176380f, 0.254612f,
532 0.144669f, 0.267956f, 0.131691f, 0.233525f, 0.813499f, 0.190705f, 0.851288f, 0.181145f,
533 0.868309f, 0.233525f, 0.835860f, 0.225225f, 0.131691f, 0.233525f, 0.148712f, 0.181145f,
534 0.186501f, 0.190705f, 0.164140f, 0.225225f, 0.889478f, 0.177602f, 0.903302f, 0.261367f,
535 0.868309f, 0.233525f, 0.851288f, 0.181145f, 0.131691f, 0.233525f, 0.096698f, 0.261367f,
536 0.110522f, 0.177602f, 0.148712f, 0.181145f, 0.903302f, 0.261367f, 0.881169f, 0.309153f,
537 0.855331f, 0.267956f, 0.868309f, 0.233525f, 0.144669f, 0.267956f, 0.118831f, 0.309153f,
538 0.096698f, 0.261367f, 0.131691f, 0.233525f, 0.881169f, 0.309153f, 0.844317f, 0.347370f,
539 0.826663f, 0.297810f, 0.855331f, 0.267956f, 0.173337f, 0.297810f, 0.155683f, 0.347370f,
540 0.118831f, 0.309153f, 0.144669f, 0.267956f, 0.844317f, 0.347370f, 0.772263f, 0.374010f,
541 0.766113f, 0.319494f, 0.826663f, 0.297810f, 0.233887f, 0.319494f, 0.227737f, 0.374010f,
542 0.155683f, 0.347370f, 0.173337f, 0.297810f, 0.744519f, 0.390057f, 0.724763f, 0.340212f,
543 0.766113f, 0.319494f, 0.772263f, 0.374010f, 0.233887f, 0.319494f, 0.275237f, 0.340212f,
544 0.255481f, 0.390057f, 0.227737f, 0.374010f, 0.824765f, 0.470987f, 0.772263f, 0.374010f,
545 0.844317f, 0.347370f, 0.899807f, 0.420886f, 0.155683f, 0.347370f, 0.227737f, 0.374010f,
546 0.175235f, 0.470987f, 0.100193f, 0.420886f, 0.792141f, 0.464714f, 0.742181f, 0.461543f,
547 0.726855f, 0.432574f, 0.744519f, 0.390057f, 0.273145f, 0.432574f, 0.257819f, 0.461543f,
548 0.207859f, 0.464714f, 0.255481f, 0.390057f, 0.792141f, 0.464714f, 0.744519f, 0.390057f,
549 0.772263f, 0.374010f, 0.824765f, 0.470987f, 0.227737f, 0.374010f, 0.255481f, 0.390057f,
550 0.207859f, 0.464714f, 0.175235f, 0.470987f, 0.795638f, 0.489991f, 0.792141f, 0.464714f,
551 0.824765f, 0.470987f, 0.175235f, 0.470987f, 0.207859f, 0.464714f, 0.204362f, 0.489991f,
552 0.712163f, 0.315527f, 0.704305f, 0.260225f, 0.766410f, 0.233065f, 0.744725f, 0.304629f,
553 0.233590f, 0.233065f, 0.295695f, 0.260225f, 0.287837f, 0.315527f, 0.255275f, 0.304629f,
554 0.766410f, 0.233065f, 0.786137f, 0.227788f, 0.793427f, 0.280495f, 0.744725f, 0.304629f,
555 0.206573f, 0.280495f, 0.213863f, 0.227788f, 0.233590f, 0.233065f, 0.255275f, 0.304629f,
556 0.786137f, 0.227788f, 0.802950f, 0.203415f, 0.823620f, 0.254612f, 0.793427f, 0.280495f,
557 0.176380f, 0.254612f, 0.197050f, 0.203415f, 0.213863f, 0.227788f, 0.206573f, 0.280495f,
558 0.813499f, 0.190705f, 0.835860f, 0.225225f, 0.823620f, 0.254612f, 0.802950f, 0.203415f,
559 0.176380f, 0.254612f, 0.164140f, 0.225225f, 0.186501f, 0.190705f, 0.197050f, 0.203415f,
560 0.661952f, 0.087561f, 0.765863f, 0.087001f, 0.769334f, 0.128771f, 0.691484f, 0.146686f,
561 0.230666f, 0.128771f, 0.234137f, 0.087001f, 0.338048f, 0.087561f, 0.308516f, 0.146686f,
562 0.743592f, 0.198572f, 0.691484f, 0.146686f, 0.769334f, 0.128771f, 0.780113f, 0.169386f,
563 0.230666f, 0.128771f, 0.308516f, 0.146686f, 0.256408f, 0.198572f, 0.219887f, 0.169386f,
564 0.672947f, 0.224880f, 0.640497f, 0.198841f, 0.691484f, 0.146686f, 0.743592f, 0.198572f,
565 0.308516f, 0.146686f, 0.359503f, 0.198841f, 0.327053f, 0.224880f, 0.256408f, 0.198572f,
566 0.640497f, 0.198841f, 0.605467f, 0.151503f, 0.612663f, 0.133675f, 0.691484f, 0.146686f,
567 0.387337f, 0.133675f, 0.394533f, 0.151503f, 0.359503f, 0.198841f, 0.308516f, 0.146686f,
568 0.612663f, 0.133675f, 0.661952f, 0.087561f, 0.691484f, 0.146686f, 0.308516f, 0.146686f,
569 0.338048f, 0.087561f, 0.387337f, 0.133675f, 0.640497f, 0.198841f, 0.600708f, 0.162985f,
570 0.605467f, 0.151503f, 0.394533f, 0.151503f, 0.399292f, 0.162985f, 0.359503f, 0.198841f,
571 0.813499f, 0.190705f, 0.803789f, 0.171181f, 0.830917f, 0.139518f, 0.851288f, 0.181145f,
572 0.169083f, 0.139518f, 0.196211f, 0.171181f, 0.186501f, 0.190705f, 0.148712f, 0.181145f,
573 0.889478f, 0.177602f, 0.851288f, 0.181145f, 0.830917f, 0.139518f, 0.859647f, 0.117994f,
574 0.169083f, 0.139518f, 0.148712f, 0.181145f, 0.110522f, 0.177602f, 0.140353f, 0.117994f,
575 0.780113f, 0.169386f, 0.769334f, 0.128771f, 0.830917f, 0.139518f, 0.803789f, 0.171181f,
576 0.169083f, 0.139518f, 0.230666f, 0.128771f, 0.219887f, 0.169386f, 0.196211f, 0.171181f,
577 0.765863f, 0.087001f, 0.823287f, 0.101559f, 0.830917f, 0.139518f, 0.769334f, 0.128771f,
578 0.169083f, 0.139518f, 0.176713f, 0.101559f, 0.234137f, 0.087001f, 0.230666f, 0.128771f,
579 0.859647f, 0.117994f, 0.830917f, 0.139518f, 0.823287f, 0.101559f, 0.176713f, 0.101559f,
580 0.169083f, 0.139518f, 0.140353f, 0.117994f, 0.574628f, 0.959188f, 0.464516f, 0.959188f,
581 0.477326f, 0.891852f, 0.545439f, 0.884582f, 0.272900f, 0.891852f, 0.285710f, 0.959188f,
582 0.175598f, 0.959188f, 0.204787f, 0.884582f, 0.574628f, 0.959188f, 0.545439f, 0.884582f,
583 0.605134f, 0.846978f, 0.715894f, 0.897069f, 0.145092f, 0.846978f, 0.204787f, 0.884582f,
584 0.175598f, 0.959188f, 0.034332f, 0.897069f, 0.715894f, 0.897069f, 0.605134f, 0.846978f,
585 0.605360f, 0.784410f, 0.683874f, 0.757011f, 0.144866f, 0.784410f, 0.145092f, 0.846978f,
586 0.034332f, 0.897069f, 0.066352f, 0.757011f, 0.683874f, 0.757011f, 0.605360f, 0.784410f,
587 0.574835f, 0.744212f, 0.617867f, 0.719156f, 0.175391f, 0.744212f, 0.144866f, 0.784410f,
588 0.066352f, 0.757011f, 0.132359f, 0.719156f, 0.617867f, 0.719156f, 0.574835f, 0.744212f,
589 0.534996f, 0.712528f, 0.568728f, 0.682132f, 0.215230f, 0.712528f, 0.175391f, 0.744212f,
590 0.132359f, 0.719156f, 0.181498f, 0.682132f, 0.568728f, 0.682132f, 0.534996f, 0.712528f,
591 0.483006f, 0.686791f, 0.508539f, 0.641024f, 0.267220f, 0.686791f, 0.215230f, 0.712528f,
592 0.181498f, 0.682132f, 0.241687f, 0.641024f, 0.534996f, 0.712528f, 0.513415f, 0.736977f,
593 0.478880f, 0.719593f, 0.483006f, 0.686791f, 0.271346f, 0.719593f, 0.236811f, 0.736977f,
594 0.215230f, 0.712528f, 0.267220f, 0.686791f, 0.574835f, 0.744212f, 0.541117f, 0.760754f,
595 0.513415f, 0.736977f, 0.534996f, 0.712528f, 0.236811f, 0.736977f, 0.209109f, 0.760754f,
596 0.175391f, 0.744212f, 0.215230f, 0.712528f, 0.605360f, 0.784410f, 0.557599f, 0.789442f,
597 0.541117f, 0.760754f, 0.574835f, 0.744212f, 0.209109f, 0.760754f, 0.192627f, 0.789442f,
598 0.144866f, 0.784410f, 0.175391f, 0.744212f, 0.605134f, 0.846978f, 0.553841f, 0.821849f,
599 0.557599f, 0.789442f, 0.605360f, 0.784410f, 0.192627f, 0.789442f, 0.196385f, 0.821849f,
600 0.145092f, 0.846978f, 0.144866f, 0.784410f, 0.545439f, 0.884582f, 0.524671f, 0.842380f,
601 0.553841f, 0.821849f, 0.605134f, 0.846978f, 0.196385f, 0.821849f, 0.225555f, 0.842380f,
602 0.204787f, 0.884582f, 0.145092f, 0.846978f, 0.545439f, 0.884582f, 0.477326f, 0.891852f,
603 0.485193f, 0.845321f, 0.524671f, 0.842380f, 0.265033f, 0.845321f, 0.272900f, 0.891852f,
604 0.204787f, 0.884582f, 0.225555f, 0.842380f, 0.743592f, 0.198572f, 0.780113f, 0.169386f,
605 0.786150f, 0.181127f, 0.770208f, 0.191225f, 0.213850f, 0.181127f, 0.219887f, 0.169386f,
606 0.256408f, 0.198572f, 0.229792f, 0.191225f, 0.408153f, 0.587507f, 0.508539f, 0.641024f,
607 0.483006f, 0.686791f, 0.409610f, 0.674022f, 0.267220f, 0.686791f, 0.241687f, 0.641024f,
608 0.342073f, 0.587507f, 0.340616f, 0.674022f, 0.766410f, 0.233065f, 0.743592f, 0.198572f,
609 0.770208f, 0.191225f, 0.786137f, 0.227788f, 0.229792f, 0.191225f, 0.256408f, 0.198572f,
610 0.233590f, 0.233065f, 0.213863f, 0.227788f, 0.400301f, 0.910556f, 0.414155f, 0.878318f,
611 0.477326f, 0.891852f, 0.464516f, 0.959188f, 0.272900f, 0.891852f, 0.336071f, 0.878318f,
612 0.349925f, 0.910556f, 0.285710f, 0.959188f, 0.483006f, 0.686791f, 0.478880f, 0.719593f,
613 0.443630f, 0.713731f, 0.409610f, 0.674022f, 0.306596f, 0.713731f, 0.271346f, 0.719593f,
614 0.267220f, 0.686791f, 0.340616f, 0.674022f, 0.429725f, 0.728622f, 0.392812f, 0.710774f,
615 0.409610f, 0.674022f, 0.443630f, 0.713731f, 0.340616f, 0.674022f, 0.357414f, 0.710774f,
616 0.320501f, 0.728622f, 0.306596f, 0.713731f, 0.422979f, 0.754609f, 0.392812f, 0.710774f,
617 0.429725f, 0.728622f, 0.432640f, 0.746527f, 0.320501f, 0.728622f, 0.357414f, 0.710774f,
618 0.327247f, 0.754609f, 0.317586f, 0.746527f, 0.427719f, 0.796173f, 0.391578f, 0.815187f,
619 0.392812f, 0.710774f, 0.422979f, 0.754609f, 0.357414f, 0.710774f, 0.358648f, 0.815187f,
620 0.322507f, 0.796173f, 0.327247f, 0.754609f, 0.414155f, 0.878318f, 0.391578f, 0.815187f,
621 0.427719f, 0.796173f, 0.448277f, 0.830976f, 0.322507f, 0.796173f, 0.358648f, 0.815187f,
622 0.336071f, 0.878318f, 0.301949f, 0.830976f, 0.477326f, 0.891852f, 0.414155f, 0.878318f,
623 0.448277f, 0.830976f, 0.485193f, 0.845321f, 0.301949f, 0.830976f, 0.336071f, 0.878318f,
624 0.272900f, 0.891852f, 0.265033f, 0.845321f, 0.786137f, 0.227788f, 0.797710f, 0.195652f,
625 0.802580f, 0.199758f, 0.802950f, 0.203415f, 0.197420f, 0.199758f, 0.202290f, 0.195652f,
626 0.213863f, 0.227788f, 0.197050f, 0.203415f, 0.786137f, 0.227788f, 0.770208f, 0.191225f,
627 0.789609f, 0.184671f, 0.797710f, 0.195652f, 0.210391f, 0.184671f, 0.229792f, 0.191225f,
628 0.213863f, 0.227788f, 0.202290f, 0.195652f, 0.770208f, 0.191225f, 0.786150f, 0.181127f,
629 0.789609f, 0.184671f, 0.210391f, 0.184671f, 0.213850f, 0.181127f, 0.229792f, 0.191225f,
630 0.485193f, 0.845321f, 0.448277f, 0.830976f, 0.466042f, 0.804091f, 0.490498f, 0.816075f,
631 0.284184f, 0.804091f, 0.301949f, 0.830976f, 0.265033f, 0.845321f, 0.259728f, 0.816075f,
632 0.448277f, 0.830976f, 0.427719f, 0.796173f, 0.448042f, 0.783921f, 0.466042f, 0.804091f,
633 0.302184f, 0.783921f, 0.322507f, 0.796173f, 0.301949f, 0.830976f, 0.284184f, 0.804091f,
634 0.427719f, 0.796173f, 0.422979f, 0.754609f, 0.438745f, 0.764960f, 0.448042f, 0.783921f,
635 0.311481f, 0.764960f, 0.327247f, 0.754609f, 0.322507f, 0.796173f, 0.302184f, 0.783921f,
636 0.422979f, 0.754609f, 0.432640f, 0.746527f, 0.445216f, 0.756351f, 0.438745f, 0.764960f,
637 0.305010f, 0.756351f, 0.317586f, 0.746527f, 0.327247f, 0.754609f, 0.311481f, 0.764960f,
638 0.432640f, 0.746527f, 0.429725f, 0.728622f, 0.449819f, 0.743458f, 0.445216f, 0.756351f,
639 0.300407f, 0.743458f, 0.320501f, 0.728622f, 0.317586f, 0.746527f, 0.305010f, 0.756351f,
640 0.429725f, 0.728622f, 0.443630f, 0.713731f, 0.456307f, 0.732687f, 0.449819f, 0.743458f,
641 0.293919f, 0.732687f, 0.306596f, 0.713731f, 0.320501f, 0.728622f, 0.300407f, 0.743458f,
642 0.443630f, 0.713731f, 0.478880f, 0.719593f, 0.475471f, 0.740871f, 0.456307f, 0.732687f,
643 0.274755f, 0.740871f, 0.271346f, 0.719593f, 0.306596f, 0.713731f, 0.293919f, 0.732687f,
644 0.524671f, 0.842380f, 0.485193f, 0.845321f, 0.490498f, 0.816075f, 0.514211f, 0.817769f,
645 0.259728f, 0.816075f, 0.265033f, 0.845321f, 0.225555f, 0.842380f, 0.236015f, 0.817769f,
646 0.553841f, 0.821849f, 0.524671f, 0.842380f, 0.514211f, 0.817769f, 0.527961f, 0.808598f,
647 0.236015f, 0.817769f, 0.225555f, 0.842380f, 0.196385f, 0.821849f, 0.222265f, 0.808598f,
648 0.557599f, 0.789442f, 0.553841f, 0.821849f, 0.527961f, 0.808598f, 0.530079f, 0.790754f,
649 0.222265f, 0.808598f, 0.196385f, 0.821849f, 0.192627f, 0.789442f, 0.220147f, 0.790754f,
650 0.541117f, 0.760754f, 0.557599f, 0.789442f, 0.530079f, 0.790754f, 0.518620f, 0.772385f,
651 0.220147f, 0.790754f, 0.192627f, 0.789442f, 0.209109f, 0.760754f, 0.231606f, 0.772385f,
652 0.513415f, 0.736977f, 0.541117f, 0.760754f, 0.518620f, 0.772385f, 0.498668f, 0.755033f,
653 0.231606f, 0.772385f, 0.209109f, 0.760754f, 0.236811f, 0.736977f, 0.251558f, 0.755033f,
654 0.478880f, 0.719593f, 0.513415f, 0.736977f, 0.498668f, 0.755033f, 0.475471f, 0.740871f,
655 0.251558f, 0.755033f, 0.236811f, 0.736977f, 0.271346f, 0.719593f, 0.274755f, 0.740871f,
656 0.445216f, 0.756351f, 0.449819f, 0.743458f, 0.468029f, 0.756171f, 0.459660f, 0.770459f,
657 0.282197f, 0.756171f, 0.300407f, 0.743458f, 0.305010f, 0.756351f, 0.290566f, 0.770459f,
658 0.459660f, 0.770459f, 0.468029f, 0.756171f, 0.487167f, 0.769899f, 0.477354f, 0.785393f,
659 0.263059f, 0.769899f, 0.282197f, 0.756171f, 0.290566f, 0.770459f, 0.272872f, 0.785393f,
660 0.477354f, 0.785393f, 0.487167f, 0.769899f, 0.504617f, 0.782999f, 0.496545f, 0.797122f,
661 0.245609f, 0.782999f, 0.263059f, 0.769899f, 0.272872f, 0.785393f, 0.253681f, 0.797122f,
662 0.496545f, 0.797122f, 0.504617f, 0.782999f, 0.516137f, 0.792591f, 0.513713f, 0.804019f,
663 0.234089f, 0.792591f, 0.245609f, 0.782999f, 0.253681f, 0.797122f, 0.236513f, 0.804019f,
664 0.514211f, 0.817769f, 0.490498f, 0.816075f, 0.496545f, 0.797122f, 0.513713f, 0.804019f,
665 0.253681f, 0.797122f, 0.259728f, 0.816075f, 0.236015f, 0.817769f, 0.236513f, 0.804019f,
666 0.466042f, 0.804091f, 0.477354f, 0.785393f, 0.496545f, 0.797122f, 0.490498f, 0.816075f,
667 0.253681f, 0.797122f, 0.272872f, 0.785393f, 0.284184f, 0.804091f, 0.259728f, 0.816075f,
668 0.466042f, 0.804091f, 0.448042f, 0.783921f, 0.459660f, 0.770459f, 0.477354f, 0.785393f,
669 0.290566f, 0.770459f, 0.302184f, 0.783921f, 0.284184f, 0.804091f, 0.272872f, 0.785393f,
670 0.445216f, 0.756351f, 0.459660f, 0.770459f, 0.448042f, 0.783921f, 0.438745f, 0.764960f,
671 0.302184f, 0.783921f, 0.290566f, 0.770459f, 0.305010f, 0.756351f, 0.311481f, 0.764960f,
672 0.456307f, 0.732687f, 0.475471f, 0.740871f, 0.468029f, 0.756171f, 0.449819f, 0.743458f,
673 0.282197f, 0.756171f, 0.274755f, 0.740871f, 0.293919f, 0.732687f, 0.300407f, 0.743458f,
674 0.498668f, 0.755033f, 0.487167f, 0.769899f, 0.468029f, 0.756171f, 0.475471f, 0.740871f,
675 0.282197f, 0.756171f, 0.263059f, 0.769899f, 0.251558f, 0.755033f, 0.274755f, 0.740871f,
676 0.518620f, 0.772385f, 0.504617f, 0.782999f, 0.487167f, 0.769899f, 0.498668f, 0.755033f,
677 0.263059f, 0.769899f, 0.245609f, 0.782999f, 0.231606f, 0.772385f, 0.251558f, 0.755033f,
678 0.530079f, 0.790754f, 0.516137f, 0.792591f, 0.504617f, 0.782999f, 0.518620f, 0.772385f,
679 0.245609f, 0.782999f, 0.234089f, 0.792591f, 0.220147f, 0.790754f, 0.231606f, 0.772385f,
680 0.527961f, 0.808598f, 0.513713f, 0.804019f, 0.516137f, 0.792591f, 0.530079f, 0.790754f,
681 0.234089f, 0.792591f, 0.236513f, 0.804019f, 0.222265f, 0.808598f, 0.220147f, 0.790754f,
682 0.514211f, 0.817769f, 0.513713f, 0.804019f, 0.527961f, 0.808598f, 0.222265f, 0.808598f,
683 0.236513f, 0.804019f, 0.236015f, 0.817769f, 0.568728f, 0.682132f, 0.508539f, 0.641024f,
684 0.574269f, 0.607668f, 0.613510f, 0.655816f, 0.175957f, 0.607668f, 0.241687f, 0.641024f,
685 0.181498f, 0.682132f, 0.136716f, 0.655816f, 0.617867f, 0.719156f, 0.568728f, 0.682132f,
686 0.613510f, 0.655816f, 0.644031f, 0.693270f, 0.136716f, 0.655816f, 0.181498f, 0.682132f,
687 0.132359f, 0.719156f, 0.106195f, 0.693270f, 0.683874f, 0.757011f, 0.617867f, 0.719156f,
688 0.644031f, 0.693270f, 0.668163f, 0.712097f, 0.106195f, 0.693270f, 0.132359f, 0.719156f,
689 0.066352f, 0.757011f, 0.082063f, 0.712097f, 0.727131f, 0.698475f, 0.683874f, 0.757011f,
690 0.668163f, 0.712097f, 0.676584f, 0.686010f, 0.082063f, 0.712097f, 0.066352f, 0.757011f,
691 0.023095f, 0.698475f, 0.073642f, 0.686010f, 0.729804f, 0.624370f, 0.727131f, 0.698475f,
692 0.676584f, 0.686010f, 0.667013f, 0.640198f, 0.073642f, 0.686010f, 0.023095f, 0.698475f,
693 0.020422f, 0.624370f, 0.083213f, 0.640198f, 0.721292f, 0.572934f, 0.729804f, 0.624370f,
694 0.667013f, 0.640198f, 0.648152f, 0.594596f, 0.083213f, 0.640198f, 0.020422f, 0.624370f,
695 0.028934f, 0.572934f, 0.102074f, 0.594596f, 0.667013f, 0.640198f, 0.613510f, 0.655816f,
696 0.574269f, 0.607668f, 0.648152f, 0.594596f, 0.175957f, 0.607668f, 0.136716f, 0.655816f,
697 0.083213f, 0.640198f, 0.102074f, 0.594596f, 0.667013f, 0.640198f, 0.676584f, 0.686010f,
698 0.644031f, 0.693270f, 0.613510f, 0.655816f, 0.106195f, 0.693270f, 0.073642f, 0.686010f,
699 0.083213f, 0.640198f, 0.136716f, 0.655816f, 0.676584f, 0.686010f, 0.668163f, 0.712097f,
700 0.644031f, 0.693270f, 0.106195f, 0.693270f, 0.082063f, 0.712097f, 0.073642f, 0.686010f,
701 0.630034f, 0.557583f, 0.717709f, 0.538143f, 0.721292f, 0.572934f, 0.648152f, 0.594596f,
702 0.028934f, 0.572934f, 0.032517f, 0.538143f, 0.120192f, 0.557583f, 0.102074f, 0.594596f,
703 0.630034f, 0.557583f, 0.648152f, 0.594596f, 0.574269f, 0.607668f, 0.526877f, 0.539235f,
704 0.175957f, 0.607668f, 0.102074f, 0.594596f, 0.120192f, 0.557583f, 0.223349f, 0.539235f,
705 0.408153f, 0.587507f, 0.526877f, 0.539235f, 0.574269f, 0.607668f, 0.508539f, 0.641024f,
706 0.175957f, 0.607668f, 0.223349f, 0.539235f, 0.342073f, 0.587507f, 0.241687f, 0.641024f,
707};
708
709#define VERT_MARK 1
710
711#define EDGE_ORIG 1
712#define EDGE_MARK 2
713
714#define FACE_MARK 1
715#define FACE_NEW 2
716
718{
719 BMOpSlot *slot_verts_out = BMO_slot_get(op->slots_out, "verts.out");
720
721 const float dia = BMO_slot_float_get(op->slots_in, "size");
722 const uint xtot = max_ii(1, BMO_slot_int_get(op->slots_in, "x_segments"));
723 const uint ytot = max_ii(1, BMO_slot_int_get(op->slots_in, "y_segments"));
724 const float xtot_inv2 = 2.0f / (xtot);
725 const float ytot_inv2 = 2.0f / (ytot);
726
727 const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_PROP_FLOAT2);
728 const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
729
730 BMVert **varr;
731 BMVert *vquad[4];
732
733 float mat[4][4];
734 float vec[3], tvec[3];
735
736 uint x, y, i;
737
738 BMO_slot_mat4_get(op->slots_in, "matrix", mat);
739
740 BMO_slot_buffer_alloc(op, op->slots_out, "verts.out", (xtot + 1) * (ytot + 1));
741 varr = (BMVert **)slot_verts_out->data.buf;
742
743 i = 0;
744 vec[2] = 0.0f;
745 for (y = 0; y <= ytot; y++) {
746 vec[1] = ((y * ytot_inv2) - 1.0f) * dia;
747 for (x = 0; x <= xtot; x++) {
748 vec[0] = ((x * xtot_inv2) - 1.0f) * dia;
749 mul_v3_m4v3(tvec, mat, vec);
750 varr[i] = BM_vert_create(bm, tvec, nullptr, BM_CREATE_NOP);
752 i++;
753 }
754 }
755
756#define XY(_x, _y) ((_x) + ((_y) * (xtot + 1)))
757
758 for (y = 1; y <= ytot; y++) {
759 for (x = 1; x <= xtot; x++) {
760 BMFace *f;
761
762 vquad[0] = varr[XY(x - 1, y - 1)];
763 vquad[1] = varr[XY(x, y - 1)];
764 vquad[2] = varr[XY(x, y)];
765 vquad[3] = varr[XY(x - 1, y)];
766
767 f = BM_face_create_verts(bm, vquad, 4, nullptr, BM_CREATE_NOP, true);
768 if (calc_uvs) {
770 }
771 }
772 }
773
774#undef XY
775
776 if (calc_uvs) {
777 BM_mesh_calc_uvs_grid(bm, xtot, ytot, FACE_MARK, cd_loop_uv_offset);
778 }
779}
780
782 const uint x_segments,
783 const uint y_segments,
784 const short oflag,
785 const int cd_loop_uv_offset)
786{
787 BMFace *f;
788 BMIter iter;
789
790 const float dx = 1.0f / float(x_segments);
791 const float dy = 1.0f / float(y_segments);
792
793 uint face_index = 0;
794
795 BLI_assert(cd_loop_uv_offset != -1);
796
797 BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
798 if (!BMO_face_flag_test(bm, f, oflag)) {
799 continue;
800 }
801
802 const uint ix = face_index % x_segments;
803 const uint iy = face_index / x_segments;
804
805 BMIter liter;
806 BMLoop *l;
807 int loop_index;
808
809 BM_ITER_ELEM_INDEX (l, &liter, f, BM_LOOPS_OF_FACE, loop_index) {
810 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
811
812 switch (loop_index) {
813 case 0: {
814 luv[0] = ix * dx;
815 luv[1] = iy * dy;
816 break;
817 }
818 case 1: {
819 luv[0] = (ix + 1) * dx;
820 luv[1] = iy * dy;
821 break;
822 }
823 case 2: {
824 luv[0] = (ix + 1) * dx;
825 luv[1] = (iy + 1) * dy;
826 break;
827 }
828 case 3: {
829 luv[0] = ix * dx;
830 luv[1] = (iy + 1) * dy;
831 break;
832 }
833 default: {
834 break;
835 }
836 }
837 }
838
839 face_index++;
840 }
841}
842
844{
845 const float rad = BMO_slot_float_get(op->slots_in, "radius");
846 /* Prevent zero U/V (crashes). If default permanents were supported 3 would make more sense. */
847 const int seg = std::max(1, BMO_slot_int_get(op->slots_in, "u_segments"));
848 const int tot = std::max(1, BMO_slot_int_get(op->slots_in, "v_segments"));
849
850 const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_PROP_FLOAT2);
851 const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
852
853 BMOperator bmop, prevop;
854 BMVert *eve, *preveve;
855 BMEdge *e;
856 BMIter iter;
857 const float axis[3] = {0, 0, 1};
858 float vec[3], mat[4][4], cmat[3][3];
859 int a;
860
861 BMO_slot_mat4_get(op->slots_in, "matrix", mat);
862
863 const float phid = float(M_PI) / tot;
864 // const float phi = 0.25f * float(M_PI); /* UNUSED. */
865
866 /* one segment first */
867 for (a = 0; a <= tot; a++) {
868 /* Going in this direction, then edge extruding, makes normals face outward */
869 float sin_phi, cos_phi;
870 sin_cos_from_fraction(a, 2 * tot, &sin_phi, &cos_phi);
871
872 vec[0] = 0.0f;
873 vec[1] = rad * sin_phi;
874 vec[2] = rad * cos_phi;
875 eve = BM_vert_create(bm, vec, nullptr, BM_CREATE_NOP);
877
878 if (a != 0) {
879 e = BM_edge_create(bm, preveve, eve, nullptr, BM_CREATE_NOP);
881 }
882
883 preveve = eve;
884 }
885
886 /* extrude and rotate; negative phi to make normals face outward */
887 axis_angle_to_mat3(cmat, axis, -(M_PI * 2) / seg);
888
889 for (a = 0; a < seg; a++) {
890 if (a) {
891 BMO_op_initf(bm, &bmop, op->flag, "extrude_edge_only edges=%S", &prevop, "geom.out");
892 BMO_op_exec(bm, &bmop);
893 BMO_op_finish(bm, &prevop);
894 }
895 else {
896 BMO_op_initf(bm, &bmop, op->flag, "extrude_edge_only edges=%fe", EDGE_ORIG);
897 BMO_op_exec(bm, &bmop);
898 }
899
901 BMO_op_callf(bm, op->flag, "rotate cent=%v matrix=%m3 verts=%S", vec, cmat, &bmop, "geom.out");
902
903 prevop = bmop;
904 }
905
906 if (a) {
907 BMO_op_finish(bm, &bmop);
908 }
909
910 {
911 float len, len2, vec2[3];
912
913 len = 2 * rad * sinf(phid / 2.0f);
914
915 /* Length of one segment in shortest parallel. */
916 vec[0] = rad * sinf(phid);
917 vec[1] = 0.0f;
918 vec[2] = rad * cosf(phid);
919
920 mul_v3_m3v3(vec2, cmat, vec);
921 len2 = len_v3v3(vec, vec2);
922
923 /* use shortest segment length divided by 3 as merge threshold */
925 bm, op->flag, "remove_doubles verts=%fv dist=%f", VERT_MARK, min_ff(len, len2) / 3.0f);
926 }
927
928 if (calc_uvs) {
929 BMFace *f;
930 BMLoop *l;
931 BMIter fiter, liter;
932
933 /* We cannot tag faces for UVs computing above,
934 * so we have to do it now, based on all its vertices being tagged. */
935 BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
936 bool valid = true;
937
938 BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
939 if (!BMO_vert_flag_test(bm, l->v, VERT_MARK)) {
940 valid = false;
941 break;
942 }
943 }
944
945 if (valid) {
947 }
948 }
949
950 BM_mesh_calc_uvs_sphere(bm, FACE_MARK, cd_loop_uv_offset);
951 }
952
953 /* Now apply the inverse matrix. */
954 BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
955 if (BMO_vert_flag_test(bm, eve, VERT_MARK)) {
956 mul_m4_v3(mat, eve->co);
957 }
958 }
959
961}
962
964{
965 const float rad = BMO_slot_float_get(op->slots_in, "radius");
966 const float rad_div = rad / 200.0f;
967 const int subdiv = BMO_slot_int_get(op->slots_in, "subdivisions");
968
969 const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_PROP_FLOAT2);
970 const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
971
972 BMVert *eva[12];
973 BMVert *v;
974 BMIter liter;
975 BMIter viter;
976 BMLoop *l;
977 float vec[3], mat[4][4] /* , phi, phid */;
978 int a;
979
980 BMO_slot_mat4_get(op->slots_in, "matrix", mat);
981
982 // phid = 2.0f * float(M_PI) / subdiv; /* UNUSED. */
983 // phi = 0.25f * float(M_PI); /* UNUSED. */
984
985 for (a = 0; a < 12; a++) {
986 vec[0] = rad_div * icovert[a][0];
987 vec[1] = rad_div * icovert[a][1];
988 vec[2] = rad_div * icovert[a][2];
989 eva[a] = BM_vert_create(bm, vec, nullptr, BM_CREATE_NOP);
990
992 }
993
994 int uvi = 0;
995 for (a = 0; a < 20; a++) {
996 BMFace *f;
997 BMVert *v1, *v2, *v3;
998
999 v1 = eva[icoface[a][0]];
1000 v2 = eva[icoface[a][1]];
1001 v3 = eva[icoface[a][2]];
1002
1003 f = BM_face_create_quad_tri(bm, v1, v2, v3, nullptr, nullptr, BM_CREATE_NOP);
1004
1005 BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
1007 }
1008
1009 /* Set the UVs here, the iteration order of the faces is not guaranteed,
1010 * so it's best to set the UVs right after the face is created. */
1011 if (calc_uvs) {
1012 int loop_index;
1013 BM_ITER_ELEM_INDEX (l, &liter, f, BM_LOOPS_OF_FACE, loop_index) {
1014 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1015 luv[0] = icouvs[uvi][0];
1016 luv[1] = icouvs[uvi][1];
1017 uvi++;
1018 }
1019 }
1020 }
1021
1022 if (subdiv > 1) {
1023 BMOperator bmop;
1024
1026 &bmop,
1027 op->flag,
1028 "subdivide_edges edges=%fe "
1029 "smooth=%f "
1030 "cuts=%i "
1031 "use_grid_fill=%b use_sphere=%b",
1032 EDGE_MARK,
1033 rad,
1034 (1 << (subdiv - 1)) - 1,
1035 true,
1036 true);
1037
1038 BMO_op_exec(bm, &bmop);
1041 BMO_op_finish(bm, &bmop);
1042 }
1043
1044 /* must transform after because of sphere subdivision */
1045 BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
1047 mul_m4_v3(mat, v->co);
1048 }
1049 }
1050
1052}
1053
1054static void bm_mesh_calc_uvs_sphere_face(BMFace *f, const int cd_loop_uv_offset)
1055{
1056 float *uvs[4];
1057 BMLoop *l;
1058 BMIter iter;
1059 float dx;
1060 int loop_index, loop_index_max_x;
1061
1062 BLI_assert(f->len <= 4);
1063
1064 /* If face has 3 vertices, it's a polar face, in which case we need to
1065 * compute a nearby to determine its latitude. */
1066 float avgx = 0.0f, avgy = 0.0f;
1067 BM_ITER_ELEM_INDEX (l, &iter, f, BM_LOOPS_OF_FACE, loop_index) {
1068 if (f->len == 3) {
1069 avgx += l->v->co[0];
1070 avgy += l->v->co[1];
1071 }
1072 }
1073 avgx /= 3.0f;
1074 avgy /= 3.0f;
1075
1076 BM_ITER_ELEM_INDEX (l, &iter, f, BM_LOOPS_OF_FACE, loop_index) {
1077 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1078 float x = l->v->co[0];
1079 float y = l->v->co[1];
1080 float z = l->v->co[2];
1081 float len = len_v3(l->v->co);
1082
1083 /* Use neighboring point to compute angle for poles. */
1084 float theta;
1085 if (f->len == 3 && fabsf(x) < 0.0001f && fabsf(y) < 0.0001f) {
1086 theta = atan2f(avgy, avgx);
1087 }
1088 else {
1089 theta = atan2f(y, x);
1090 }
1091
1092 /* Shift borderline coordinates to the left. */
1093 if (fabsf(theta - float(M_PI)) < 0.0001f) {
1094 theta = -M_PI;
1095 }
1096
1097 float phi = safe_acosf(z / len);
1098 luv[0] = 0.5f + theta / (float(M_PI) * 2);
1099 luv[1] = 1.0f - phi / float(M_PI);
1100
1101 uvs[loop_index] = luv;
1102 }
1103
1104 /* Fix awkwardly-wrapping UVs */
1105 loop_index_max_x = 0;
1106 for (loop_index = 1; loop_index < f->len; loop_index++) {
1107 if (uvs[loop_index][0] > uvs[loop_index_max_x][0]) {
1108 loop_index_max_x = loop_index;
1109 }
1110 }
1111
1112 for (loop_index = 0; loop_index < f->len; loop_index++) {
1113 if (loop_index != loop_index_max_x) {
1114 dx = uvs[loop_index_max_x][0] - uvs[loop_index][0];
1115 if (dx > 0.5f) {
1116 uvs[loop_index][0] += 1.0f;
1117 }
1118 }
1119 }
1120}
1121
1122void BM_mesh_calc_uvs_sphere(BMesh *bm, const short oflag, const int cd_loop_uv_offset)
1123{
1124 BMFace *f;
1125 BMIter iter;
1126
1127 BLI_assert(cd_loop_uv_offset != -1); /* caller is responsible for giving us UVs */
1128
1129 BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
1130 if (!BMO_face_flag_test(bm, f, oflag)) {
1131 continue;
1132 }
1133
1134 bm_mesh_calc_uvs_sphere_face(f, cd_loop_uv_offset);
1135 }
1136
1137 BMIter iter2;
1138 BMLoop *l;
1139 int loop_index;
1140 float minx = 1.0f;
1141
1142 BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
1143 if (!BMO_face_flag_test(bm, f, oflag)) {
1144 continue;
1145 }
1146 BM_ITER_ELEM_INDEX (l, &iter2, f, BM_LOOPS_OF_FACE, loop_index) {
1147 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1148 minx = std::min(luv[0], minx);
1149 }
1150 }
1151
1152 BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
1153 if (!BMO_face_flag_test(bm, f, oflag)) {
1154 continue;
1155 }
1156 BM_ITER_ELEM_INDEX (l, &iter2, f, BM_LOOPS_OF_FACE, loop_index) {
1157 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1158 luv[0] -= minx;
1159 }
1160 }
1161}
1162
1164{
1166 float mat[4][4];
1167 int i;
1168
1169 BMO_slot_mat4_get(op->slots_in, "matrix", mat);
1170
1171 const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_PROP_FLOAT2);
1172 const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
1173
1174 for (i = 0; i < monkeynv; i++) {
1175 float v[3];
1176
1177 /* rotate to face in the -Y axis */
1178 v[0] = (monkeyv[i][0] + 127) / 128.0;
1179 v[2] = monkeyv[i][1] / 128.0;
1180 v[1] = monkeyv[i][2] / -128.0;
1181
1182 tv[i] = BM_vert_create(bm, v, nullptr, BM_CREATE_NOP);
1184
1185 if (fabsf(v[0] = -v[0]) < 0.001f) {
1186 tv[monkeynv + i] = tv[i];
1187 }
1188 else {
1189 BMVert *eve = BM_vert_create(bm, v, nullptr, BM_CREATE_NOP);
1190 mul_m4_v3(mat, eve->co);
1191 tv[monkeynv + i] = eve;
1192 }
1193
1195
1196 mul_m4_v3(mat, tv[i]->co);
1197 }
1198
1199 int uvi = 0;
1200 for (i = 0; i < monkeynf; i++) {
1202 bm,
1203 tv[monkeyf[i][0] + i - monkeyo],
1204 tv[monkeyf[i][1] + i - monkeyo],
1205 tv[monkeyf[i][2] + i - monkeyo],
1206 (monkeyf[i][3] != monkeyf[i][2]) ? tv[monkeyf[i][3] + i - monkeyo] : nullptr,
1207 nullptr,
1209
1211 bm,
1212 tv[monkeynv + monkeyf[i][2] + i - monkeyo],
1213 tv[monkeynv + monkeyf[i][1] + i - monkeyo],
1214 tv[monkeynv + monkeyf[i][0] + i - monkeyo],
1215 (monkeyf[i][3] != monkeyf[i][2]) ? tv[monkeynv + monkeyf[i][3] + i - monkeyo] : nullptr,
1216 nullptr,
1218
1219 /* Set the UVs here, the iteration order of the faces is not guaranteed,
1220 * so it's best to set the UVs right after the face is created. */
1221 if (calc_uvs) {
1222 BMLoop *l;
1223 BMIter liter;
1224 BM_ITER_ELEM (l, &liter, f_new_a, BM_LOOPS_OF_FACE) {
1225 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1226 luv[0] = monkeyuvs[uvi * 2 + 0];
1227 luv[1] = monkeyuvs[uvi * 2 + 1];
1228 uvi++;
1229 }
1230 BM_ITER_ELEM (l, &liter, f_new_b, BM_LOOPS_OF_FACE) {
1231 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1232 luv[0] = monkeyuvs[uvi * 2 + 0];
1233 luv[1] = monkeyuvs[uvi * 2 + 1];
1234 uvi++;
1235 }
1236 }
1237 }
1238
1239 MEM_freeN(tv);
1240
1242}
1243
1245{
1246 const float radius = BMO_slot_float_get(op->slots_in, "radius");
1247 const int segs = BMO_slot_int_get(op->slots_in, "segments");
1248 const bool cap_ends = BMO_slot_bool_get(op->slots_in, "cap_ends");
1249 const bool cap_tris = BMO_slot_bool_get(op->slots_in, "cap_tris");
1250
1251 const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_PROP_FLOAT2);
1252 const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
1253
1254 BMVert *v1, *lastv1 = nullptr, *cent1, *firstv1 = nullptr;
1255 float vec[3], mat[4][4];
1256 int a;
1257
1258 if (!segs) {
1259 return;
1260 }
1261
1262 BMO_slot_mat4_get(op->slots_in, "matrix", mat);
1263
1264 if (cap_ends) {
1265 zero_v3(vec);
1266 mul_m4_v3(mat, vec);
1267
1268 cent1 = BM_vert_create(bm, vec, nullptr, BM_CREATE_NOP);
1270 }
1271
1272 for (a = 0; a < segs; a++) {
1273 /* Going this way ends up with normal(s) upward */
1274 sin_cos_from_fraction(a, segs, &vec[0], &vec[1]);
1275 vec[0] *= -radius;
1276 vec[1] *= radius;
1277 vec[2] = 0.0f;
1278 mul_m4_v3(mat, vec);
1279 v1 = BM_vert_create(bm, vec, nullptr, BM_CREATE_NOP);
1280
1282
1283 if (lastv1) {
1284 BM_edge_create(bm, v1, lastv1, nullptr, BM_CREATE_NOP);
1285 }
1286
1287 if (a && cap_ends) {
1288 BMFace *f;
1289
1290 f = BM_face_create_quad_tri(bm, cent1, lastv1, v1, nullptr, nullptr, BM_CREATE_NOP);
1292 }
1293
1294 if (!firstv1) {
1295 firstv1 = v1;
1296 }
1297
1298 lastv1 = v1;
1299 }
1300
1301 if (!a) {
1302 return;
1303 }
1304
1305 BM_edge_create(bm, firstv1, lastv1, nullptr, eBMCreateFlag(0));
1306
1307 if (cap_ends) {
1308 BMFace *f;
1309
1310 f = BM_face_create_quad_tri(bm, cent1, v1, firstv1, nullptr, nullptr, BM_CREATE_NOP);
1312
1313 if (calc_uvs) {
1314 BM_mesh_calc_uvs_circle(bm, mat, radius, FACE_NEW, cd_loop_uv_offset);
1315 }
1316 }
1317
1318 if (!cap_tris) {
1319 BMO_op_callf(bm, op->flag, "dissolve_faces faces=%ff", FACE_NEW);
1320 }
1321
1323}
1324
1326 BMesh *bm, float mat[4][4], const float radius, const short oflag, const int cd_loop_uv_offset)
1327{
1328 BMFace *f;
1329 BMLoop *l;
1330 BMIter fiter, liter;
1331
1332 const float uv_scale = 0.5f / radius;
1333 const float uv_center = 0.5f;
1334
1335 float inv_mat[4][4];
1336
1337 BLI_assert(cd_loop_uv_offset != -1); /* caller must ensure we have UVs already */
1338
1339 invert_m4_m4(inv_mat, mat);
1340
1341 BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
1342 if (!BMO_face_flag_test(bm, f, oflag)) {
1343 continue;
1344 }
1345
1346 BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
1347 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1348
1349 float uv_vco[3];
1350 copy_v3_v3(uv_vco, l->v->co);
1351 /* transform back into the unit circle flat on the Z-axis */
1352 mul_m4_v3(inv_mat, uv_vco);
1353
1354 /* then just take those coords for UVs */
1355 luv[0] = uv_center + uv_scale * uv_vco[0];
1356 luv[1] = uv_center + uv_scale * uv_vco[1];
1357 }
1358 }
1359}
1360
1362{
1363 BMVert *v1, *v2, *lastv1 = nullptr, *lastv2 = nullptr, *cent1, *cent2, *firstv1, *firstv2;
1364 BMFace *f;
1365 float vec[3], mat[4][4];
1366 const float rad1 = BMO_slot_float_get(op->slots_in, "radius1");
1367 const float rad2 = BMO_slot_float_get(op->slots_in, "radius2");
1368 const float depth_half = 0.5f * BMO_slot_float_get(op->slots_in, "depth");
1369 int segs = BMO_slot_int_get(op->slots_in, "segments");
1370 const bool cap_ends = BMO_slot_bool_get(op->slots_in, "cap_ends");
1371 const bool cap_tris = BMO_slot_bool_get(op->slots_in, "cap_tris");
1372
1373 const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_PROP_FLOAT2);
1374 const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
1375
1376 if (!segs) {
1377 return;
1378 }
1379
1380 BMO_slot_mat4_get(op->slots_in, "matrix", mat);
1381
1382 if (cap_ends) {
1383 vec[0] = vec[1] = 0.0f;
1384 vec[2] = -depth_half;
1385 mul_m4_v3(mat, vec);
1386
1387 cent1 = BM_vert_create(bm, vec, nullptr, BM_CREATE_NOP);
1388
1389 vec[0] = vec[1] = 0.0f;
1390 vec[2] = depth_half;
1391 mul_m4_v3(mat, vec);
1392
1393 cent2 = BM_vert_create(bm, vec, nullptr, BM_CREATE_NOP);
1394
1397 }
1398
1399 const int side_faces_len = segs - 1;
1400 BMFace **side_faces = static_cast<BMFace **>(
1401 MEM_mallocN(sizeof(*side_faces) * side_faces_len, __func__));
1402
1403 for (int i = 0; i < segs; i++) {
1404 /* Calculate with higher precision, see: #87779. */
1405 float sin_phi, cos_phi;
1406 sin_cos_from_fraction(i, segs, &sin_phi, &cos_phi);
1407
1408 vec[0] = rad1 * sin_phi;
1409 vec[1] = rad1 * cos_phi;
1410 vec[2] = -depth_half;
1411 mul_m4_v3(mat, vec);
1412 v1 = BM_vert_create(bm, vec, nullptr, BM_CREATE_NOP);
1413
1414 vec[0] = rad2 * sin_phi;
1415 vec[1] = rad2 * cos_phi;
1416 vec[2] = depth_half;
1417 mul_m4_v3(mat, vec);
1418 v2 = BM_vert_create(bm, vec, nullptr, BM_CREATE_NOP);
1419
1422
1423 if (i) {
1424 if (cap_ends) {
1425 f = BM_face_create_quad_tri(bm, cent1, lastv1, v1, nullptr, nullptr, BM_CREATE_NOP);
1426 if (calc_uvs) {
1428 }
1430
1431 f = BM_face_create_quad_tri(bm, cent2, v2, lastv2, nullptr, nullptr, BM_CREATE_NOP);
1432 if (calc_uvs) {
1434 }
1436 }
1437
1438 f = BM_face_create_quad_tri(bm, lastv1, lastv2, v2, v1, nullptr, BM_CREATE_NOP);
1439 if (calc_uvs) {
1441 }
1442 side_faces[i - 1] = f;
1443 }
1444 else {
1445 firstv1 = v1;
1446 firstv2 = v2;
1447 }
1448
1449 lastv1 = v1;
1450 lastv2 = v2;
1451 }
1452
1453 if (cap_ends) {
1454 f = BM_face_create_quad_tri(bm, cent1, v1, firstv1, nullptr, nullptr, BM_CREATE_NOP);
1455 if (calc_uvs) {
1457 }
1459
1460 f = BM_face_create_quad_tri(bm, cent2, firstv2, v2, nullptr, nullptr, BM_CREATE_NOP);
1461 if (calc_uvs) {
1463 }
1465 }
1466
1467 f = BM_face_create_quad_tri(bm, v1, v2, firstv2, firstv1, nullptr, BM_CREATE_NOP);
1468 if (calc_uvs) {
1470 }
1471
1472 if (calc_uvs) {
1473 BM_mesh_calc_uvs_cone(bm, mat, rad2, rad1, segs, cap_ends, FACE_MARK, cd_loop_uv_offset);
1474 }
1475
1476 /* Collapse vertices at the first end. */
1477 if (rad1 == 0.0f) {
1478 if (cap_ends) {
1479 BM_vert_kill(bm, cent1);
1480 }
1481 for (int i = 0; i < side_faces_len; i++) {
1482 f = side_faces[i];
1484 BM_edge_collapse(bm, l->prev->e, l->prev->v, true, true);
1485 }
1486 }
1487
1488 /* Collapse vertices at the second end. */
1489 if (rad2 == 0.0f) {
1490 if (cap_ends) {
1491 BM_vert_kill(bm, cent2);
1492 }
1493 for (int i = 0; i < side_faces_len; i++) {
1494 f = side_faces[i];
1496 BM_edge_collapse(bm, l->next->e, l->next->v, true, true);
1497 }
1498 }
1499
1500 if (!cap_tris) {
1501 BMO_op_callf(bm, op->flag, "dissolve_faces faces=%ff", FACE_NEW);
1502 }
1503
1504 if (side_faces != nullptr) {
1505 MEM_freeN(side_faces);
1506 }
1507
1509}
1510
1512 float mat[4][4],
1513 const float radius_top,
1514 const float radius_bottom,
1515 const int segments,
1516 const bool cap_ends,
1517 const short oflag,
1518 const int cd_loop_uv_offset)
1519{
1520 BMFace *f;
1521 BMLoop *l;
1522 BMIter fiter, liter;
1523
1524 const float uv_width = 1.0f / float(segments);
1525 const float uv_height = cap_ends ? 0.5f : 1.0f;
1526
1527 /* Note that all this allows us to handle all cases
1528 * (real cone, truncated cone, with or without ends capped)
1529 * with a single common code. */
1530 const float uv_center_y = cap_ends ? 0.25f : 0.5f;
1531 const float uv_center_x_top = cap_ends ? 0.25f : 0.5f;
1532 const float uv_center_x_bottom = cap_ends ? 0.75f : 0.5f;
1533 const float uv_radius = cap_ends ? 0.24f : 0.5f;
1534
1535 /* Using the opposite's end uv_scale as a fallback allows us to handle 'real cone' case. */
1536 const float uv_scale_top = (radius_top != 0.0f) ?
1537 (uv_radius / radius_top) :
1538 ((radius_bottom != 0.0f) ? (uv_radius / radius_bottom) :
1539 uv_radius);
1540 const float uv_scale_bottom = (radius_bottom != 0.0f) ? (uv_radius / radius_bottom) :
1541 uv_scale_top;
1542
1543 float local_up[3] = {0.0f, 0.0f, 1.0f};
1544
1545 float x, y;
1546 float inv_mat[4][4];
1547 int loop_index;
1548
1549 /* Transform the up-vector like we did the cone itself, without location. */
1550 mul_mat3_m4_v3(mat, local_up);
1551 /* Remove global scaling. */
1552 normalize_v3(local_up);
1553
1554 invert_m4_m4(inv_mat, mat);
1555
1556 BLI_assert(cd_loop_uv_offset != -1); /* caller is responsible for ensuring the mesh has UVs */
1557
1558 x = 1.0f;
1559 y = 1.0f - uv_height;
1560
1561 BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
1562 if (!BMO_face_flag_test(bm, f, oflag)) {
1563 continue;
1564 }
1565
1566 if (f->len == 4 && radius_top && radius_bottom) {
1567 /* side face - so unwrap it in a rectangle */
1568 BM_ITER_ELEM_INDEX (l, &liter, f, BM_LOOPS_OF_FACE, loop_index) {
1569 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1570
1571 switch (loop_index) {
1572 case 0:
1573 /* Continue in the last position */
1574 break;
1575 case 1:
1576 y += uv_height;
1577 break;
1578 case 2:
1579 x -= uv_width;
1580 break;
1581 case 3:
1582 y -= uv_height;
1583 break;
1584 default:
1585 break;
1586 }
1587
1588 luv[0] = x;
1589 luv[1] = y;
1590 }
1591 }
1592 else {
1593 /* Top or bottom face - so unwrap it by transforming
1594 * back to a circle and using the X/Y coords. */
1596
1597 BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
1598 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1599 float uv_vco[3];
1600
1601 mul_v3_m4v3(uv_vco, inv_mat, l->v->co);
1602
1603 if (dot_v3v3(f->no, local_up) > 0.0f) { /* if this is a top face of the cone */
1604 luv[0] = uv_center_x_top + uv_vco[0] * uv_scale_top;
1605 luv[1] = uv_center_y + uv_vco[1] * uv_scale_top;
1606 }
1607 else {
1608 luv[0] = uv_center_x_bottom + uv_vco[0] * uv_scale_bottom;
1609 luv[1] = uv_center_y + uv_vco[1] * uv_scale_bottom;
1610 }
1611 }
1612 }
1613 }
1614}
1615
1617{
1618 BMVert *verts[8];
1619 float mat[4][4];
1620 float off = BMO_slot_float_get(op->slots_in, "size") / 2.0f;
1621
1622 const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_PROP_FLOAT2);
1623 const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
1624
1625 /* rotation order set to match 'BM_mesh_calc_uvs_cube' */
1626 const char faces[6][4] = {
1627 {0, 1, 3, 2},
1628 {2, 3, 7, 6},
1629 {6, 7, 5, 4},
1630 {4, 5, 1, 0},
1631 {2, 6, 4, 0},
1632 {7, 3, 1, 5},
1633 };
1634
1635 BMO_slot_mat4_get(op->slots_in, "matrix", mat);
1636
1637 if (!off) {
1638 off = 0.5f;
1639 }
1640 int i = 0;
1641
1642 for (int x = -1; x < 2; x += 2) {
1643 for (int y = -1; y < 2; y += 2) {
1644 for (int z = -1; z < 2; z += 2) {
1645 float vec[3] = {float(x) * off, float(y) * off, float(z) * off};
1646 mul_m4_v3(mat, vec);
1647 verts[i] = BM_vert_create(bm, vec, nullptr, BM_CREATE_NOP);
1649 i++;
1650 }
1651 }
1652 }
1653
1654 for (i = 0; i < ARRAY_SIZE(faces); i++) {
1655 BMFace *f;
1656 BMVert *quad[4] = {
1657 verts[faces[i][0]],
1658 verts[faces[i][1]],
1659 verts[faces[i][2]],
1660 verts[faces[i][3]],
1661 };
1662
1663 f = BM_face_create_verts(bm, quad, 4, nullptr, BM_CREATE_NOP, true);
1664 if (calc_uvs) {
1666 }
1667 }
1668
1669 if (calc_uvs) {
1671 }
1672
1674}
1675
1677{
1678 BMFace *f;
1679 BMLoop *l;
1680 BMIter fiter, liter;
1681 const float width = 0.25f;
1682
1683 const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_PROP_FLOAT2);
1684
1685 float x = 0.375f;
1686 float y = 0.0f;
1687
1688 int loop_index;
1689
1690 BLI_assert(cd_loop_uv_offset != -1); /* the caller can ensure that we have UVs */
1691
1692 BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
1693 if (!BMO_face_flag_test(bm, f, oflag)) {
1694 continue;
1695 }
1696
1697 BM_ITER_ELEM_INDEX (l, &liter, f, BM_LOOPS_OF_FACE, loop_index) {
1698 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1699
1700 luv[0] = x;
1701 luv[1] = y;
1702
1703 switch (loop_index) {
1704 case 0:
1705 x += width;
1706 break;
1707 case 1:
1708 y += width;
1709 break;
1710 case 2:
1711 x -= width;
1712 break;
1713 case 3:
1714 y -= width;
1715 break;
1716 default:
1717 break;
1718 }
1719 }
1720
1721 if (y >= 0.75f && x > 0.125f) {
1722 x = 0.125f;
1723 y = 0.5f;
1724 }
1725 else if (x <= 0.125f) {
1726 x = 0.625f;
1727 y = 0.5f;
1728 }
1729 else {
1730 y += 0.25f;
1731 }
1732 }
1733}
CustomData interface, see also DNA_customdata_types.h.
int CustomData_get_offset(const CustomData *data, eCustomDataType type)
#define BLI_assert(a)
Definition BLI_assert.h:46
MINLINE float min_ff(float a, float b)
MINLINE int max_ii(int a, int b)
MINLINE float safe_acosf(float a)
#define M_PI
void mul_m4_v3(const float M[4][4], float r[3])
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
bool invert_m4_m4(float inverse[4][4], const float mat[4][4])
void mul_v3_m3v3(float r[3], const float M[3][3], const float a[3])
void mul_mat3_m4_v3(const float mat[4][4], float r[3])
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 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 normalize_v3(float n[3])
MINLINE float len_v3(const float a[3]) ATTR_WARN_UNUSED_RESULT
unsigned int uint
#define ARRAY_SIZE(arr)
@ CD_PROP_FLOAT2
Read Guarded memory(de)allocation.
#define BM_FACE_FIRST_LOOP(p)
#define BM_ELEM_CD_GET_FLOAT_P(ele, offset)
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.
void BM_vert_kill(BMesh *bm, BMVert *v)
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)
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.cc:41
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.
eBMCreateFlag
Definition bmesh_core.hh:27
@ BM_CREATE_NOP
Definition bmesh_core.hh:28
#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)
BMesh * bm
BMVert * BM_edge_collapse(BMesh *bm, BMEdge *e_kill, BMVert *v_kill, const bool do_del, const bool kill_degenerate_faces)
#define BM_EDGE
#define BM_VERT
void * BMO_slot_buffer_alloc(BMOperator *op, BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *slot_name, int len)
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_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)
BMOpSlot * BMO_slot_get(BMOpSlot slot_args[BMO_OP_MAX_SLOTS], const char *identifier)
BMESH OPSTACK GET SLOT.
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,...)
#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 FACE_MARK
#define EDGE_MARK
Definition bmo_bridge.cc:26
#define VERT_MARK
#define FACE_NEW
#define XY(_x, _y)
static const short icoface[20][3]
static const int monkeyo
void BM_mesh_calc_uvs_cube(BMesh *bm, const short oflag)
static const float icovert[12][3]
static signed char monkeyf[250][4]
void bmo_create_grid_exec(BMesh *bm, BMOperator *op)
static const int monkeynf
void bmo_create_circle_exec(BMesh *bm, BMOperator *op)
void bmo_create_monkey_exec(BMesh *bm, BMOperator *op)
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)
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]
#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]
static const int monkeynv
ccl_device float sin_phi(const float3 w)
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
Definition btQuadWord.h:117
nullptr float
static float verts[][3]
blender::gpu::Batch * quad
void * MEM_mallocN(size_t len, const char *str)
Definition mallocn.cc:128
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
Definition mallocn.cc:133
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
static char faces[256]
#define fabsf
#define sinf
#define cosf
#define atan2f
float no[3]
union BMOpSlot::@313121210037300127305053354046356312170117023254 data
struct BMOpSlot slots_out[BMO_OP_MAX_SLOTS]
struct BMOpSlot slots_in[BMO_OP_MAX_SLOTS]
float co[3]
i
Definition text_draw.cc:230
uint len