Blender V4.5
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 BMLoop *l;
789 BMIter iter, liter;
790
791 const float dx = 1.0f / float(x_segments);
792 const float dy = 1.0f / float(y_segments);
793 const float dx_wrap = 1.0 - (dx / 2.0f);
794 float x = 0.0f;
795 float y = dy;
796
797 int loop_index;
798
799 BLI_assert(cd_loop_uv_offset != -1);
800
801 BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
802 if (!BMO_face_flag_test(bm, f, oflag)) {
803 continue;
804 }
805
806 BM_ITER_ELEM_INDEX (l, &liter, f, BM_LOOPS_OF_FACE, loop_index) {
807 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
808
809 switch (loop_index) {
810 case 0:
811 y -= dy;
812 break;
813 case 1:
814 x += dx;
815 break;
816 case 2:
817 y += dy;
818 break;
819 case 3:
820 x -= dx;
821 break;
822 default:
823 break;
824 }
825
826 luv[0] = x;
827 luv[1] = y;
828 }
829
830 x += dx;
831 if (x >= dx_wrap) {
832 x = 0.0f;
833 y += dy;
834 }
835 }
836}
837
839{
840 const float rad = BMO_slot_float_get(op->slots_in, "radius");
841 const int seg = BMO_slot_int_get(op->slots_in, "u_segments");
842 const int tot = BMO_slot_int_get(op->slots_in, "v_segments");
843
844 const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_PROP_FLOAT2);
845 const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
846
847 BMOperator bmop, prevop;
848 BMVert *eve, *preveve;
849 BMEdge *e;
850 BMIter iter;
851 const float axis[3] = {0, 0, 1};
852 float vec[3], mat[4][4], cmat[3][3];
853 int a;
854
855 BMO_slot_mat4_get(op->slots_in, "matrix", mat);
856
857 const float phid = float(M_PI) / tot;
858 // const float phi = 0.25f * float(M_PI); /* UNUSED. */
859
860 /* one segment first */
861 for (a = 0; a <= tot; a++) {
862 /* Going in this direction, then edge extruding, makes normals face outward */
863 float sin_phi, cos_phi;
864 sin_cos_from_fraction(a, 2 * tot, &sin_phi, &cos_phi);
865
866 vec[0] = 0.0f;
867 vec[1] = rad * sin_phi;
868 vec[2] = rad * cos_phi;
869 eve = BM_vert_create(bm, vec, nullptr, BM_CREATE_NOP);
871
872 if (a != 0) {
873 e = BM_edge_create(bm, preveve, eve, nullptr, BM_CREATE_NOP);
875 }
876
877 preveve = eve;
878 }
879
880 /* extrude and rotate; negative phi to make normals face outward */
881 axis_angle_to_mat3(cmat, axis, -(M_PI * 2) / seg);
882
883 for (a = 0; a < seg; a++) {
884 if (a) {
885 BMO_op_initf(bm, &bmop, op->flag, "extrude_edge_only edges=%S", &prevop, "geom.out");
886 BMO_op_exec(bm, &bmop);
887 BMO_op_finish(bm, &prevop);
888 }
889 else {
890 BMO_op_initf(bm, &bmop, op->flag, "extrude_edge_only edges=%fe", EDGE_ORIG);
891 BMO_op_exec(bm, &bmop);
892 }
893
895 BMO_op_callf(bm, op->flag, "rotate cent=%v matrix=%m3 verts=%S", vec, cmat, &bmop, "geom.out");
896
897 prevop = bmop;
898 }
899
900 if (a) {
901 BMO_op_finish(bm, &bmop);
902 }
903
904 {
905 float len, len2, vec2[3];
906
907 len = 2 * rad * sinf(phid / 2.0f);
908
909 /* Length of one segment in shortest parallel. */
910 vec[0] = rad * sinf(phid);
911 vec[1] = 0.0f;
912 vec[2] = rad * cosf(phid);
913
914 mul_v3_m3v3(vec2, cmat, vec);
915 len2 = len_v3v3(vec, vec2);
916
917 /* use shortest segment length divided by 3 as merge threshold */
919 bm, op->flag, "remove_doubles verts=%fv dist=%f", VERT_MARK, min_ff(len, len2) / 3.0f);
920 }
921
922 if (calc_uvs) {
923 BMFace *f;
924 BMLoop *l;
925 BMIter fiter, liter;
926
927 /* We cannot tag faces for UVs computing above,
928 * so we have to do it now, based on all its vertices being tagged. */
929 BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
930 bool valid = true;
931
932 BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
933 if (!BMO_vert_flag_test(bm, l->v, VERT_MARK)) {
934 valid = false;
935 break;
936 }
937 }
938
939 if (valid) {
941 }
942 }
943
944 BM_mesh_calc_uvs_sphere(bm, FACE_MARK, cd_loop_uv_offset);
945 }
946
947 /* Now apply the inverse matrix. */
948 BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
949 if (BMO_vert_flag_test(bm, eve, VERT_MARK)) {
950 mul_m4_v3(mat, eve->co);
951 }
952 }
953
955}
956
958{
959 const float rad = BMO_slot_float_get(op->slots_in, "radius");
960 const float rad_div = rad / 200.0f;
961 const int subdiv = BMO_slot_int_get(op->slots_in, "subdivisions");
962
963 const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_PROP_FLOAT2);
964 const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
965
966 BMVert *eva[12];
967 BMVert *v;
968 BMIter liter;
969 BMIter viter;
970 BMLoop *l;
971 float vec[3], mat[4][4] /* , phi, phid */;
972 int a;
973
974 BMO_slot_mat4_get(op->slots_in, "matrix", mat);
975
976 // phid = 2.0f * float(M_PI) / subdiv; /* UNUSED. */
977 // phi = 0.25f * float(M_PI); /* UNUSED. */
978
979 for (a = 0; a < 12; a++) {
980 vec[0] = rad_div * icovert[a][0];
981 vec[1] = rad_div * icovert[a][1];
982 vec[2] = rad_div * icovert[a][2];
983 eva[a] = BM_vert_create(bm, vec, nullptr, BM_CREATE_NOP);
984
986 }
987
988 int uvi = 0;
989 for (a = 0; a < 20; a++) {
990 BMFace *f;
991 BMVert *v1, *v2, *v3;
992
993 v1 = eva[icoface[a][0]];
994 v2 = eva[icoface[a][1]];
995 v3 = eva[icoface[a][2]];
996
997 f = BM_face_create_quad_tri(bm, v1, v2, v3, nullptr, nullptr, BM_CREATE_NOP);
998
999 BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
1001 }
1002
1003 /* Set the UVs here, the iteration order of the faces is not guaranteed,
1004 * so it's best to set the UVs right after the face is created. */
1005 if (calc_uvs) {
1006 int loop_index;
1007 BM_ITER_ELEM_INDEX (l, &liter, f, BM_LOOPS_OF_FACE, loop_index) {
1008 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1009 luv[0] = icouvs[uvi][0];
1010 luv[1] = icouvs[uvi][1];
1011 uvi++;
1012 }
1013 }
1014 }
1015
1016 if (subdiv > 1) {
1017 BMOperator bmop;
1018
1020 &bmop,
1021 op->flag,
1022 "subdivide_edges edges=%fe "
1023 "smooth=%f "
1024 "cuts=%i "
1025 "use_grid_fill=%b use_sphere=%b",
1026 EDGE_MARK,
1027 rad,
1028 (1 << (subdiv - 1)) - 1,
1029 true,
1030 true);
1031
1032 BMO_op_exec(bm, &bmop);
1035 BMO_op_finish(bm, &bmop);
1036 }
1037
1038 /* must transform after because of sphere subdivision */
1039 BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
1041 mul_m4_v3(mat, v->co);
1042 }
1043 }
1044
1046}
1047
1048static void bm_mesh_calc_uvs_sphere_face(BMFace *f, const int cd_loop_uv_offset)
1049{
1050 float *uvs[4];
1051 BMLoop *l;
1052 BMIter iter;
1053 float dx;
1054 int loop_index, loop_index_max_x;
1055
1056 BLI_assert(f->len <= 4);
1057
1058 /* If face has 3 vertices, it's a polar face, in which case we need to
1059 * compute a nearby to determine its latitude. */
1060 float avgx = 0.0f, avgy = 0.0f;
1061 BM_ITER_ELEM_INDEX (l, &iter, f, BM_LOOPS_OF_FACE, loop_index) {
1062 if (f->len == 3) {
1063 avgx += l->v->co[0];
1064 avgy += l->v->co[1];
1065 }
1066 }
1067 avgx /= 3.0f;
1068 avgy /= 3.0f;
1069
1070 BM_ITER_ELEM_INDEX (l, &iter, f, BM_LOOPS_OF_FACE, loop_index) {
1071 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1072 float x = l->v->co[0];
1073 float y = l->v->co[1];
1074 float z = l->v->co[2];
1075 float len = len_v3(l->v->co);
1076
1077 /* Use neighboring point to compute angle for poles. */
1078 float theta;
1079 if (f->len == 3 && fabsf(x) < 0.0001f && fabsf(y) < 0.0001f) {
1080 theta = atan2f(avgy, avgx);
1081 }
1082 else {
1083 theta = atan2f(y, x);
1084 }
1085
1086 /* Shift borderline coordinates to the left. */
1087 if (fabsf(theta - float(M_PI)) < 0.0001f) {
1088 theta = -M_PI;
1089 }
1090
1091 float phi = safe_acosf(z / len);
1092 luv[0] = 0.5f + theta / (float(M_PI) * 2);
1093 luv[1] = 1.0f - phi / float(M_PI);
1094
1095 uvs[loop_index] = luv;
1096 }
1097
1098 /* Fix awkwardly-wrapping UVs */
1099 loop_index_max_x = 0;
1100 for (loop_index = 1; loop_index < f->len; loop_index++) {
1101 if (uvs[loop_index][0] > uvs[loop_index_max_x][0]) {
1102 loop_index_max_x = loop_index;
1103 }
1104 }
1105
1106 for (loop_index = 0; loop_index < f->len; loop_index++) {
1107 if (loop_index != loop_index_max_x) {
1108 dx = uvs[loop_index_max_x][0] - uvs[loop_index][0];
1109 if (dx > 0.5f) {
1110 uvs[loop_index][0] += 1.0f;
1111 }
1112 }
1113 }
1114}
1115
1116void BM_mesh_calc_uvs_sphere(BMesh *bm, const short oflag, const int cd_loop_uv_offset)
1117{
1118 BMFace *f;
1119 BMIter iter;
1120
1121 BLI_assert(cd_loop_uv_offset != -1); /* caller is responsible for giving us UVs */
1122
1123 BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
1124 if (!BMO_face_flag_test(bm, f, oflag)) {
1125 continue;
1126 }
1127
1128 bm_mesh_calc_uvs_sphere_face(f, cd_loop_uv_offset);
1129 }
1130
1131 BMIter iter2;
1132 BMLoop *l;
1133 int loop_index;
1134 float minx = 1.0f;
1135
1136 BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
1137 if (!BMO_face_flag_test(bm, f, oflag)) {
1138 continue;
1139 }
1140 BM_ITER_ELEM_INDEX (l, &iter2, f, BM_LOOPS_OF_FACE, loop_index) {
1141 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1142 minx = std::min(luv[0], minx);
1143 }
1144 }
1145
1146 BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
1147 if (!BMO_face_flag_test(bm, f, oflag)) {
1148 continue;
1149 }
1150 BM_ITER_ELEM_INDEX (l, &iter2, f, BM_LOOPS_OF_FACE, loop_index) {
1151 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1152 luv[0] -= minx;
1153 }
1154 }
1155}
1156
1158{
1160 float mat[4][4];
1161 int i;
1162
1163 BMO_slot_mat4_get(op->slots_in, "matrix", mat);
1164
1165 const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_PROP_FLOAT2);
1166 const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
1167
1168 for (i = 0; i < monkeynv; i++) {
1169 float v[3];
1170
1171 /* rotate to face in the -Y axis */
1172 v[0] = (monkeyv[i][0] + 127) / 128.0;
1173 v[2] = monkeyv[i][1] / 128.0;
1174 v[1] = monkeyv[i][2] / -128.0;
1175
1176 tv[i] = BM_vert_create(bm, v, nullptr, BM_CREATE_NOP);
1178
1179 if (fabsf(v[0] = -v[0]) < 0.001f) {
1180 tv[monkeynv + i] = tv[i];
1181 }
1182 else {
1183 BMVert *eve = BM_vert_create(bm, v, nullptr, BM_CREATE_NOP);
1184 mul_m4_v3(mat, eve->co);
1185 tv[monkeynv + i] = eve;
1186 }
1187
1189
1190 mul_m4_v3(mat, tv[i]->co);
1191 }
1192
1193 int uvi = 0;
1194 for (i = 0; i < monkeynf; i++) {
1196 bm,
1197 tv[monkeyf[i][0] + i - monkeyo],
1198 tv[monkeyf[i][1] + i - monkeyo],
1199 tv[monkeyf[i][2] + i - monkeyo],
1200 (monkeyf[i][3] != monkeyf[i][2]) ? tv[monkeyf[i][3] + i - monkeyo] : nullptr,
1201 nullptr,
1203
1205 bm,
1206 tv[monkeynv + monkeyf[i][2] + i - monkeyo],
1207 tv[monkeynv + monkeyf[i][1] + i - monkeyo],
1208 tv[monkeynv + monkeyf[i][0] + i - monkeyo],
1209 (monkeyf[i][3] != monkeyf[i][2]) ? tv[monkeynv + monkeyf[i][3] + i - monkeyo] : nullptr,
1210 nullptr,
1212
1213 /* Set the UVs here, the iteration order of the faces is not guaranteed,
1214 * so it's best to set the UVs right after the face is created. */
1215 if (calc_uvs) {
1216 BMLoop *l;
1217 BMIter liter;
1218 BM_ITER_ELEM (l, &liter, f_new_a, BM_LOOPS_OF_FACE) {
1219 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1220 luv[0] = monkeyuvs[uvi * 2 + 0];
1221 luv[1] = monkeyuvs[uvi * 2 + 1];
1222 uvi++;
1223 }
1224 BM_ITER_ELEM (l, &liter, f_new_b, 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 }
1231 }
1232
1233 MEM_freeN(tv);
1234
1236}
1237
1239{
1240 const float radius = BMO_slot_float_get(op->slots_in, "radius");
1241 const int segs = BMO_slot_int_get(op->slots_in, "segments");
1242 const bool cap_ends = BMO_slot_bool_get(op->slots_in, "cap_ends");
1243 const bool cap_tris = BMO_slot_bool_get(op->slots_in, "cap_tris");
1244
1245 const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_PROP_FLOAT2);
1246 const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
1247
1248 BMVert *v1, *lastv1 = nullptr, *cent1, *firstv1 = nullptr;
1249 float vec[3], mat[4][4];
1250 int a;
1251
1252 if (!segs) {
1253 return;
1254 }
1255
1256 BMO_slot_mat4_get(op->slots_in, "matrix", mat);
1257
1258 if (cap_ends) {
1259 zero_v3(vec);
1260 mul_m4_v3(mat, vec);
1261
1262 cent1 = BM_vert_create(bm, vec, nullptr, BM_CREATE_NOP);
1264 }
1265
1266 for (a = 0; a < segs; a++) {
1267 /* Going this way ends up with normal(s) upward */
1268 sin_cos_from_fraction(a, segs, &vec[0], &vec[1]);
1269 vec[0] *= -radius;
1270 vec[1] *= radius;
1271 vec[2] = 0.0f;
1272 mul_m4_v3(mat, vec);
1273 v1 = BM_vert_create(bm, vec, nullptr, BM_CREATE_NOP);
1274
1276
1277 if (lastv1) {
1278 BM_edge_create(bm, v1, lastv1, nullptr, BM_CREATE_NOP);
1279 }
1280
1281 if (a && cap_ends) {
1282 BMFace *f;
1283
1284 f = BM_face_create_quad_tri(bm, cent1, lastv1, v1, nullptr, nullptr, BM_CREATE_NOP);
1286 }
1287
1288 if (!firstv1) {
1289 firstv1 = v1;
1290 }
1291
1292 lastv1 = v1;
1293 }
1294
1295 if (!a) {
1296 return;
1297 }
1298
1299 BM_edge_create(bm, firstv1, lastv1, nullptr, eBMCreateFlag(0));
1300
1301 if (cap_ends) {
1302 BMFace *f;
1303
1304 f = BM_face_create_quad_tri(bm, cent1, v1, firstv1, nullptr, nullptr, BM_CREATE_NOP);
1306
1307 if (calc_uvs) {
1308 BM_mesh_calc_uvs_circle(bm, mat, radius, FACE_NEW, cd_loop_uv_offset);
1309 }
1310 }
1311
1312 if (!cap_tris) {
1313 BMO_op_callf(bm, op->flag, "dissolve_faces faces=%ff", FACE_NEW);
1314 }
1315
1317}
1318
1320 BMesh *bm, float mat[4][4], const float radius, const short oflag, const int cd_loop_uv_offset)
1321{
1322 BMFace *f;
1323 BMLoop *l;
1324 BMIter fiter, liter;
1325
1326 const float uv_scale = 0.5f / radius;
1327 const float uv_center = 0.5f;
1328
1329 float inv_mat[4][4];
1330
1331 BLI_assert(cd_loop_uv_offset != -1); /* caller must ensure we have UVs already */
1332
1333 invert_m4_m4(inv_mat, mat);
1334
1335 BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
1336 if (!BMO_face_flag_test(bm, f, oflag)) {
1337 continue;
1338 }
1339
1340 BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
1341 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1342
1343 float uv_vco[3];
1344 copy_v3_v3(uv_vco, l->v->co);
1345 /* transform back into the unit circle flat on the Z-axis */
1346 mul_m4_v3(inv_mat, uv_vco);
1347
1348 /* then just take those coords for UVs */
1349 luv[0] = uv_center + uv_scale * uv_vco[0];
1350 luv[1] = uv_center + uv_scale * uv_vco[1];
1351 }
1352 }
1353}
1354
1356{
1357 BMVert *v1, *v2, *lastv1 = nullptr, *lastv2 = nullptr, *cent1, *cent2, *firstv1, *firstv2;
1358 BMFace *f;
1359 float vec[3], mat[4][4];
1360 const float rad1 = BMO_slot_float_get(op->slots_in, "radius1");
1361 const float rad2 = BMO_slot_float_get(op->slots_in, "radius2");
1362 const float depth_half = 0.5f * BMO_slot_float_get(op->slots_in, "depth");
1363 int segs = BMO_slot_int_get(op->slots_in, "segments");
1364 const bool cap_ends = BMO_slot_bool_get(op->slots_in, "cap_ends");
1365 const bool cap_tris = BMO_slot_bool_get(op->slots_in, "cap_tris");
1366
1367 const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_PROP_FLOAT2);
1368 const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
1369
1370 if (!segs) {
1371 return;
1372 }
1373
1374 BMO_slot_mat4_get(op->slots_in, "matrix", mat);
1375
1376 if (cap_ends) {
1377 vec[0] = vec[1] = 0.0f;
1378 vec[2] = -depth_half;
1379 mul_m4_v3(mat, vec);
1380
1381 cent1 = BM_vert_create(bm, vec, nullptr, BM_CREATE_NOP);
1382
1383 vec[0] = vec[1] = 0.0f;
1384 vec[2] = depth_half;
1385 mul_m4_v3(mat, vec);
1386
1387 cent2 = BM_vert_create(bm, vec, nullptr, BM_CREATE_NOP);
1388
1391 }
1392
1393 const int side_faces_len = segs - 1;
1394 BMFace **side_faces = static_cast<BMFace **>(
1395 MEM_mallocN(sizeof(*side_faces) * side_faces_len, __func__));
1396
1397 for (int i = 0; i < segs; i++) {
1398 /* Calculate with higher precision, see: #87779. */
1399 float sin_phi, cos_phi;
1400 sin_cos_from_fraction(i, segs, &sin_phi, &cos_phi);
1401
1402 vec[0] = rad1 * sin_phi;
1403 vec[1] = rad1 * cos_phi;
1404 vec[2] = -depth_half;
1405 mul_m4_v3(mat, vec);
1406 v1 = BM_vert_create(bm, vec, nullptr, BM_CREATE_NOP);
1407
1408 vec[0] = rad2 * sin_phi;
1409 vec[1] = rad2 * cos_phi;
1410 vec[2] = depth_half;
1411 mul_m4_v3(mat, vec);
1412 v2 = BM_vert_create(bm, vec, nullptr, BM_CREATE_NOP);
1413
1416
1417 if (i) {
1418 if (cap_ends) {
1419 f = BM_face_create_quad_tri(bm, cent1, lastv1, v1, nullptr, nullptr, BM_CREATE_NOP);
1420 if (calc_uvs) {
1422 }
1424
1425 f = BM_face_create_quad_tri(bm, cent2, v2, lastv2, nullptr, nullptr, BM_CREATE_NOP);
1426 if (calc_uvs) {
1428 }
1430 }
1431
1432 f = BM_face_create_quad_tri(bm, lastv1, lastv2, v2, v1, nullptr, BM_CREATE_NOP);
1433 if (calc_uvs) {
1435 }
1436 side_faces[i - 1] = f;
1437 }
1438 else {
1439 firstv1 = v1;
1440 firstv2 = v2;
1441 }
1442
1443 lastv1 = v1;
1444 lastv2 = v2;
1445 }
1446
1447 if (cap_ends) {
1448 f = BM_face_create_quad_tri(bm, cent1, v1, firstv1, nullptr, nullptr, BM_CREATE_NOP);
1449 if (calc_uvs) {
1451 }
1453
1454 f = BM_face_create_quad_tri(bm, cent2, firstv2, v2, nullptr, nullptr, BM_CREATE_NOP);
1455 if (calc_uvs) {
1457 }
1459 }
1460
1461 f = BM_face_create_quad_tri(bm, v1, v2, firstv2, firstv1, nullptr, BM_CREATE_NOP);
1462 if (calc_uvs) {
1464 }
1465
1466 if (calc_uvs) {
1467 BM_mesh_calc_uvs_cone(bm, mat, rad2, rad1, segs, cap_ends, FACE_MARK, cd_loop_uv_offset);
1468 }
1469
1470 /* Collapse vertices at the first end. */
1471 if (rad1 == 0.0f) {
1472 if (cap_ends) {
1473 BM_vert_kill(bm, cent1);
1474 }
1475 for (int i = 0; i < side_faces_len; i++) {
1476 f = side_faces[i];
1478 BM_edge_collapse(bm, l->prev->e, l->prev->v, true, true);
1479 }
1480 }
1481
1482 /* Collapse vertices at the second end. */
1483 if (rad2 == 0.0f) {
1484 if (cap_ends) {
1485 BM_vert_kill(bm, cent2);
1486 }
1487 for (int i = 0; i < side_faces_len; i++) {
1488 f = side_faces[i];
1490 BM_edge_collapse(bm, l->next->e, l->next->v, true, true);
1491 }
1492 }
1493
1494 if (!cap_tris) {
1495 BMO_op_callf(bm, op->flag, "dissolve_faces faces=%ff", FACE_NEW);
1496 }
1497
1498 if (side_faces != nullptr) {
1499 MEM_freeN(side_faces);
1500 }
1501
1503}
1504
1506 float mat[4][4],
1507 const float radius_top,
1508 const float radius_bottom,
1509 const int segments,
1510 const bool cap_ends,
1511 const short oflag,
1512 const int cd_loop_uv_offset)
1513{
1514 BMFace *f;
1515 BMLoop *l;
1516 BMIter fiter, liter;
1517
1518 const float uv_width = 1.0f / float(segments);
1519 const float uv_height = cap_ends ? 0.5f : 1.0f;
1520
1521 /* Note that all this allows us to handle all cases
1522 * (real cone, truncated cone, with or without ends capped)
1523 * with a single common code. */
1524 const float uv_center_y = cap_ends ? 0.25f : 0.5f;
1525 const float uv_center_x_top = cap_ends ? 0.25f : 0.5f;
1526 const float uv_center_x_bottom = cap_ends ? 0.75f : 0.5f;
1527 const float uv_radius = cap_ends ? 0.24f : 0.5f;
1528
1529 /* Using the opposite's end uv_scale as a fallback allows us to handle 'real cone' case. */
1530 const float uv_scale_top = (radius_top != 0.0f) ?
1531 (uv_radius / radius_top) :
1532 ((radius_bottom != 0.0f) ? (uv_radius / radius_bottom) :
1533 uv_radius);
1534 const float uv_scale_bottom = (radius_bottom != 0.0f) ? (uv_radius / radius_bottom) :
1535 uv_scale_top;
1536
1537 float local_up[3] = {0.0f, 0.0f, 1.0f};
1538
1539 float x, y;
1540 float inv_mat[4][4];
1541 int loop_index;
1542
1543 /* Transform the up-vector like we did the cone itself, without location. */
1544 mul_mat3_m4_v3(mat, local_up);
1545 /* Remove global scaling. */
1546 normalize_v3(local_up);
1547
1548 invert_m4_m4(inv_mat, mat);
1549
1550 BLI_assert(cd_loop_uv_offset != -1); /* caller is responsible for ensuring the mesh has UVs */
1551
1552 x = 1.0f;
1553 y = 1.0f - uv_height;
1554
1555 BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
1556 if (!BMO_face_flag_test(bm, f, oflag)) {
1557 continue;
1558 }
1559
1560 if (f->len == 4 && radius_top && radius_bottom) {
1561 /* side face - so unwrap it in a rectangle */
1562 BM_ITER_ELEM_INDEX (l, &liter, f, BM_LOOPS_OF_FACE, loop_index) {
1563 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1564
1565 switch (loop_index) {
1566 case 0:
1567 /* Continue in the last position */
1568 break;
1569 case 1:
1570 y += uv_height;
1571 break;
1572 case 2:
1573 x -= uv_width;
1574 break;
1575 case 3:
1576 y -= uv_height;
1577 break;
1578 default:
1579 break;
1580 }
1581
1582 luv[0] = x;
1583 luv[1] = y;
1584 }
1585 }
1586 else {
1587 /* Top or bottom face - so unwrap it by transforming
1588 * back to a circle and using the X/Y coords. */
1590
1591 BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
1592 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1593 float uv_vco[3];
1594
1595 mul_v3_m4v3(uv_vco, inv_mat, l->v->co);
1596
1597 if (dot_v3v3(f->no, local_up) > 0.0f) { /* if this is a top face of the cone */
1598 luv[0] = uv_center_x_top + uv_vco[0] * uv_scale_top;
1599 luv[1] = uv_center_y + uv_vco[1] * uv_scale_top;
1600 }
1601 else {
1602 luv[0] = uv_center_x_bottom + uv_vco[0] * uv_scale_bottom;
1603 luv[1] = uv_center_y + uv_vco[1] * uv_scale_bottom;
1604 }
1605 }
1606 }
1607 }
1608}
1609
1611{
1612 BMVert *verts[8];
1613 float mat[4][4];
1614 float off = BMO_slot_float_get(op->slots_in, "size") / 2.0f;
1615
1616 const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_PROP_FLOAT2);
1617 const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
1618
1619 /* rotation order set to match 'BM_mesh_calc_uvs_cube' */
1620 const char faces[6][4] = {
1621 {0, 1, 3, 2},
1622 {2, 3, 7, 6},
1623 {6, 7, 5, 4},
1624 {4, 5, 1, 0},
1625 {2, 6, 4, 0},
1626 {7, 3, 1, 5},
1627 };
1628
1629 BMO_slot_mat4_get(op->slots_in, "matrix", mat);
1630
1631 if (!off) {
1632 off = 0.5f;
1633 }
1634 int i = 0;
1635
1636 for (int x = -1; x < 2; x += 2) {
1637 for (int y = -1; y < 2; y += 2) {
1638 for (int z = -1; z < 2; z += 2) {
1639 float vec[3] = {float(x) * off, float(y) * off, float(z) * off};
1640 mul_m4_v3(mat, vec);
1641 verts[i] = BM_vert_create(bm, vec, nullptr, BM_CREATE_NOP);
1643 i++;
1644 }
1645 }
1646 }
1647
1648 for (i = 0; i < ARRAY_SIZE(faces); i++) {
1649 BMFace *f;
1650 BMVert *quad[4] = {
1651 verts[faces[i][0]],
1652 verts[faces[i][1]],
1653 verts[faces[i][2]],
1654 verts[faces[i][3]],
1655 };
1656
1657 f = BM_face_create_verts(bm, quad, 4, nullptr, BM_CREATE_NOP, true);
1658 if (calc_uvs) {
1660 }
1661 }
1662
1663 if (calc_uvs) {
1665 }
1666
1668}
1669
1671{
1672 BMFace *f;
1673 BMLoop *l;
1674 BMIter fiter, liter;
1675 const float width = 0.25f;
1676
1677 const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_PROP_FLOAT2);
1678
1679 float x = 0.375f;
1680 float y = 0.0f;
1681
1682 int loop_index;
1683
1684 BLI_assert(cd_loop_uv_offset != -1); /* the caller can ensure that we have UVs */
1685
1686 BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
1687 if (!BMO_face_flag_test(bm, f, oflag)) {
1688 continue;
1689 }
1690
1691 BM_ITER_ELEM_INDEX (l, &liter, f, BM_LOOPS_OF_FACE, loop_index) {
1692 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1693
1694 luv[0] = x;
1695 luv[1] = y;
1696
1697 switch (loop_index) {
1698 case 0:
1699 x += width;
1700 break;
1701 case 1:
1702 y += width;
1703 break;
1704 case 2:
1705 x -= width;
1706 break;
1707 case 3:
1708 y -= width;
1709 break;
1710 default:
1711 break;
1712 }
1713 }
1714
1715 if (y >= 0.75f && x > 0.125f) {
1716 x = 0.125f;
1717 y = 0.5f;
1718 }
1719 else if (x <= 0.125f) {
1720 x = 0.625f;
1721 y = 0.5f;
1722 }
1723 else {
1724 y += 0.25f;
1725 }
1726 }
1727}
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
#define sinf(x)
#define cosf(x)
#define atan2f(x, y)
#define fabsf(x)
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]
float no[3]
union BMOpSlot::@235224312042353323006064013255004341152151224014 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