Blender V4.3
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
11#include "MEM_guardedalloc.h"
12
13#include "BLI_math_base_safe.h"
14#include "BLI_math_matrix.h"
15#include "BLI_math_rotation.h"
16#include "BLI_math_vector.h"
17
18#include "BKE_customdata.hh"
19
20#include "bmesh.hh"
22
23/* ************************ primitives ******************* */
24
25static const float icovert[12][3] = {
26 {0.0f, 0.0f, -200.0f},
27 {144.72f, -105.144f, -89.443f},
28 {-55.277f, -170.128, -89.443f},
29 {-178.885f, 0.0f, -89.443f},
30 {-55.277f, 170.128f, -89.443f},
31 {144.72f, 105.144f, -89.443f},
32 {55.277f, -170.128f, 89.443f},
33 {-144.72f, -105.144f, 89.443f},
34 {-144.72f, 105.144f, 89.443f},
35 {55.277f, 170.128f, 89.443f},
36 {178.885f, 0.0f, 89.443f},
37 {0.0f, 0.0f, 200.0f},
38};
39
40static const short icoface[20][3] = {
41 {0, 1, 2}, {1, 0, 5}, {0, 2, 3}, {0, 3, 4}, {0, 4, 5}, {1, 5, 10}, {2, 1, 6},
42 {3, 2, 7}, {4, 3, 8}, {5, 4, 9}, {1, 10, 6}, {2, 6, 7}, {3, 7, 8}, {4, 8, 9},
43 {5, 9, 10}, {6, 10, 11}, {7, 6, 11}, {8, 7, 11}, {9, 8, 11}, {10, 9, 11},
44};
45
46static const float icouvs[60][2] = {
47 {0.181819f, 0.000000f}, {0.272728f, 0.157461f}, {0.090910f, 0.157461f}, {0.272728f, 0.157461f},
48 {0.363637f, 0.000000f}, {0.454546f, 0.157461f}, {0.909091f, 0.000000f}, {1.000000f, 0.157461f},
49 {0.818182f, 0.157461f}, {0.727273f, 0.000000f}, {0.818182f, 0.157461f}, {0.636364f, 0.157461f},
50 {0.545455f, 0.000000f}, {0.636364f, 0.157461f}, {0.454546f, 0.157461f}, {0.272728f, 0.157461f},
51 {0.454546f, 0.157461f}, {0.363637f, 0.314921f}, {0.090910f, 0.157461f}, {0.272728f, 0.157461f},
52 {0.181819f, 0.314921f}, {0.818182f, 0.157461f}, {1.000000f, 0.157461f}, {0.909091f, 0.314921f},
53 {0.636364f, 0.157461f}, {0.818182f, 0.157461f}, {0.727273f, 0.314921f}, {0.454546f, 0.157461f},
54 {0.636364f, 0.157461f}, {0.545455f, 0.314921f}, {0.272728f, 0.157461f}, {0.363637f, 0.314921f},
55 {0.181819f, 0.314921f}, {0.090910f, 0.157461f}, {0.181819f, 0.314921f}, {0.000000f, 0.314921f},
56 {0.818182f, 0.157461f}, {0.909091f, 0.314921f}, {0.727273f, 0.314921f}, {0.636364f, 0.157461f},
57 {0.727273f, 0.314921f}, {0.545455f, 0.314921f}, {0.454546f, 0.157461f}, {0.545455f, 0.314921f},
58 {0.363637f, 0.314921f}, {0.181819f, 0.314921f}, {0.363637f, 0.314921f}, {0.272728f, 0.472382f},
59 {0.000000f, 0.314921f}, {0.181819f, 0.314921f}, {0.090910f, 0.472382f}, {0.727273f, 0.314921f},
60 {0.909091f, 0.314921f}, {0.818182f, 0.472382f}, {0.545455f, 0.314921f}, {0.727273f, 0.314921f},
61 {0.636364f, 0.472382f}, {0.363637f, 0.314921f}, {0.545455f, 0.314921f}, {0.454546f, 0.472382f},
62};
63
64static const int monkeyo = 4;
65static const int monkeynv = 271;
66static const int monkeynf = 250;
67static const signed char monkeyv[271][3] = {
68 {-71, 21, 98}, {-63, 12, 88}, {-57, 7, 74}, {-82, -3, 79}, {-82, 4, 92},
69 {-82, 17, 100}, {-92, 21, 102}, {-101, 12, 95}, {-107, 7, 83}, {-117, 31, 84},
70 {-109, 31, 95}, {-96, 31, 102}, {-92, 42, 102}, {-101, 50, 95}, {-107, 56, 83},
71 {-82, 66, 79}, {-82, 58, 92}, {-82, 46, 100}, {-71, 42, 98}, {-63, 50, 88},
72 {-57, 56, 74}, {-47, 31, 72}, {-55, 31, 86}, {-67, 31, 97}, {-66, 31, 99},
73 {-70, 43, 100}, {-82, 48, 103}, {-93, 43, 105}, {-98, 31, 105}, {-93, 20, 105},
74 {-82, 31, 106}, {-82, 15, 103}, {-70, 20, 100}, {-127, 55, 95}, {-127, 45, 105},
75 {-127, -87, 94}, {-127, -41, 100}, {-127, -24, 102}, {-127, -99, 92}, {-127, 52, 77},
76 {-127, 73, 73}, {-127, 115, -70}, {-127, 72, -109}, {-127, 9, -106}, {-127, -49, -45},
77 {-101, -24, 72}, {-87, -56, 73}, {-82, -89, 73}, {-80, -114, 68}, {-85, -121, 67},
78 {-104, -124, 71}, {-127, -126, 74}, {-71, -18, 68}, {-46, -5, 69}, {-21, 19, 57},
79 {-17, 55, 76}, {-36, 62, 80}, {-64, 77, 88}, {-86, 97, 94}, {-107, 92, 97},
80 {-119, 63, 96}, {-106, 53, 99}, {-111, 39, 98}, {-101, 12, 95}, {-79, 2, 90},
81 {-64, 8, 86}, {-47, 24, 83}, {-45, 38, 83}, {-50, 48, 85}, {-72, 56, 92},
82 {-95, 60, 97}, {-127, -98, 94}, {-113, -92, 94}, {-112, -107, 91}, {-119, -113, 89},
83 {-127, -114, 88}, {-127, -25, 96}, {-127, -18, 95}, {-114, -19, 95}, {-111, -29, 96},
84 {-116, -37, 95}, {-76, -6, 86}, {-48, 7, 80}, {-34, 26, 77}, {-32, 48, 84},
85 {-39, 53, 93}, {-71, 70, 102}, {-87, 82, 107}, {-101, 79, 109}, {-114, 55, 108},
86 {-111, -13, 104}, {-100, -57, 91}, {-95, -90, 88}, {-93, -105, 85}, {-97, -117, 81},
87 {-106, -119, 81}, {-127, -121, 82}, {-127, 6, 93}, {-127, 27, 98}, {-85, 61, 95},
88 {-106, 18, 96}, {-110, 27, 97}, {-112, -88, 94}, {-117, -57, 96}, {-127, -57, 96},
89 {-127, -42, 95}, {-115, -35, 100}, {-110, -29, 102}, {-113, -17, 100}, {-122, -16, 100},
90 {-127, -26, 106}, {-121, -19, 104}, {-115, -20, 104}, {-113, -29, 106}, {-117, -32, 103},
91 {-127, -37, 103}, {-94, -40, 71}, {-106, -31, 91}, {-104, -40, 91}, {-97, -32, 71},
92 {-127, -112, 88}, {-121, -111, 88}, {-115, -105, 91}, {-115, -95, 93}, {-127, -100, 84},
93 {-115, -96, 85}, {-115, -104, 82}, {-121, -109, 81}, {-127, -110, 81}, {-105, 28, 100},
94 {-103, 20, 99}, {-84, 55, 97}, {-92, 54, 99}, {-73, 51, 99}, {-55, 45, 89},
95 {-52, 37, 88}, {-53, 25, 87}, {-66, 13, 92}, {-79, 8, 95}, {-98, 14, 100},
96 {-104, 38, 100}, {-100, 48, 100}, {-97, 46, 97}, {-102, 38, 97}, {-96, 16, 97},
97 {-79, 11, 93}, {-68, 15, 90}, {-57, 27, 86}, {-56, 36, 86}, {-59, 43, 87},
98 {-74, 50, 96}, {-91, 51, 98}, {-84, 52, 96}, {-101, 22, 96}, {-102, 29, 96},
99 {-113, 59, 78}, {-102, 85, 79}, {-84, 88, 76}, {-65, 71, 71}, {-40, 58, 63},
100 {-25, 52, 59}, {-28, 21, 48}, {-50, 0, 53}, {-71, -12, 60}, {-127, 115, 37},
101 {-127, 126, -10}, {-127, -25, -86}, {-127, -59, 24}, {-127, -125, 59}, {-127, -103, 44},
102 {-127, -73, 41}, {-127, -62, 36}, {-18, 30, 7}, {-17, 41, -6}, {-28, 34, -56},
103 {-68, 56, -90}, {-33, -6, 9}, {-51, -16, -21}, {-45, -1, -55}, {-84, 7, -85},
104 {-97, -45, 52}, {-104, -53, 33}, {-90, -91, 49}, {-95, -64, 50}, {-85, -117, 51},
105 {-109, -97, 47}, {-111, -69, 46}, {-106, -121, 56}, {-99, -36, 55}, {-100, -29, 60},
106 {-101, -22, 64}, {-100, -50, 21}, {-89, -40, -34}, {-83, -19, -69}, {-69, 111, -49},
107 {-69, 119, -9}, {-69, 109, 30}, {-68, 67, 55}, {-34, 52, 43}, {-46, 58, 36},
108 {-45, 90, 7}, {-25, 72, 16}, {-25, 79, -15}, {-45, 96, -25}, {-45, 87, -57},
109 {-25, 69, -46}, {-48, 42, -75}, {-65, 3, -70}, {-22, 42, -26}, {-75, -22, 19},
110 {-72, -25, -27}, {-13, 52, -30}, {-28, -18, -16}, {6, -13, -42}, {37, 7, -55},
111 {46, 41, -54}, {31, 65, -54}, {4, 61, -40}, {3, 53, -37}, {25, 56, -50},
112 {35, 37, -52}, {28, 10, -52}, {5, -5, -39}, {-21, -9, -17}, {-9, 46, -28},
113 {-6, 39, -37}, {-14, -3, -27}, {6, 0, -47}, {25, 12, -57}, {31, 32, -57},
114 {23, 46, -56}, {4, 44, -46}, {-19, 37, -27}, {-20, 22, -35}, {-30, 12, -35},
115 {-22, 11, -35}, {-19, 2, -35}, {-23, -2, -35}, {-34, 0, -9}, {-35, -3, -22},
116 {-35, 5, -24}, {-25, 26, -27}, {-13, 31, -34}, {-13, 30, -41}, {-23, -2, -41},
117 {-18, 2, -41}, {-21, 10, -41}, {-29, 12, -41}, {-19, 22, -41}, {6, 42, -53},
118 {25, 44, -62}, {34, 31, -63}, {28, 11, -62}, {7, 0, -54}, {-14, -2, -34},
119 {-5, 37, -44}, {-13, 14, -42}, {-7, 8, -43}, {1, 16, -47}, {-4, 22, -45},
120 {3, 30, -48}, {8, 24, -49}, {15, 27, -50}, {12, 35, -50}, {4, 56, -62},
121 {33, 60, -70}, {48, 38, -64}, {41, 7, -68}, {6, -11, -63}, {-26, -16, -42},
122 {-17, 49, -49},
123};
124
125static signed char monkeyf[250][4] = {
126 {27, 4, 5, 26}, {25, 4, 5, 24}, {3, 6, 5, 4},
127 {1, 6, 5, 2}, {5, 6, 7, 4}, {3, 6, 7, 2},
128 {5, 8, 7, 6}, {3, 8, 7, 4}, {7, 8, 9, 6},
129 {5, 8, 9, 4}, {7, 10, 9, 8}, {5, 10, 9, 6},
130 {9, 10, 11, 8}, {7, 10, 11, 6}, {9, 12, 11, 10},
131 {7, 12, 11, 8}, {11, 6, 13, 12}, {5, 4, 13, 12},
132 {3, -2, 13, 12}, {-3, -4, 13, 12}, {-5, -10, 13, 12},
133 {-11, -12, 14, 12}, {-13, -18, 14, 13}, {-19, 4, 5, 13},
134 {10, 12, 4, 4}, {10, 11, 9, 9}, {8, 7, 9, 9},
135 {7, 5, 6, 6}, {6, 3, 4, 4}, {5, 1, 2, 2},
136 {4, -1, 0, 0}, {3, -3, -2, -2}, {22, 67, 68, 23},
137 {20, 65, 66, 21}, {18, 63, 64, 19}, {16, 61, 62, 17},
138 {14, 59, 60, 15}, {12, 19, 48, 57}, {18, 19, 48, 47},
139 {18, 19, 48, 47}, {18, 19, 48, 47}, {18, 19, 48, 47},
140 {18, 19, 48, 47}, {18, 19, 48, 47}, {18, 19, 48, 47},
141 {18, 19, 48, 47}, {18, -9, -8, 47}, {18, 27, 45, 46},
142 {26, 55, 43, 44}, {24, 41, 42, 54}, {22, 39, 40, 23},
143 {20, 37, 38, 21}, {18, 35, 36, 19}, {16, 33, 34, 17},
144 {14, 31, 32, 15}, {12, 39, 30, 13}, {11, 48, 45, 38},
145 {8, 36, -19, 9}, {8, -20, 44, 47}, {42, 45, 46, 43},
146 {18, 19, 40, 39}, {16, 17, 38, 37}, {14, 15, 36, 35},
147 {32, 44, 43, 33}, {12, 33, 32, 42}, {19, 44, 43, 42},
148 {40, 41, 42, -27}, {8, 9, 39, -28}, {15, 43, 42, 16},
149 {13, 43, 42, 14}, {11, 43, 42, 12}, {9, -30, 42, 10},
150 {37, 12, 38, -32}, {-33, 37, 45, 46}, {-33, 40, 41, 39},
151 {38, 40, 41, 37}, {36, 40, 41, 35}, {34, 40, 41, 33},
152 {36, 39, 38, 37}, {35, 40, 39, 38}, {1, 2, 14, 21},
153 {1, 2, 40, 13}, {1, 2, 40, 39}, {1, 24, 12, 39},
154 {-34, 36, 38, 11}, {35, 38, 36, 37}, {-37, 8, 35, 37},
155 {-11, -12, -45, 40}, {-11, -12, 39, 38}, {-11, -12, 37, 36},
156 {-11, -12, 35, 34}, {33, 34, 40, 41}, {33, 34, 38, 39},
157 {33, 34, 36, 37}, {33, -52, 34, 35}, {33, 37, 36, 34},
158 {33, 35, 34, 34}, {8, 7, 37, 36}, {-32, 7, 35, 46},
159 {-34, -33, 45, 46}, {4, -33, 43, 34}, {-34, -33, 41, 42},
160 {-34, -33, 39, 40}, {-34, -33, 37, 38}, {-34, -33, 35, 36},
161 {-34, -33, 33, 34}, {-34, -33, 31, 32}, {-34, -4, 28, 30},
162 {-5, -34, 28, 27}, {-35, -44, 36, 27}, {26, 35, 36, 45},
163 {24, 25, 44, 45}, {25, 23, 44, 42}, {25, 24, 41, 40},
164 {25, 24, 39, 38}, {25, 24, 37, 36}, {25, 24, 35, 34},
165 {25, 24, 33, 32}, {25, 24, 31, 30}, {15, 24, 29, 38},
166 {25, 24, 27, 26}, {23, 12, 37, 26}, {11, 12, 35, 36},
167 {-86, -59, 36, -80}, {-60, -61, 36, 35}, {-62, -63, 36, 35},
168 {-64, -65, 36, 35}, {-66, -67, 36, 35}, {-68, -69, 36, 35},
169 {-70, -71, 36, 35}, {-72, -73, 36, 35}, {-74, -75, 36, 35},
170 {42, 43, 53, 58}, {40, 41, 57, 56}, {38, 39, 55, 57},
171 {-81, -80, 37, 56}, {-83, -82, 55, 52}, {-85, -84, 51, 49},
172 {-87, -86, 48, 49}, {47, 50, 51, 48}, {46, 48, 51, 49},
173 {43, 46, 49, 44}, {-92, -91, 45, 42}, {-23, 49, 50, -20},
174 {-94, 40, 48, -24}, {-96, -22, 48, 49}, {-97, 48, 21, -90},
175 {-100, 36, 50, 23}, {22, 49, 48, -100}, {-101, 47, 46, 22},
176 {21, 45, 35, 25}, {33, 34, 44, 41}, {13, 14, 28, 24},
177 {-107, 26, 30, -106}, {14, 46, 45, 15}, {14, 44, 43, -110},
178 {-111, 42, 23, -110}, {6, 7, 45, 46}, {45, 44, 47, 46},
179 {45, 46, 47, 48}, {47, 46, 49, 48}, {17, 49, 47, 48},
180 {17, 36, 46, 48}, {35, 36, 44, 45}, {35, 36, 40, 43},
181 {35, 36, 38, 39}, {-4, -3, 37, 35}, {-123, 34, 33, 1},
182 {-9, -8, -7, -6}, {-10, -7, 32, -125}, {-127, -11, -126, -126},
183 {-7, -6, 5, 31}, {4, 5, 33, 30}, {4, 39, 33, 32},
184 {4, 35, 32, 38}, {20, 21, 39, 38}, {4, 37, 38, 5},
185 {-11, -10, 36, 3}, {-11, 15, 14, 35}, {13, 16, 34, 34},
186 {-13, 14, 13, 13}, {-3, 1, 30, 29}, {-3, 28, 29, 1},
187 {-2, 31, 28, -1}, {12, 13, 27, 30}, {-2, 26, 12, 12},
188 {35, 29, 42, 36}, {34, 35, 36, 33}, {32, 35, 36, 31},
189 {30, 35, 36, 29}, {28, 35, 36, 27}, {26, 35, 36, 25},
190 {34, 39, 38, 35}, {32, 39, 38, 33}, {30, 39, 38, 31},
191 {28, 39, 38, 29}, {26, 39, 38, 27}, {25, 31, 32, 38},
192 {-18, -17, 45, 44}, {-18, 17, 28, 44}, {-24, -20, 42, -23},
193 {11, 35, 27, 14}, {25, 28, 39, 41}, {37, 41, 40, 38},
194 {34, 40, 36, 35}, {32, 40, 39, 33}, {30, 39, 31, 40},
195 {21, 29, 39, 22}, {-31, 37, 28, 4}, {-32, 33, 35, 36},
196 {32, 33, 34, 34}, {18, 35, 36, 48}, {34, 25, 40, 35},
197 {24, 25, 38, 39}, {24, 25, 36, 37}, {24, 25, 34, 35},
198 {24, 25, 32, 33}, {24, 13, 41, 31}, {17, 11, 41, 35},
199 {15, 16, 34, 35}, {13, 14, 34, 35}, {11, 12, 34, 35},
200 {9, 10, 34, 35}, {7, 8, 34, 35}, {26, 25, 37, 36},
201 {35, 36, 37, 38}, {37, 36, 39, 38}, {37, 38, 39, 40},
202 {25, 31, 36, 39}, {18, 34, 35, 30}, {17, 22, 30, 33},
203 {19, 29, 21, 20}, {16, 26, 29, 17}, {24, 29, 28, 25},
204 {22, 31, 28, 23}, {20, 31, 30, 21}, {18, 31, 30, 19},
205 {16, 30, 17, 17}, {-21, -22, 35, 34}, {-21, -22, 33, 32},
206 {-21, -22, 31, 30}, {-21, -22, 29, 28}, {-21, -22, 27, 26},
207 {-28, -22, 25, 31}, {24, 28, 29, 30}, {23, 24, 26, 27},
208 {23, 24, 25, 25}, {-69, -35, -32, 27}, {-70, 26, 25, -66},
209 {-68, -67, 24, -33},
210};
211
212static const float monkeyuvs[] = {
213 0.843250f, 0.588863f, 0.833697f, 0.611927f, 0.794218f, 0.611927f, 0.815334f, 0.560948f,
214 0.866314f, 0.937441f, 0.866314f, 0.897962f, 0.889378f, 0.888409f, 0.917293f, 0.916324f,
215 0.815334f, 0.560948f, 0.794218f, 0.611927f, 0.746541f, 0.611927f, 0.781622f, 0.527235f,
216 0.866314f, 0.985118f, 0.866314f, 0.937441f, 0.917293f, 0.916324f, 0.951006f, 0.950037f,
217 0.794218f, 0.611927f, 0.815334f, 0.662907f, 0.781622f, 0.696619f, 0.746541f, 0.611927f,
218 0.781622f, 0.950037f, 0.815334f, 0.916325f, 0.866314f, 0.937441f, 0.866314f, 0.985118f,
219 0.833697f, 0.611927f, 0.843250f, 0.634991f, 0.815334f, 0.662907f, 0.794218f, 0.611927f,
220 0.815334f, 0.916325f, 0.843250f, 0.888409f, 0.866314f, 0.897962f, 0.866314f, 0.937441f,
221 0.843250f, 0.634991f, 0.866314f, 0.644544f, 0.866314f, 0.684023f, 0.815334f, 0.662907f,
222 0.794218f, 0.865345f, 0.833697f, 0.865345f, 0.843250f, 0.888409f, 0.815334f, 0.916325f,
223 0.815334f, 0.662907f, 0.866314f, 0.684023f, 0.866314f, 0.731700f, 0.781622f, 0.696619f,
224 0.746541f, 0.865345f, 0.794218f, 0.865345f, 0.815334f, 0.916325f, 0.781622f, 0.950037f,
225 0.866314f, 0.684023f, 0.917293f, 0.662907f, 0.951006f, 0.696619f, 0.866314f, 0.731700f,
226 0.781622f, 0.780653f, 0.815334f, 0.814366f, 0.794218f, 0.865345f, 0.746541f, 0.865345f,
227 0.866314f, 0.644544f, 0.889378f, 0.634991f, 0.917293f, 0.662907f, 0.866314f, 0.684023f,
228 0.815334f, 0.814366f, 0.843250f, 0.842281f, 0.833697f, 0.865345f, 0.794218f, 0.865345f,
229 0.889378f, 0.634991f, 0.898931f, 0.611927f, 0.938410f, 0.611927f, 0.917293f, 0.662907f,
230 0.866314f, 0.793249f, 0.866314f, 0.832728f, 0.843250f, 0.842281f, 0.815334f, 0.814366f,
231 0.917293f, 0.662907f, 0.938410f, 0.611927f, 0.986087f, 0.611927f, 0.951006f, 0.696619f,
232 0.866314f, 0.745572f, 0.866314f, 0.793249f, 0.815334f, 0.814366f, 0.781622f, 0.780653f,
233 0.938410f, 0.611927f, 0.917294f, 0.560947f, 0.951006f, 0.527235f, 0.986087f, 0.611927f,
234 0.951006f, 0.780653f, 0.917294f, 0.814365f, 0.866314f, 0.793249f, 0.866314f, 0.745572f,
235 0.898931f, 0.611927f, 0.889378f, 0.588863f, 0.917294f, 0.560947f, 0.938410f, 0.611927f,
236 0.917294f, 0.814365f, 0.889378f, 0.842281f, 0.866314f, 0.832728f, 0.866314f, 0.793249f,
237 0.889378f, 0.588863f, 0.866314f, 0.579310f, 0.866314f, 0.539831f, 0.917294f, 0.560947f,
238 0.938410f, 0.865345f, 0.898931f, 0.865345f, 0.889378f, 0.842281f, 0.917294f, 0.814365f,
239 0.917294f, 0.560947f, 0.866314f, 0.539831f, 0.866314f, 0.492154f, 0.951006f, 0.527235f,
240 0.986087f, 0.865345f, 0.938410f, 0.865345f, 0.917294f, 0.814365f, 0.951006f, 0.780653f,
241 0.866314f, 0.539831f, 0.815334f, 0.560948f, 0.781622f, 0.527235f, 0.866314f, 0.492154f,
242 0.951006f, 0.950037f, 0.917293f, 0.916324f, 0.938410f, 0.865345f, 0.986087f, 0.865345f,
243 0.866314f, 0.579310f, 0.843250f, 0.588863f, 0.815334f, 0.560948f, 0.866314f, 0.539831f,
244 0.917293f, 0.916324f, 0.889378f, 0.888409f, 0.898931f, 0.865345f, 0.938410f, 0.865345f,
245 0.843250f, 0.588863f, 0.866314f, 0.579310f, 0.866314f, 0.585461f, 0.847600f, 0.593213f,
246 0.892780f, 0.865345f, 0.898931f, 0.865345f, 0.889378f, 0.888409f, 0.885028f, 0.884059f,
247 0.866314f, 0.579310f, 0.889378f, 0.588863f, 0.885028f, 0.593213f, 0.866314f, 0.585461f,
248 0.885028f, 0.846631f, 0.889378f, 0.842281f, 0.898931f, 0.865345f, 0.892780f, 0.865345f,
249 0.889378f, 0.588863f, 0.898931f, 0.611927f, 0.892780f, 0.611927f, 0.885028f, 0.593213f,
250 0.866314f, 0.838879f, 0.866314f, 0.832728f, 0.889378f, 0.842281f, 0.885028f, 0.846631f,
251 0.898931f, 0.611927f, 0.889378f, 0.634991f, 0.885028f, 0.630641f, 0.892780f, 0.611927f,
252 0.847600f, 0.846631f, 0.843250f, 0.842281f, 0.866314f, 0.832728f, 0.866314f, 0.838879f,
253 0.889378f, 0.634991f, 0.866314f, 0.644544f, 0.866314f, 0.638393f, 0.885028f, 0.630641f,
254 0.839848f, 0.865345f, 0.833697f, 0.865345f, 0.843250f, 0.842281f, 0.847600f, 0.846631f,
255 0.866314f, 0.644544f, 0.843250f, 0.634991f, 0.847600f, 0.630641f, 0.866314f, 0.638393f,
256 0.847600f, 0.884059f, 0.843250f, 0.888409f, 0.833697f, 0.865345f, 0.839848f, 0.865345f,
257 0.843250f, 0.634991f, 0.833697f, 0.611927f, 0.839848f, 0.611927f, 0.847600f, 0.630641f,
258 0.866314f, 0.891811f, 0.866314f, 0.897962f, 0.843250f, 0.888409f, 0.847600f, 0.884059f,
259 0.833697f, 0.611927f, 0.843250f, 0.588863f, 0.847600f, 0.593213f, 0.839848f, 0.611927f,
260 0.885028f, 0.884059f, 0.889378f, 0.888409f, 0.866314f, 0.897962f, 0.866314f, 0.891811f,
261 0.866314f, 0.611927f, 0.839848f, 0.611927f, 0.847600f, 0.593213f, 0.885028f, 0.884059f,
262 0.866314f, 0.891811f, 0.866314f, 0.865345f, 0.847600f, 0.630641f, 0.839848f, 0.611927f,
263 0.866314f, 0.611927f, 0.866314f, 0.865345f, 0.866314f, 0.891811f, 0.847600f, 0.884059f,
264 0.866314f, 0.611927f, 0.866314f, 0.638393f, 0.847600f, 0.630641f, 0.847600f, 0.884059f,
265 0.839848f, 0.865345f, 0.866314f, 0.865345f, 0.866314f, 0.611927f, 0.885028f, 0.630641f,
266 0.866314f, 0.638393f, 0.839848f, 0.865345f, 0.847600f, 0.846631f, 0.866314f, 0.865345f,
267 0.866314f, 0.611927f, 0.892780f, 0.611927f, 0.885028f, 0.630641f, 0.847600f, 0.846631f,
268 0.866314f, 0.838879f, 0.866314f, 0.865345f, 0.866314f, 0.611927f, 0.885028f, 0.593213f,
269 0.892780f, 0.611927f, 0.866314f, 0.838879f, 0.885028f, 0.846631f, 0.866314f, 0.865345f,
270 0.866314f, 0.611927f, 0.866314f, 0.585461f, 0.885028f, 0.593213f, 0.885028f, 0.846631f,
271 0.892780f, 0.865345f, 0.866314f, 0.865345f, 0.866314f, 0.611927f, 0.847600f, 0.593213f,
272 0.866314f, 0.585461f, 0.892780f, 0.865345f, 0.885028f, 0.884059f, 0.866314f, 0.865345f,
273 0.520711f, 0.060503f, 0.517028f, 0.068490f, 0.500000f, 0.064527f, 0.500000f, 0.054411f,
274 0.500000f, 0.064527f, 0.482972f, 0.068490f, 0.479289f, 0.060503f, 0.500000f, 0.054411f,
275 0.530457f, 0.065062f, 0.522612f, 0.070678f, 0.517028f, 0.068490f, 0.520711f, 0.060503f,
276 0.482972f, 0.068490f, 0.477388f, 0.070678f, 0.469543f, 0.065062f, 0.479289f, 0.060503f,
277 0.532878f, 0.067822f, 0.526301f, 0.079422f, 0.522612f, 0.070678f, 0.530457f, 0.065062f,
278 0.477388f, 0.070678f, 0.473699f, 0.079422f, 0.467122f, 0.067822f, 0.469543f, 0.065062f,
279 0.544695f, 0.083023f, 0.529228f, 0.091098f, 0.526301f, 0.079422f, 0.532878f, 0.067822f,
280 0.473699f, 0.079422f, 0.470772f, 0.091098f, 0.455305f, 0.083023f, 0.467122f, 0.067822f,
281 0.565647f, 0.115495f, 0.537536f, 0.127779f, 0.529228f, 0.091098f, 0.544695f, 0.083023f,
282 0.470772f, 0.091098f, 0.462464f, 0.127779f, 0.434353f, 0.115495f, 0.455305f, 0.083023f,
283 0.586916f, 0.172042f, 0.626605f, 0.208159f, 0.600470f, 0.238288f, 0.535885f, 0.215568f,
284 0.399530f, 0.238288f, 0.373395f, 0.208159f, 0.413084f, 0.172042f, 0.464115f, 0.215568f,
285 0.626605f, 0.208159f, 0.650908f, 0.240294f, 0.636962f, 0.261221f, 0.600470f, 0.238288f,
286 0.363038f, 0.261221f, 0.349092f, 0.240294f, 0.373395f, 0.208159f, 0.399530f, 0.238288f,
287 0.650908f, 0.240294f, 0.689501f, 0.268805f, 0.655896f, 0.284413f, 0.636962f, 0.261221f,
288 0.344104f, 0.284413f, 0.310499f, 0.268805f, 0.349092f, 0.240294f, 0.363038f, 0.261221f,
289 0.689501f, 0.268805f, 0.684517f, 0.317795f, 0.659507f, 0.313152f, 0.655896f, 0.284413f,
290 0.340493f, 0.313152f, 0.315483f, 0.317795f, 0.310499f, 0.268805f, 0.344104f, 0.284413f,
291 0.684517f, 0.317795f, 0.671357f, 0.334694f, 0.649107f, 0.322437f, 0.659507f, 0.313152f,
292 0.350893f, 0.322437f, 0.328643f, 0.334694f, 0.315483f, 0.317795f, 0.340493f, 0.313152f,
293 0.671357f, 0.334694f, 0.636775f, 0.370732f, 0.613636f, 0.353108f, 0.649107f, 0.322437f,
294 0.386364f, 0.353108f, 0.363225f, 0.370732f, 0.328643f, 0.334694f, 0.350893f, 0.322437f,
295 0.636775f, 0.370732f, 0.602261f, 0.395588f, 0.594178f, 0.371277f, 0.613636f, 0.353108f,
296 0.405822f, 0.371277f, 0.397739f, 0.395588f, 0.363225f, 0.370732f, 0.386364f, 0.353108f,
297 0.602261f, 0.395588f, 0.581044f, 0.398468f, 0.577351f, 0.373341f, 0.594178f, 0.371277f,
298 0.422649f, 0.373341f, 0.418956f, 0.398468f, 0.397739f, 0.395588f, 0.405822f, 0.371277f,
299 0.581044f, 0.398468f, 0.532016f, 0.387365f, 0.539817f, 0.354339f, 0.577351f, 0.373341f,
300 0.460183f, 0.354339f, 0.467984f, 0.387365f, 0.418956f, 0.398468f, 0.422649f, 0.373341f,
301 0.532016f, 0.387365f, 0.500000f, 0.382860f, 0.500000f, 0.340417f, 0.539817f, 0.354339f,
302 0.500000f, 0.340417f, 0.500000f, 0.382860f, 0.467984f, 0.387365f, 0.460183f, 0.354339f,
303 0.559135f, 0.334326f, 0.579057f, 0.335646f, 0.577351f, 0.373341f, 0.539817f, 0.354339f,
304 0.422649f, 0.373341f, 0.420943f, 0.335646f, 0.440865f, 0.334326f, 0.460183f, 0.354339f,
305 0.579057f, 0.335646f, 0.592090f, 0.332885f, 0.594178f, 0.371277f, 0.577351f, 0.373341f,
306 0.405822f, 0.371277f, 0.407910f, 0.332885f, 0.420943f, 0.335646f, 0.422649f, 0.373341f,
307 0.606163f, 0.325516f, 0.613636f, 0.353108f, 0.594178f, 0.371277f, 0.592090f, 0.332885f,
308 0.405822f, 0.371277f, 0.386364f, 0.353108f, 0.393837f, 0.325516f, 0.407910f, 0.332885f,
309 0.628251f, 0.311636f, 0.649107f, 0.322437f, 0.613636f, 0.353108f, 0.606163f, 0.325516f,
310 0.386364f, 0.353108f, 0.350893f, 0.322437f, 0.371749f, 0.311636f, 0.393837f, 0.325516f,
311 0.635551f, 0.300507f, 0.659507f, 0.313152f, 0.649107f, 0.322437f, 0.628251f, 0.311636f,
312 0.350893f, 0.322437f, 0.340493f, 0.313152f, 0.364449f, 0.300507f, 0.371749f, 0.311636f,
313 0.631484f, 0.283889f, 0.655896f, 0.284413f, 0.659507f, 0.313152f, 0.635551f, 0.300507f,
314 0.340493f, 0.313152f, 0.344104f, 0.284413f, 0.368516f, 0.283889f, 0.364449f, 0.300507f,
315 0.611331f, 0.264411f, 0.636962f, 0.261221f, 0.655896f, 0.284413f, 0.631484f, 0.283889f,
316 0.344104f, 0.284413f, 0.363038f, 0.261221f, 0.388669f, 0.264411f, 0.368516f, 0.283889f,
317 0.592372f, 0.254897f, 0.600470f, 0.238288f, 0.636962f, 0.261221f, 0.611331f, 0.264411f,
318 0.363038f, 0.261221f, 0.399530f, 0.238288f, 0.407628f, 0.254897f, 0.388669f, 0.264411f,
319 0.559669f, 0.267717f, 0.535885f, 0.215568f, 0.600470f, 0.238288f, 0.592372f, 0.254897f,
320 0.399530f, 0.238288f, 0.464115f, 0.215568f, 0.440331f, 0.267717f, 0.407628f, 0.254897f,
321 0.559669f, 0.267717f, 0.550878f, 0.277832f, 0.500000f, 0.252445f, 0.535885f, 0.215568f,
322 0.500000f, 0.252445f, 0.449122f, 0.277832f, 0.440331f, 0.267717f, 0.464115f, 0.215568f,
323 0.559135f, 0.334326f, 0.539817f, 0.354339f, 0.500000f, 0.340417f, 0.544001f, 0.314523f,
324 0.500000f, 0.340417f, 0.460183f, 0.354339f, 0.440865f, 0.334326f, 0.455999f, 0.314523f,
325 0.544001f, 0.314523f, 0.500000f, 0.340417f, 0.500000f, 0.295691f, 0.543637f, 0.293371f,
326 0.500000f, 0.295691f, 0.500000f, 0.340417f, 0.455999f, 0.314523f, 0.456363f, 0.293371f,
327 0.500000f, 0.252445f, 0.550878f, 0.277832f, 0.543637f, 0.293371f, 0.500000f, 0.295691f,
328 0.456363f, 0.293371f, 0.449122f, 0.277832f, 0.500000f, 0.252445f, 0.500000f, 0.295691f,
329 0.506819f, 0.075382f, 0.500000f, 0.073497f, 0.500000f, 0.064527f, 0.517028f, 0.068490f,
330 0.500000f, 0.064527f, 0.500000f, 0.073497f, 0.493181f, 0.075382f, 0.482972f, 0.068490f,
331 0.511782f, 0.080633f, 0.506819f, 0.075382f, 0.517028f, 0.068490f, 0.522612f, 0.070678f,
332 0.482972f, 0.068490f, 0.493181f, 0.075382f, 0.488218f, 0.080633f, 0.477388f, 0.070678f,
333 0.512172f, 0.093457f, 0.511782f, 0.080633f, 0.522612f, 0.070678f, 0.526301f, 0.079422f,
334 0.477388f, 0.070678f, 0.488218f, 0.080633f, 0.487828f, 0.093457f, 0.473699f, 0.079422f,
335 0.537536f, 0.127779f, 0.514257f, 0.133422f, 0.513874f, 0.097191f, 0.529228f, 0.091098f,
336 0.486126f, 0.097191f, 0.485743f, 0.133422f, 0.462464f, 0.127779f, 0.470772f, 0.091098f,
337 0.512172f, 0.093457f, 0.526301f, 0.079422f, 0.529228f, 0.091098f, 0.513874f, 0.097191f,
338 0.470772f, 0.091098f, 0.473699f, 0.079422f, 0.487828f, 0.093457f, 0.486126f, 0.097191f,
339 0.520226f, 0.164615f, 0.500000f, 0.157864f, 0.500000f, 0.134352f, 0.514257f, 0.133422f,
340 0.500000f, 0.134352f, 0.500000f, 0.157864f, 0.479774f, 0.164615f, 0.485743f, 0.133422f,
341 0.513874f, 0.097191f, 0.514257f, 0.133422f, 0.500000f, 0.134352f, 0.500000f, 0.100063f,
342 0.500000f, 0.134352f, 0.485743f, 0.133422f, 0.486126f, 0.097191f, 0.500000f, 0.100063f,
343 0.500000f, 0.091346f, 0.512172f, 0.093457f, 0.513874f, 0.097191f, 0.500000f, 0.100063f,
344 0.486126f, 0.097191f, 0.487828f, 0.093457f, 0.500000f, 0.091346f, 0.500000f, 0.100063f,
345 0.530258f, 0.180239f, 0.521901f, 0.181560f, 0.517666f, 0.172353f, 0.520226f, 0.164615f,
346 0.482334f, 0.172353f, 0.478099f, 0.181560f, 0.469742f, 0.180239f, 0.479774f, 0.164615f,
347 0.523673f, 0.198817f, 0.518957f, 0.194728f, 0.521901f, 0.181560f, 0.530258f, 0.180239f,
348 0.478099f, 0.181560f, 0.481043f, 0.194728f, 0.476327f, 0.198817f, 0.469742f, 0.180239f,
349 0.500000f, 0.203867f, 0.508211f, 0.197295f, 0.518957f, 0.194728f, 0.523673f, 0.198817f,
350 0.481043f, 0.194728f, 0.491789f, 0.197295f, 0.500000f, 0.203867f, 0.476327f, 0.198817f,
351 0.500000f, 0.197278f, 0.500000f, 0.192167f, 0.508211f, 0.197295f, 0.500000f, 0.203867f,
352 0.491789f, 0.197295f, 0.500000f, 0.192167f, 0.500000f, 0.197278f, 0.500000f, 0.203867f,
353 0.500000f, 0.157864f, 0.520226f, 0.164615f, 0.517666f, 0.172353f, 0.500000f, 0.165170f,
354 0.482334f, 0.172353f, 0.479774f, 0.164615f, 0.500000f, 0.157864f, 0.500000f, 0.165170f,
355 0.500000f, 0.165170f, 0.517666f, 0.172353f, 0.513538f, 0.176949f, 0.500000f, 0.171718f,
356 0.486462f, 0.176949f, 0.482334f, 0.172353f, 0.500000f, 0.165170f, 0.500000f, 0.171718f,
357 0.500000f, 0.192167f, 0.500000f, 0.186182f, 0.508818f, 0.192407f, 0.508211f, 0.197295f,
358 0.491182f, 0.192407f, 0.500000f, 0.186182f, 0.500000f, 0.192167f, 0.491789f, 0.197295f,
359 0.508211f, 0.197295f, 0.508818f, 0.192407f, 0.515232f, 0.190709f, 0.518957f, 0.194728f,
360 0.484768f, 0.190709f, 0.491182f, 0.192407f, 0.491789f, 0.197295f, 0.481043f, 0.194728f,
361 0.518957f, 0.194728f, 0.515232f, 0.190709f, 0.516908f, 0.181873f, 0.521901f, 0.181560f,
362 0.483092f, 0.181873f, 0.484768f, 0.190709f, 0.481043f, 0.194728f, 0.478099f, 0.181560f,
363 0.521901f, 0.181560f, 0.516908f, 0.181873f, 0.513538f, 0.176949f, 0.517666f, 0.172353f,
364 0.486462f, 0.176949f, 0.483092f, 0.181873f, 0.478099f, 0.181560f, 0.482334f, 0.172353f,
365 0.500000f, 0.186182f, 0.516908f, 0.181873f, 0.515232f, 0.190709f, 0.508818f, 0.192407f,
366 0.484768f, 0.190709f, 0.483092f, 0.181873f, 0.500000f, 0.186182f, 0.491182f, 0.192407f,
367 0.500000f, 0.186182f, 0.500000f, 0.171718f, 0.513538f, 0.176949f, 0.516908f, 0.181873f,
368 0.486462f, 0.176949f, 0.500000f, 0.171718f, 0.500000f, 0.186182f, 0.483092f, 0.181873f,
369 0.500000f, 0.203867f, 0.523673f, 0.198817f, 0.535885f, 0.215568f, 0.500000f, 0.252445f,
370 0.464115f, 0.215568f, 0.476327f, 0.198817f, 0.500000f, 0.203867f, 0.500000f, 0.252445f,
371 0.523673f, 0.198817f, 0.530258f, 0.180239f, 0.544209f, 0.172814f, 0.535885f, 0.215568f,
372 0.455791f, 0.172814f, 0.469742f, 0.180239f, 0.476327f, 0.198817f, 0.464115f, 0.215568f,
373 0.530258f, 0.180239f, 0.520226f, 0.164615f, 0.541327f, 0.154899f, 0.544209f, 0.172814f,
374 0.458673f, 0.154899f, 0.479774f, 0.164615f, 0.469742f, 0.180239f, 0.455791f, 0.172814f,
375 0.520226f, 0.164615f, 0.514257f, 0.133422f, 0.537536f, 0.127779f, 0.541327f, 0.154899f,
376 0.462464f, 0.127779f, 0.485743f, 0.133422f, 0.479774f, 0.164615f, 0.458673f, 0.154899f,
377 0.565647f, 0.115495f, 0.578661f, 0.139176f, 0.541327f, 0.154899f, 0.537536f, 0.127779f,
378 0.458673f, 0.154899f, 0.421339f, 0.139176f, 0.434353f, 0.115495f, 0.462464f, 0.127779f,
379 0.578661f, 0.139176f, 0.583245f, 0.154155f, 0.544209f, 0.172814f, 0.541327f, 0.154899f,
380 0.455791f, 0.172814f, 0.416755f, 0.154155f, 0.421339f, 0.139176f, 0.458673f, 0.154899f,
381 0.586916f, 0.172042f, 0.535885f, 0.215568f, 0.544209f, 0.172814f, 0.583245f, 0.154155f,
382 0.455791f, 0.172814f, 0.464115f, 0.215568f, 0.413084f, 0.172042f, 0.416755f, 0.154155f,
383 0.512172f, 0.093457f, 0.500000f, 0.091346f, 0.500000f, 0.089977f, 0.509911f, 0.090724f,
384 0.500000f, 0.089977f, 0.500000f, 0.091346f, 0.487828f, 0.093457f, 0.490089f, 0.090724f,
385 0.511782f, 0.080633f, 0.512172f, 0.093457f, 0.509911f, 0.090724f, 0.509713f, 0.082236f,
386 0.490089f, 0.090724f, 0.487828f, 0.093457f, 0.488218f, 0.080633f, 0.490287f, 0.082236f,
387 0.506819f, 0.075382f, 0.511782f, 0.080633f, 0.509713f, 0.082236f, 0.505196f, 0.077083f,
388 0.490287f, 0.082236f, 0.488218f, 0.080633f, 0.493181f, 0.075382f, 0.494804f, 0.077083f,
389 0.500000f, 0.073497f, 0.506819f, 0.075382f, 0.505196f, 0.077083f, 0.500000f, 0.075473f,
390 0.494804f, 0.077083f, 0.493181f, 0.075382f, 0.500000f, 0.073497f, 0.500000f, 0.075473f,
391 0.500000f, 0.075473f, 0.505196f, 0.077083f, 0.503445f, 0.080840f, 0.500000f, 0.080320f,
392 0.496555f, 0.080840f, 0.494804f, 0.077083f, 0.500000f, 0.075473f, 0.500000f, 0.080320f,
393 0.505196f, 0.077083f, 0.509713f, 0.082236f, 0.506660f, 0.083289f, 0.503445f, 0.080840f,
394 0.493340f, 0.083289f, 0.490287f, 0.082236f, 0.494804f, 0.077083f, 0.496555f, 0.080840f,
395 0.509713f, 0.082236f, 0.509911f, 0.090724f, 0.506822f, 0.086791f, 0.506660f, 0.083289f,
396 0.493178f, 0.086791f, 0.490089f, 0.090724f, 0.490287f, 0.082236f, 0.493340f, 0.083289f,
397 0.509911f, 0.090724f, 0.500000f, 0.089977f, 0.500000f, 0.085637f, 0.506822f, 0.086791f,
398 0.500000f, 0.085637f, 0.500000f, 0.089977f, 0.490089f, 0.090724f, 0.493178f, 0.086791f,
399 0.500000f, 0.085637f, 0.500000f, 0.080320f, 0.503445f, 0.080840f, 0.506822f, 0.086791f,
400 0.496555f, 0.080840f, 0.500000f, 0.080320f, 0.500000f, 0.085637f, 0.493178f, 0.086791f,
401 0.506822f, 0.086791f, 0.503445f, 0.080840f, 0.506660f, 0.083289f, 0.493340f, 0.083289f,
402 0.496555f, 0.080840f, 0.493178f, 0.086791f, 0.543637f, 0.293371f, 0.550878f, 0.277832f,
403 0.562361f, 0.284338f, 0.559190f, 0.294882f, 0.437639f, 0.284338f, 0.449122f, 0.277832f,
404 0.456363f, 0.293371f, 0.440810f, 0.294882f, 0.544001f, 0.314523f, 0.543637f, 0.293371f,
405 0.559190f, 0.294882f, 0.563180f, 0.307151f, 0.440810f, 0.294882f, 0.456363f, 0.293371f,
406 0.455999f, 0.314523f, 0.436820f, 0.307151f, 0.559135f, 0.334326f, 0.544001f, 0.314523f,
407 0.563180f, 0.307151f, 0.570458f, 0.318697f, 0.436820f, 0.307151f, 0.455999f, 0.314523f,
408 0.440865f, 0.334326f, 0.429542f, 0.318697f, 0.550878f, 0.277832f, 0.559669f, 0.267717f,
409 0.569243f, 0.278245f, 0.562361f, 0.284338f, 0.430757f, 0.278245f, 0.440331f, 0.267717f,
410 0.449122f, 0.277832f, 0.437639f, 0.284338f, 0.559669f, 0.267717f, 0.592372f, 0.254897f,
411 0.589914f, 0.271772f, 0.569243f, 0.278245f, 0.410086f, 0.271772f, 0.407628f, 0.254897f,
412 0.440331f, 0.267717f, 0.430757f, 0.278245f, 0.592372f, 0.254897f, 0.611331f, 0.264411f,
413 0.602190f, 0.277180f, 0.589914f, 0.271772f, 0.397810f, 0.277180f, 0.388669f, 0.264411f,
414 0.407628f, 0.254897f, 0.410086f, 0.271772f, 0.611331f, 0.264411f, 0.631484f, 0.283889f,
415 0.617110f, 0.287175f, 0.602190f, 0.277180f, 0.382890f, 0.287175f, 0.368516f, 0.283889f,
416 0.388669f, 0.264411f, 0.397810f, 0.277180f, 0.631484f, 0.283889f, 0.635551f, 0.300507f,
417 0.618074f, 0.299197f, 0.617110f, 0.287175f, 0.381926f, 0.299197f, 0.364449f, 0.300507f,
418 0.368516f, 0.283889f, 0.382890f, 0.287175f, 0.635551f, 0.300507f, 0.628251f, 0.311636f,
419 0.615871f, 0.307438f, 0.618074f, 0.299197f, 0.384129f, 0.307438f, 0.371749f, 0.311636f,
420 0.364449f, 0.300507f, 0.381926f, 0.299197f, 0.628251f, 0.311636f, 0.606163f, 0.325516f,
421 0.598424f, 0.313725f, 0.615871f, 0.307438f, 0.401576f, 0.313725f, 0.393837f, 0.325516f,
422 0.371749f, 0.311636f, 0.384129f, 0.307438f, 0.606163f, 0.325516f, 0.592090f, 0.332885f,
423 0.590828f, 0.319797f, 0.598424f, 0.313725f, 0.409172f, 0.319797f, 0.407910f, 0.332885f,
424 0.393837f, 0.325516f, 0.401576f, 0.313725f, 0.592090f, 0.332885f, 0.579057f, 0.335646f,
425 0.582130f, 0.320991f, 0.590828f, 0.319797f, 0.417870f, 0.320991f, 0.420943f, 0.335646f,
426 0.407910f, 0.332885f, 0.409172f, 0.319797f, 0.579057f, 0.335646f, 0.559135f, 0.334326f,
427 0.570458f, 0.318697f, 0.582130f, 0.320991f, 0.429542f, 0.318697f, 0.440865f, 0.334326f,
428 0.420943f, 0.335646f, 0.417870f, 0.320991f, 0.582130f, 0.320991f, 0.570458f, 0.318697f,
429 0.578615f, 0.309394f, 0.583998f, 0.312892f, 0.421385f, 0.309394f, 0.429542f, 0.318697f,
430 0.417870f, 0.320991f, 0.416002f, 0.312892f, 0.590828f, 0.319797f, 0.582130f, 0.320991f,
431 0.583998f, 0.312892f, 0.589656f, 0.312336f, 0.416002f, 0.312892f, 0.417870f, 0.320991f,
432 0.409172f, 0.319797f, 0.410344f, 0.312336f, 0.598424f, 0.313725f, 0.590828f, 0.319797f,
433 0.589656f, 0.312336f, 0.596347f, 0.309249f, 0.410344f, 0.312336f, 0.409172f, 0.319797f,
434 0.401576f, 0.313725f, 0.403653f, 0.309249f, 0.615871f, 0.307438f, 0.598424f, 0.313725f,
435 0.596347f, 0.309249f, 0.606014f, 0.302517f, 0.403653f, 0.309249f, 0.401576f, 0.313725f,
436 0.384129f, 0.307438f, 0.393986f, 0.302517f, 0.618074f, 0.299197f, 0.615871f, 0.307438f,
437 0.606014f, 0.302517f, 0.607735f, 0.297520f, 0.393986f, 0.302517f, 0.384129f, 0.307438f,
438 0.381926f, 0.299197f, 0.392265f, 0.297520f, 0.617110f, 0.287175f, 0.618074f, 0.299197f,
439 0.607735f, 0.297520f, 0.606985f, 0.291216f, 0.392265f, 0.297520f, 0.381926f, 0.299197f,
440 0.382890f, 0.287175f, 0.393015f, 0.291216f, 0.602190f, 0.277180f, 0.617110f, 0.287175f,
441 0.606985f, 0.291216f, 0.598275f, 0.283083f, 0.393015f, 0.291216f, 0.382890f, 0.287175f,
442 0.397810f, 0.277180f, 0.401725f, 0.283083f, 0.589914f, 0.271772f, 0.602190f, 0.277180f,
443 0.598275f, 0.283083f, 0.589866f, 0.280167f, 0.401725f, 0.283083f, 0.397810f, 0.277180f,
444 0.410086f, 0.271772f, 0.410134f, 0.280167f, 0.569243f, 0.278245f, 0.589914f, 0.271772f,
445 0.589866f, 0.280167f, 0.576352f, 0.284624f, 0.410134f, 0.280167f, 0.410086f, 0.271772f,
446 0.430757f, 0.278245f, 0.423648f, 0.284624f, 0.562361f, 0.284338f, 0.569243f, 0.278245f,
447 0.576352f, 0.284624f, 0.572831f, 0.289915f, 0.423648f, 0.284624f, 0.430757f, 0.278245f,
448 0.437639f, 0.284338f, 0.427169f, 0.289915f, 0.570458f, 0.318697f, 0.563180f, 0.307151f,
449 0.573307f, 0.303342f, 0.578615f, 0.309394f, 0.426693f, 0.303342f, 0.436820f, 0.307151f,
450 0.429542f, 0.318697f, 0.421385f, 0.309394f, 0.563180f, 0.307151f, 0.559190f, 0.294882f,
451 0.572447f, 0.295716f, 0.573307f, 0.303342f, 0.427553f, 0.295716f, 0.440810f, 0.294882f,
452 0.436820f, 0.307151f, 0.426693f, 0.303342f, 0.559190f, 0.294882f, 0.562361f, 0.284338f,
453 0.572831f, 0.289915f, 0.572447f, 0.295716f, 0.427169f, 0.289915f, 0.437639f, 0.284338f,
454 0.440810f, 0.294882f, 0.427553f, 0.295716f, 0.500000f, 0.382860f, 0.532016f, 0.387365f,
455 0.529647f, 0.428636f, 0.500000f, 0.428636f, 0.470353f, 0.428636f, 0.467984f, 0.387365f,
456 0.500000f, 0.382860f, 0.500000f, 0.428636f, 0.532016f, 0.387365f, 0.581044f, 0.398468f,
457 0.584616f, 0.428636f, 0.529647f, 0.428636f, 0.415384f, 0.428636f, 0.418956f, 0.398468f,
458 0.467984f, 0.387365f, 0.470353f, 0.428636f, 0.581044f, 0.398468f, 0.602261f, 0.395588f,
459 0.622301f, 0.417889f, 0.584616f, 0.428636f, 0.377699f, 0.417889f, 0.397739f, 0.395588f,
460 0.418956f, 0.398468f, 0.415384f, 0.428636f, 0.602261f, 0.395588f, 0.636775f, 0.370732f,
461 0.666214f, 0.388954f, 0.622301f, 0.417889f, 0.333786f, 0.388954f, 0.363225f, 0.370732f,
462 0.397739f, 0.395588f, 0.377699f, 0.417889f, 0.636775f, 0.370732f, 0.671357f, 0.334694f,
463 0.701481f, 0.344467f, 0.666214f, 0.388954f, 0.298519f, 0.344467f, 0.328643f, 0.334694f,
464 0.363225f, 0.370732f, 0.333786f, 0.388954f, 0.671357f, 0.334694f, 0.684517f, 0.317795f,
465 0.712163f, 0.315527f, 0.701481f, 0.344467f, 0.287837f, 0.315527f, 0.315483f, 0.317795f,
466 0.328643f, 0.334694f, 0.298519f, 0.344467f, 0.684517f, 0.317795f, 0.689501f, 0.268805f,
467 0.704305f, 0.260225f, 0.712163f, 0.315527f, 0.295695f, 0.260225f, 0.310499f, 0.268805f,
468 0.315483f, 0.317795f, 0.287837f, 0.315527f, 0.689501f, 0.268805f, 0.650908f, 0.240294f,
469 0.672947f, 0.224880f, 0.704305f, 0.260225f, 0.327053f, 0.224880f, 0.349092f, 0.240294f,
470 0.310499f, 0.268805f, 0.295695f, 0.260225f, 0.650908f, 0.240294f, 0.626605f, 0.208159f,
471 0.640497f, 0.198841f, 0.672947f, 0.224880f, 0.359503f, 0.198841f, 0.373395f, 0.208159f,
472 0.349092f, 0.240294f, 0.327053f, 0.224880f, 0.603553f, 0.023452f, 0.625128f, 0.029461f,
473 0.635753f, 0.082198f, 0.598617f, 0.056841f, 0.364247f, 0.082198f, 0.374872f, 0.029461f,
474 0.396447f, 0.023452f, 0.401383f, 0.056841f, 0.546781f, 0.009442f, 0.603553f, 0.023452f,
475 0.598617f, 0.056841f, 0.556354f, 0.040906f, 0.401383f, 0.056841f, 0.396447f, 0.023452f,
476 0.453219f, 0.009442f, 0.443646f, 0.040906f, 0.500000f, 0.033223f, 0.546781f, 0.009442f,
477 0.556354f, 0.040906f, 0.527159f, 0.049514f, 0.443646f, 0.040906f, 0.453219f, 0.009442f,
478 0.500000f, 0.033223f, 0.472841f, 0.049514f, 0.520711f, 0.060503f, 0.500000f, 0.054411f,
479 0.500000f, 0.033223f, 0.527159f, 0.049514f, 0.500000f, 0.033223f, 0.500000f, 0.054411f,
480 0.479289f, 0.060503f, 0.472841f, 0.049514f, 0.530457f, 0.065062f, 0.520711f, 0.060503f,
481 0.527159f, 0.049514f, 0.537222f, 0.060794f, 0.472841f, 0.049514f, 0.479289f, 0.060503f,
482 0.469543f, 0.065062f, 0.462778f, 0.060794f, 0.532878f, 0.067822f, 0.530457f, 0.065062f,
483 0.537222f, 0.060794f, 0.558499f, 0.065137f, 0.462778f, 0.060794f, 0.469543f, 0.065062f,
484 0.467122f, 0.067822f, 0.441501f, 0.065137f, 0.544695f, 0.083023f, 0.532878f, 0.067822f,
485 0.558499f, 0.065137f, 0.588127f, 0.085177f, 0.441501f, 0.065137f, 0.467122f, 0.067822f,
486 0.455305f, 0.083023f, 0.411873f, 0.085177f, 0.558499f, 0.065137f, 0.556354f, 0.040906f,
487 0.598617f, 0.056841f, 0.588127f, 0.085177f, 0.401383f, 0.056841f, 0.443646f, 0.040906f,
488 0.441501f, 0.065137f, 0.411873f, 0.085177f, 0.558499f, 0.065137f, 0.537222f, 0.060794f,
489 0.527159f, 0.049514f, 0.556354f, 0.040906f, 0.472841f, 0.049514f, 0.462778f, 0.060794f,
490 0.441501f, 0.065137f, 0.443646f, 0.040906f, 0.607239f, 0.113940f, 0.588127f, 0.085177f,
491 0.598617f, 0.056841f, 0.635753f, 0.082198f, 0.401383f, 0.056841f, 0.411873f, 0.085177f,
492 0.392761f, 0.113940f, 0.364247f, 0.082198f, 0.565647f, 0.115495f, 0.544695f, 0.083023f,
493 0.588127f, 0.085177f, 0.607239f, 0.113940f, 0.411873f, 0.085177f, 0.455305f, 0.083023f,
494 0.434353f, 0.115495f, 0.392761f, 0.113940f, 0.578661f, 0.139176f, 0.612663f, 0.133675f,
495 0.605467f, 0.151503f, 0.583245f, 0.154155f, 0.394533f, 0.151503f, 0.387337f, 0.133675f,
496 0.421339f, 0.139176f, 0.416755f, 0.154155f, 0.565647f, 0.115495f, 0.607239f, 0.113940f,
497 0.612663f, 0.133675f, 0.578661f, 0.139176f, 0.387337f, 0.133675f, 0.392761f, 0.113940f,
498 0.434353f, 0.115495f, 0.421339f, 0.139176f, 0.586916f, 0.172042f, 0.583245f, 0.154155f,
499 0.605467f, 0.151503f, 0.600708f, 0.162985f, 0.394533f, 0.151503f, 0.416755f, 0.154155f,
500 0.413084f, 0.172042f, 0.399292f, 0.162985f, 0.586916f, 0.172042f, 0.600708f, 0.162985f,
501 0.640497f, 0.198841f, 0.626605f, 0.208159f, 0.359503f, 0.198841f, 0.399292f, 0.162985f,
502 0.413084f, 0.172042f, 0.373395f, 0.208159f, 0.922374f, 0.064228f, 0.859647f, 0.117994f,
503 0.823287f, 0.101559f, 0.861342f, 0.027230f, 0.176713f, 0.101559f, 0.140353f, 0.117994f,
504 0.077626f, 0.064228f, 0.138658f, 0.027230f, 0.861342f, 0.027230f, 0.823287f, 0.101559f,
505 0.765863f, 0.087001f, 0.774604f, 0.010837f, 0.234137f, 0.087001f, 0.176713f, 0.101559f,
506 0.138658f, 0.027230f, 0.225396f, 0.010837f, 0.774604f, 0.010837f, 0.765863f, 0.087001f,
507 0.661952f, 0.087561f, 0.647010f, 0.028716f, 0.338048f, 0.087561f, 0.234137f, 0.087001f,
508 0.225396f, 0.010837f, 0.352990f, 0.028716f, 0.647010f, 0.028716f, 0.661952f, 0.087561f,
509 0.635753f, 0.082198f, 0.625128f, 0.029461f, 0.364247f, 0.082198f, 0.338048f, 0.087561f,
510 0.352990f, 0.028716f, 0.374872f, 0.029461f, 0.607239f, 0.113940f, 0.635753f, 0.082198f,
511 0.661952f, 0.087561f, 0.612663f, 0.133675f, 0.338048f, 0.087561f, 0.364247f, 0.082198f,
512 0.392761f, 0.113940f, 0.387337f, 0.133675f, 0.704305f, 0.260225f, 0.672947f, 0.224880f,
513 0.743592f, 0.198572f, 0.766410f, 0.233065f, 0.256408f, 0.198572f, 0.327053f, 0.224880f,
514 0.295695f, 0.260225f, 0.233590f, 0.233065f, 0.987633f, 0.154243f, 0.889478f, 0.177602f,
515 0.859647f, 0.117994f, 0.922374f, 0.064228f, 0.140353f, 0.117994f, 0.110522f, 0.177602f,
516 0.012367f, 0.154243f, 0.077626f, 0.064228f, 0.899807f, 0.420886f, 0.844317f, 0.347370f,
517 0.881169f, 0.309153f, 0.958963f, 0.357385f, 0.118831f, 0.309153f, 0.155683f, 0.347370f,
518 0.100193f, 0.420886f, 0.041037f, 0.357385f, 0.958963f, 0.357385f, 0.881169f, 0.309153f,
519 0.903302f, 0.261367f, 0.999860f, 0.253531f, 0.096698f, 0.261367f, 0.118831f, 0.309153f,
520 0.041037f, 0.357385f, 0.000140f, 0.253531f, 0.999860f, 0.253531f, 0.903302f, 0.261367f,
521 0.889478f, 0.177602f, 0.987633f, 0.154243f, 0.110522f, 0.177602f, 0.096698f, 0.261367f,
522 0.000140f, 0.253531f, 0.012367f, 0.154243f, 0.724763f, 0.340212f, 0.712163f, 0.315527f,
523 0.744725f, 0.304629f, 0.766113f, 0.319494f, 0.255275f, 0.304629f, 0.287837f, 0.315527f,
524 0.275237f, 0.340212f, 0.233887f, 0.319494f, 0.766113f, 0.319494f, 0.744725f, 0.304629f,
525 0.793427f, 0.280495f, 0.826663f, 0.297810f, 0.206573f, 0.280495f, 0.255275f, 0.304629f,
526 0.233887f, 0.319494f, 0.173337f, 0.297810f, 0.826663f, 0.297810f, 0.793427f, 0.280495f,
527 0.823620f, 0.254612f, 0.855331f, 0.267956f, 0.176380f, 0.254612f, 0.206573f, 0.280495f,
528 0.173337f, 0.297810f, 0.144669f, 0.267956f, 0.855331f, 0.267956f, 0.823620f, 0.254612f,
529 0.835860f, 0.225225f, 0.868309f, 0.233525f, 0.164140f, 0.225225f, 0.176380f, 0.254612f,
530 0.144669f, 0.267956f, 0.131691f, 0.233525f, 0.813499f, 0.190705f, 0.851288f, 0.181145f,
531 0.868309f, 0.233525f, 0.835860f, 0.225225f, 0.131691f, 0.233525f, 0.148712f, 0.181145f,
532 0.186501f, 0.190705f, 0.164140f, 0.225225f, 0.889478f, 0.177602f, 0.903302f, 0.261367f,
533 0.868309f, 0.233525f, 0.851288f, 0.181145f, 0.131691f, 0.233525f, 0.096698f, 0.261367f,
534 0.110522f, 0.177602f, 0.148712f, 0.181145f, 0.903302f, 0.261367f, 0.881169f, 0.309153f,
535 0.855331f, 0.267956f, 0.868309f, 0.233525f, 0.144669f, 0.267956f, 0.118831f, 0.309153f,
536 0.096698f, 0.261367f, 0.131691f, 0.233525f, 0.881169f, 0.309153f, 0.844317f, 0.347370f,
537 0.826663f, 0.297810f, 0.855331f, 0.267956f, 0.173337f, 0.297810f, 0.155683f, 0.347370f,
538 0.118831f, 0.309153f, 0.144669f, 0.267956f, 0.844317f, 0.347370f, 0.772263f, 0.374010f,
539 0.766113f, 0.319494f, 0.826663f, 0.297810f, 0.233887f, 0.319494f, 0.227737f, 0.374010f,
540 0.155683f, 0.347370f, 0.173337f, 0.297810f, 0.744519f, 0.390057f, 0.724763f, 0.340212f,
541 0.766113f, 0.319494f, 0.772263f, 0.374010f, 0.233887f, 0.319494f, 0.275237f, 0.340212f,
542 0.255481f, 0.390057f, 0.227737f, 0.374010f, 0.824765f, 0.470987f, 0.772263f, 0.374010f,
543 0.844317f, 0.347370f, 0.899807f, 0.420886f, 0.155683f, 0.347370f, 0.227737f, 0.374010f,
544 0.175235f, 0.470987f, 0.100193f, 0.420886f, 0.792141f, 0.464714f, 0.742181f, 0.461543f,
545 0.726855f, 0.432574f, 0.744519f, 0.390057f, 0.273145f, 0.432574f, 0.257819f, 0.461543f,
546 0.207859f, 0.464714f, 0.255481f, 0.390057f, 0.792141f, 0.464714f, 0.744519f, 0.390057f,
547 0.772263f, 0.374010f, 0.824765f, 0.470987f, 0.227737f, 0.374010f, 0.255481f, 0.390057f,
548 0.207859f, 0.464714f, 0.175235f, 0.470987f, 0.795638f, 0.489991f, 0.792141f, 0.464714f,
549 0.824765f, 0.470987f, 0.175235f, 0.470987f, 0.207859f, 0.464714f, 0.204362f, 0.489991f,
550 0.712163f, 0.315527f, 0.704305f, 0.260225f, 0.766410f, 0.233065f, 0.744725f, 0.304629f,
551 0.233590f, 0.233065f, 0.295695f, 0.260225f, 0.287837f, 0.315527f, 0.255275f, 0.304629f,
552 0.766410f, 0.233065f, 0.786137f, 0.227788f, 0.793427f, 0.280495f, 0.744725f, 0.304629f,
553 0.206573f, 0.280495f, 0.213863f, 0.227788f, 0.233590f, 0.233065f, 0.255275f, 0.304629f,
554 0.786137f, 0.227788f, 0.802950f, 0.203415f, 0.823620f, 0.254612f, 0.793427f, 0.280495f,
555 0.176380f, 0.254612f, 0.197050f, 0.203415f, 0.213863f, 0.227788f, 0.206573f, 0.280495f,
556 0.813499f, 0.190705f, 0.835860f, 0.225225f, 0.823620f, 0.254612f, 0.802950f, 0.203415f,
557 0.176380f, 0.254612f, 0.164140f, 0.225225f, 0.186501f, 0.190705f, 0.197050f, 0.203415f,
558 0.661952f, 0.087561f, 0.765863f, 0.087001f, 0.769334f, 0.128771f, 0.691484f, 0.146686f,
559 0.230666f, 0.128771f, 0.234137f, 0.087001f, 0.338048f, 0.087561f, 0.308516f, 0.146686f,
560 0.743592f, 0.198572f, 0.691484f, 0.146686f, 0.769334f, 0.128771f, 0.780113f, 0.169386f,
561 0.230666f, 0.128771f, 0.308516f, 0.146686f, 0.256408f, 0.198572f, 0.219887f, 0.169386f,
562 0.672947f, 0.224880f, 0.640497f, 0.198841f, 0.691484f, 0.146686f, 0.743592f, 0.198572f,
563 0.308516f, 0.146686f, 0.359503f, 0.198841f, 0.327053f, 0.224880f, 0.256408f, 0.198572f,
564 0.640497f, 0.198841f, 0.605467f, 0.151503f, 0.612663f, 0.133675f, 0.691484f, 0.146686f,
565 0.387337f, 0.133675f, 0.394533f, 0.151503f, 0.359503f, 0.198841f, 0.308516f, 0.146686f,
566 0.612663f, 0.133675f, 0.661952f, 0.087561f, 0.691484f, 0.146686f, 0.308516f, 0.146686f,
567 0.338048f, 0.087561f, 0.387337f, 0.133675f, 0.640497f, 0.198841f, 0.600708f, 0.162985f,
568 0.605467f, 0.151503f, 0.394533f, 0.151503f, 0.399292f, 0.162985f, 0.359503f, 0.198841f,
569 0.813499f, 0.190705f, 0.803789f, 0.171181f, 0.830917f, 0.139518f, 0.851288f, 0.181145f,
570 0.169083f, 0.139518f, 0.196211f, 0.171181f, 0.186501f, 0.190705f, 0.148712f, 0.181145f,
571 0.889478f, 0.177602f, 0.851288f, 0.181145f, 0.830917f, 0.139518f, 0.859647f, 0.117994f,
572 0.169083f, 0.139518f, 0.148712f, 0.181145f, 0.110522f, 0.177602f, 0.140353f, 0.117994f,
573 0.780113f, 0.169386f, 0.769334f, 0.128771f, 0.830917f, 0.139518f, 0.803789f, 0.171181f,
574 0.169083f, 0.139518f, 0.230666f, 0.128771f, 0.219887f, 0.169386f, 0.196211f, 0.171181f,
575 0.765863f, 0.087001f, 0.823287f, 0.101559f, 0.830917f, 0.139518f, 0.769334f, 0.128771f,
576 0.169083f, 0.139518f, 0.176713f, 0.101559f, 0.234137f, 0.087001f, 0.230666f, 0.128771f,
577 0.859647f, 0.117994f, 0.830917f, 0.139518f, 0.823287f, 0.101559f, 0.176713f, 0.101559f,
578 0.169083f, 0.139518f, 0.140353f, 0.117994f, 0.574628f, 0.959188f, 0.464516f, 0.959188f,
579 0.477326f, 0.891852f, 0.545439f, 0.884582f, 0.272900f, 0.891852f, 0.285710f, 0.959188f,
580 0.175598f, 0.959188f, 0.204787f, 0.884582f, 0.574628f, 0.959188f, 0.545439f, 0.884582f,
581 0.605134f, 0.846978f, 0.715894f, 0.897069f, 0.145092f, 0.846978f, 0.204787f, 0.884582f,
582 0.175598f, 0.959188f, 0.034332f, 0.897069f, 0.715894f, 0.897069f, 0.605134f, 0.846978f,
583 0.605360f, 0.784410f, 0.683874f, 0.757011f, 0.144866f, 0.784410f, 0.145092f, 0.846978f,
584 0.034332f, 0.897069f, 0.066352f, 0.757011f, 0.683874f, 0.757011f, 0.605360f, 0.784410f,
585 0.574835f, 0.744212f, 0.617867f, 0.719156f, 0.175391f, 0.744212f, 0.144866f, 0.784410f,
586 0.066352f, 0.757011f, 0.132359f, 0.719156f, 0.617867f, 0.719156f, 0.574835f, 0.744212f,
587 0.534996f, 0.712528f, 0.568728f, 0.682132f, 0.215230f, 0.712528f, 0.175391f, 0.744212f,
588 0.132359f, 0.719156f, 0.181498f, 0.682132f, 0.568728f, 0.682132f, 0.534996f, 0.712528f,
589 0.483006f, 0.686791f, 0.508539f, 0.641024f, 0.267220f, 0.686791f, 0.215230f, 0.712528f,
590 0.181498f, 0.682132f, 0.241687f, 0.641024f, 0.534996f, 0.712528f, 0.513415f, 0.736977f,
591 0.478880f, 0.719593f, 0.483006f, 0.686791f, 0.271346f, 0.719593f, 0.236811f, 0.736977f,
592 0.215230f, 0.712528f, 0.267220f, 0.686791f, 0.574835f, 0.744212f, 0.541117f, 0.760754f,
593 0.513415f, 0.736977f, 0.534996f, 0.712528f, 0.236811f, 0.736977f, 0.209109f, 0.760754f,
594 0.175391f, 0.744212f, 0.215230f, 0.712528f, 0.605360f, 0.784410f, 0.557599f, 0.789442f,
595 0.541117f, 0.760754f, 0.574835f, 0.744212f, 0.209109f, 0.760754f, 0.192627f, 0.789442f,
596 0.144866f, 0.784410f, 0.175391f, 0.744212f, 0.605134f, 0.846978f, 0.553841f, 0.821849f,
597 0.557599f, 0.789442f, 0.605360f, 0.784410f, 0.192627f, 0.789442f, 0.196385f, 0.821849f,
598 0.145092f, 0.846978f, 0.144866f, 0.784410f, 0.545439f, 0.884582f, 0.524671f, 0.842380f,
599 0.553841f, 0.821849f, 0.605134f, 0.846978f, 0.196385f, 0.821849f, 0.225555f, 0.842380f,
600 0.204787f, 0.884582f, 0.145092f, 0.846978f, 0.545439f, 0.884582f, 0.477326f, 0.891852f,
601 0.485193f, 0.845321f, 0.524671f, 0.842380f, 0.265033f, 0.845321f, 0.272900f, 0.891852f,
602 0.204787f, 0.884582f, 0.225555f, 0.842380f, 0.743592f, 0.198572f, 0.780113f, 0.169386f,
603 0.786150f, 0.181127f, 0.770208f, 0.191225f, 0.213850f, 0.181127f, 0.219887f, 0.169386f,
604 0.256408f, 0.198572f, 0.229792f, 0.191225f, 0.408153f, 0.587507f, 0.508539f, 0.641024f,
605 0.483006f, 0.686791f, 0.409610f, 0.674022f, 0.267220f, 0.686791f, 0.241687f, 0.641024f,
606 0.342073f, 0.587507f, 0.340616f, 0.674022f, 0.766410f, 0.233065f, 0.743592f, 0.198572f,
607 0.770208f, 0.191225f, 0.786137f, 0.227788f, 0.229792f, 0.191225f, 0.256408f, 0.198572f,
608 0.233590f, 0.233065f, 0.213863f, 0.227788f, 0.400301f, 0.910556f, 0.414155f, 0.878318f,
609 0.477326f, 0.891852f, 0.464516f, 0.959188f, 0.272900f, 0.891852f, 0.336071f, 0.878318f,
610 0.349925f, 0.910556f, 0.285710f, 0.959188f, 0.483006f, 0.686791f, 0.478880f, 0.719593f,
611 0.443630f, 0.713731f, 0.409610f, 0.674022f, 0.306596f, 0.713731f, 0.271346f, 0.719593f,
612 0.267220f, 0.686791f, 0.340616f, 0.674022f, 0.429725f, 0.728622f, 0.392812f, 0.710774f,
613 0.409610f, 0.674022f, 0.443630f, 0.713731f, 0.340616f, 0.674022f, 0.357414f, 0.710774f,
614 0.320501f, 0.728622f, 0.306596f, 0.713731f, 0.422979f, 0.754609f, 0.392812f, 0.710774f,
615 0.429725f, 0.728622f, 0.432640f, 0.746527f, 0.320501f, 0.728622f, 0.357414f, 0.710774f,
616 0.327247f, 0.754609f, 0.317586f, 0.746527f, 0.427719f, 0.796173f, 0.391578f, 0.815187f,
617 0.392812f, 0.710774f, 0.422979f, 0.754609f, 0.357414f, 0.710774f, 0.358648f, 0.815187f,
618 0.322507f, 0.796173f, 0.327247f, 0.754609f, 0.414155f, 0.878318f, 0.391578f, 0.815187f,
619 0.427719f, 0.796173f, 0.448277f, 0.830976f, 0.322507f, 0.796173f, 0.358648f, 0.815187f,
620 0.336071f, 0.878318f, 0.301949f, 0.830976f, 0.477326f, 0.891852f, 0.414155f, 0.878318f,
621 0.448277f, 0.830976f, 0.485193f, 0.845321f, 0.301949f, 0.830976f, 0.336071f, 0.878318f,
622 0.272900f, 0.891852f, 0.265033f, 0.845321f, 0.786137f, 0.227788f, 0.797710f, 0.195652f,
623 0.802580f, 0.199758f, 0.802950f, 0.203415f, 0.197420f, 0.199758f, 0.202290f, 0.195652f,
624 0.213863f, 0.227788f, 0.197050f, 0.203415f, 0.786137f, 0.227788f, 0.770208f, 0.191225f,
625 0.789609f, 0.184671f, 0.797710f, 0.195652f, 0.210391f, 0.184671f, 0.229792f, 0.191225f,
626 0.213863f, 0.227788f, 0.202290f, 0.195652f, 0.770208f, 0.191225f, 0.786150f, 0.181127f,
627 0.789609f, 0.184671f, 0.210391f, 0.184671f, 0.213850f, 0.181127f, 0.229792f, 0.191225f,
628 0.485193f, 0.845321f, 0.448277f, 0.830976f, 0.466042f, 0.804091f, 0.490498f, 0.816075f,
629 0.284184f, 0.804091f, 0.301949f, 0.830976f, 0.265033f, 0.845321f, 0.259728f, 0.816075f,
630 0.448277f, 0.830976f, 0.427719f, 0.796173f, 0.448042f, 0.783921f, 0.466042f, 0.804091f,
631 0.302184f, 0.783921f, 0.322507f, 0.796173f, 0.301949f, 0.830976f, 0.284184f, 0.804091f,
632 0.427719f, 0.796173f, 0.422979f, 0.754609f, 0.438745f, 0.764960f, 0.448042f, 0.783921f,
633 0.311481f, 0.764960f, 0.327247f, 0.754609f, 0.322507f, 0.796173f, 0.302184f, 0.783921f,
634 0.422979f, 0.754609f, 0.432640f, 0.746527f, 0.445216f, 0.756351f, 0.438745f, 0.764960f,
635 0.305010f, 0.756351f, 0.317586f, 0.746527f, 0.327247f, 0.754609f, 0.311481f, 0.764960f,
636 0.432640f, 0.746527f, 0.429725f, 0.728622f, 0.449819f, 0.743458f, 0.445216f, 0.756351f,
637 0.300407f, 0.743458f, 0.320501f, 0.728622f, 0.317586f, 0.746527f, 0.305010f, 0.756351f,
638 0.429725f, 0.728622f, 0.443630f, 0.713731f, 0.456307f, 0.732687f, 0.449819f, 0.743458f,
639 0.293919f, 0.732687f, 0.306596f, 0.713731f, 0.320501f, 0.728622f, 0.300407f, 0.743458f,
640 0.443630f, 0.713731f, 0.478880f, 0.719593f, 0.475471f, 0.740871f, 0.456307f, 0.732687f,
641 0.274755f, 0.740871f, 0.271346f, 0.719593f, 0.306596f, 0.713731f, 0.293919f, 0.732687f,
642 0.524671f, 0.842380f, 0.485193f, 0.845321f, 0.490498f, 0.816075f, 0.514211f, 0.817769f,
643 0.259728f, 0.816075f, 0.265033f, 0.845321f, 0.225555f, 0.842380f, 0.236015f, 0.817769f,
644 0.553841f, 0.821849f, 0.524671f, 0.842380f, 0.514211f, 0.817769f, 0.527961f, 0.808598f,
645 0.236015f, 0.817769f, 0.225555f, 0.842380f, 0.196385f, 0.821849f, 0.222265f, 0.808598f,
646 0.557599f, 0.789442f, 0.553841f, 0.821849f, 0.527961f, 0.808598f, 0.530079f, 0.790754f,
647 0.222265f, 0.808598f, 0.196385f, 0.821849f, 0.192627f, 0.789442f, 0.220147f, 0.790754f,
648 0.541117f, 0.760754f, 0.557599f, 0.789442f, 0.530079f, 0.790754f, 0.518620f, 0.772385f,
649 0.220147f, 0.790754f, 0.192627f, 0.789442f, 0.209109f, 0.760754f, 0.231606f, 0.772385f,
650 0.513415f, 0.736977f, 0.541117f, 0.760754f, 0.518620f, 0.772385f, 0.498668f, 0.755033f,
651 0.231606f, 0.772385f, 0.209109f, 0.760754f, 0.236811f, 0.736977f, 0.251558f, 0.755033f,
652 0.478880f, 0.719593f, 0.513415f, 0.736977f, 0.498668f, 0.755033f, 0.475471f, 0.740871f,
653 0.251558f, 0.755033f, 0.236811f, 0.736977f, 0.271346f, 0.719593f, 0.274755f, 0.740871f,
654 0.445216f, 0.756351f, 0.449819f, 0.743458f, 0.468029f, 0.756171f, 0.459660f, 0.770459f,
655 0.282197f, 0.756171f, 0.300407f, 0.743458f, 0.305010f, 0.756351f, 0.290566f, 0.770459f,
656 0.459660f, 0.770459f, 0.468029f, 0.756171f, 0.487167f, 0.769899f, 0.477354f, 0.785393f,
657 0.263059f, 0.769899f, 0.282197f, 0.756171f, 0.290566f, 0.770459f, 0.272872f, 0.785393f,
658 0.477354f, 0.785393f, 0.487167f, 0.769899f, 0.504617f, 0.782999f, 0.496545f, 0.797122f,
659 0.245609f, 0.782999f, 0.263059f, 0.769899f, 0.272872f, 0.785393f, 0.253681f, 0.797122f,
660 0.496545f, 0.797122f, 0.504617f, 0.782999f, 0.516137f, 0.792591f, 0.513713f, 0.804019f,
661 0.234089f, 0.792591f, 0.245609f, 0.782999f, 0.253681f, 0.797122f, 0.236513f, 0.804019f,
662 0.514211f, 0.817769f, 0.490498f, 0.816075f, 0.496545f, 0.797122f, 0.513713f, 0.804019f,
663 0.253681f, 0.797122f, 0.259728f, 0.816075f, 0.236015f, 0.817769f, 0.236513f, 0.804019f,
664 0.466042f, 0.804091f, 0.477354f, 0.785393f, 0.496545f, 0.797122f, 0.490498f, 0.816075f,
665 0.253681f, 0.797122f, 0.272872f, 0.785393f, 0.284184f, 0.804091f, 0.259728f, 0.816075f,
666 0.466042f, 0.804091f, 0.448042f, 0.783921f, 0.459660f, 0.770459f, 0.477354f, 0.785393f,
667 0.290566f, 0.770459f, 0.302184f, 0.783921f, 0.284184f, 0.804091f, 0.272872f, 0.785393f,
668 0.445216f, 0.756351f, 0.459660f, 0.770459f, 0.448042f, 0.783921f, 0.438745f, 0.764960f,
669 0.302184f, 0.783921f, 0.290566f, 0.770459f, 0.305010f, 0.756351f, 0.311481f, 0.764960f,
670 0.456307f, 0.732687f, 0.475471f, 0.740871f, 0.468029f, 0.756171f, 0.449819f, 0.743458f,
671 0.282197f, 0.756171f, 0.274755f, 0.740871f, 0.293919f, 0.732687f, 0.300407f, 0.743458f,
672 0.498668f, 0.755033f, 0.487167f, 0.769899f, 0.468029f, 0.756171f, 0.475471f, 0.740871f,
673 0.282197f, 0.756171f, 0.263059f, 0.769899f, 0.251558f, 0.755033f, 0.274755f, 0.740871f,
674 0.518620f, 0.772385f, 0.504617f, 0.782999f, 0.487167f, 0.769899f, 0.498668f, 0.755033f,
675 0.263059f, 0.769899f, 0.245609f, 0.782999f, 0.231606f, 0.772385f, 0.251558f, 0.755033f,
676 0.530079f, 0.790754f, 0.516137f, 0.792591f, 0.504617f, 0.782999f, 0.518620f, 0.772385f,
677 0.245609f, 0.782999f, 0.234089f, 0.792591f, 0.220147f, 0.790754f, 0.231606f, 0.772385f,
678 0.527961f, 0.808598f, 0.513713f, 0.804019f, 0.516137f, 0.792591f, 0.530079f, 0.790754f,
679 0.234089f, 0.792591f, 0.236513f, 0.804019f, 0.222265f, 0.808598f, 0.220147f, 0.790754f,
680 0.514211f, 0.817769f, 0.513713f, 0.804019f, 0.527961f, 0.808598f, 0.222265f, 0.808598f,
681 0.236513f, 0.804019f, 0.236015f, 0.817769f, 0.568728f, 0.682132f, 0.508539f, 0.641024f,
682 0.574269f, 0.607668f, 0.613510f, 0.655816f, 0.175957f, 0.607668f, 0.241687f, 0.641024f,
683 0.181498f, 0.682132f, 0.136716f, 0.655816f, 0.617867f, 0.719156f, 0.568728f, 0.682132f,
684 0.613510f, 0.655816f, 0.644031f, 0.693270f, 0.136716f, 0.655816f, 0.181498f, 0.682132f,
685 0.132359f, 0.719156f, 0.106195f, 0.693270f, 0.683874f, 0.757011f, 0.617867f, 0.719156f,
686 0.644031f, 0.693270f, 0.668163f, 0.712097f, 0.106195f, 0.693270f, 0.132359f, 0.719156f,
687 0.066352f, 0.757011f, 0.082063f, 0.712097f, 0.727131f, 0.698475f, 0.683874f, 0.757011f,
688 0.668163f, 0.712097f, 0.676584f, 0.686010f, 0.082063f, 0.712097f, 0.066352f, 0.757011f,
689 0.023095f, 0.698475f, 0.073642f, 0.686010f, 0.729804f, 0.624370f, 0.727131f, 0.698475f,
690 0.676584f, 0.686010f, 0.667013f, 0.640198f, 0.073642f, 0.686010f, 0.023095f, 0.698475f,
691 0.020422f, 0.624370f, 0.083213f, 0.640198f, 0.721292f, 0.572934f, 0.729804f, 0.624370f,
692 0.667013f, 0.640198f, 0.648152f, 0.594596f, 0.083213f, 0.640198f, 0.020422f, 0.624370f,
693 0.028934f, 0.572934f, 0.102074f, 0.594596f, 0.667013f, 0.640198f, 0.613510f, 0.655816f,
694 0.574269f, 0.607668f, 0.648152f, 0.594596f, 0.175957f, 0.607668f, 0.136716f, 0.655816f,
695 0.083213f, 0.640198f, 0.102074f, 0.594596f, 0.667013f, 0.640198f, 0.676584f, 0.686010f,
696 0.644031f, 0.693270f, 0.613510f, 0.655816f, 0.106195f, 0.693270f, 0.073642f, 0.686010f,
697 0.083213f, 0.640198f, 0.136716f, 0.655816f, 0.676584f, 0.686010f, 0.668163f, 0.712097f,
698 0.644031f, 0.693270f, 0.106195f, 0.693270f, 0.082063f, 0.712097f, 0.073642f, 0.686010f,
699 0.630034f, 0.557583f, 0.717709f, 0.538143f, 0.721292f, 0.572934f, 0.648152f, 0.594596f,
700 0.028934f, 0.572934f, 0.032517f, 0.538143f, 0.120192f, 0.557583f, 0.102074f, 0.594596f,
701 0.630034f, 0.557583f, 0.648152f, 0.594596f, 0.574269f, 0.607668f, 0.526877f, 0.539235f,
702 0.175957f, 0.607668f, 0.102074f, 0.594596f, 0.120192f, 0.557583f, 0.223349f, 0.539235f,
703 0.408153f, 0.587507f, 0.526877f, 0.539235f, 0.574269f, 0.607668f, 0.508539f, 0.641024f,
704 0.175957f, 0.607668f, 0.223349f, 0.539235f, 0.342073f, 0.587507f, 0.241687f, 0.641024f,
705};
706
707#define VERT_MARK 1
708
709#define EDGE_ORIG 1
710#define EDGE_MARK 2
711
712#define FACE_MARK 1
713#define FACE_NEW 2
714
716{
717 BMOpSlot *slot_verts_out = BMO_slot_get(op->slots_out, "verts.out");
718
719 const float dia = BMO_slot_float_get(op->slots_in, "size");
720 const uint xtot = max_ii(1, BMO_slot_int_get(op->slots_in, "x_segments"));
721 const uint ytot = max_ii(1, BMO_slot_int_get(op->slots_in, "y_segments"));
722 const float xtot_inv2 = 2.0f / (xtot);
723 const float ytot_inv2 = 2.0f / (ytot);
724
725 const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_PROP_FLOAT2);
726 const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
727
728 BMVert **varr;
729 BMVert *vquad[4];
730
731 float mat[4][4];
732 float vec[3], tvec[3];
733
734 uint x, y, i;
735
736 BMO_slot_mat4_get(op->slots_in, "matrix", mat);
737
738 BMO_slot_buffer_alloc(op, op->slots_out, "verts.out", (xtot + 1) * (ytot + 1));
739 varr = (BMVert **)slot_verts_out->data.buf;
740
741 i = 0;
742 vec[2] = 0.0f;
743 for (y = 0; y <= ytot; y++) {
744 vec[1] = ((y * ytot_inv2) - 1.0f) * dia;
745 for (x = 0; x <= xtot; x++) {
746 vec[0] = ((x * xtot_inv2) - 1.0f) * dia;
747 mul_v3_m4v3(tvec, mat, vec);
748 varr[i] = BM_vert_create(bm, tvec, nullptr, BM_CREATE_NOP);
750 i++;
751 }
752 }
753
754#define XY(_x, _y) ((_x) + ((_y) * (xtot + 1)))
755
756 for (y = 1; y <= ytot; y++) {
757 for (x = 1; x <= xtot; x++) {
758 BMFace *f;
759
760 vquad[0] = varr[XY(x - 1, y - 1)];
761 vquad[1] = varr[XY(x, y - 1)];
762 vquad[2] = varr[XY(x, y)];
763 vquad[3] = varr[XY(x - 1, y)];
764
765 f = BM_face_create_verts(bm, vquad, 4, nullptr, BM_CREATE_NOP, true);
766 if (calc_uvs) {
768 }
769 }
770 }
771
772#undef XY
773
774 if (calc_uvs) {
775 BM_mesh_calc_uvs_grid(bm, xtot, ytot, FACE_MARK, cd_loop_uv_offset);
776 }
777}
778
780 const uint x_segments,
781 const uint y_segments,
782 const short oflag,
783 const int cd_loop_uv_offset)
784{
785 BMFace *f;
786 BMLoop *l;
787 BMIter iter, liter;
788
789 const float dx = 1.0f / float(x_segments);
790 const float dy = 1.0f / float(y_segments);
791 const float dx_wrap = 1.0 - (dx / 2.0f);
792 float x = 0.0f;
793 float y = dy;
794
795 int loop_index;
796
797 BLI_assert(cd_loop_uv_offset != -1);
798
799 BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
800 if (!BMO_face_flag_test(bm, f, oflag)) {
801 continue;
802 }
803
804 BM_ITER_ELEM_INDEX (l, &liter, f, BM_LOOPS_OF_FACE, loop_index) {
805 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
806
807 switch (loop_index) {
808 case 0:
809 y -= dy;
810 break;
811 case 1:
812 x += dx;
813 break;
814 case 2:
815 y += dy;
816 break;
817 case 3:
818 x -= dx;
819 break;
820 default:
821 break;
822 }
823
824 luv[0] = x;
825 luv[1] = y;
826 }
827
828 x += dx;
829 if (x >= dx_wrap) {
830 x = 0.0f;
831 y += dy;
832 }
833 }
834}
835
837{
838 const float rad = BMO_slot_float_get(op->slots_in, "radius");
839 const int seg = BMO_slot_int_get(op->slots_in, "u_segments");
840 const int tot = BMO_slot_int_get(op->slots_in, "v_segments");
841
842 const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_PROP_FLOAT2);
843 const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
844
845 BMOperator bmop, prevop;
846 BMVert *eve, *preveve;
847 BMEdge *e;
848 BMIter iter;
849 const float axis[3] = {0, 0, 1};
850 float vec[3], mat[4][4], cmat[3][3];
851 int a;
852
853 BMO_slot_mat4_get(op->slots_in, "matrix", mat);
854
855 const float phid = float(M_PI) / tot;
856 // const float phi = 0.25f * float(M_PI); /* UNUSED. */
857
858 /* one segment first */
859 for (a = 0; a <= tot; a++) {
860 /* Going in this direction, then edge extruding, makes normals face outward */
861 float sin_phi, cos_phi;
862 sin_cos_from_fraction(a, 2 * tot, &sin_phi, &cos_phi);
863
864 vec[0] = 0.0f;
865 vec[1] = rad * sin_phi;
866 vec[2] = rad * cos_phi;
867 eve = BM_vert_create(bm, vec, nullptr, BM_CREATE_NOP);
869
870 if (a != 0) {
871 e = BM_edge_create(bm, preveve, eve, nullptr, BM_CREATE_NOP);
873 }
874
875 preveve = eve;
876 }
877
878 /* extrude and rotate; negative phi to make normals face outward */
879 axis_angle_to_mat3(cmat, axis, -(M_PI * 2) / seg);
880
881 for (a = 0; a < seg; a++) {
882 if (a) {
883 BMO_op_initf(bm, &bmop, op->flag, "extrude_edge_only edges=%S", &prevop, "geom.out");
884 BMO_op_exec(bm, &bmop);
885 BMO_op_finish(bm, &prevop);
886 }
887 else {
888 BMO_op_initf(bm, &bmop, op->flag, "extrude_edge_only edges=%fe", EDGE_ORIG);
889 BMO_op_exec(bm, &bmop);
890 }
891
893 BMO_op_callf(bm, op->flag, "rotate cent=%v matrix=%m3 verts=%S", vec, cmat, &bmop, "geom.out");
894
895 prevop = bmop;
896 }
897
898 if (a) {
899 BMO_op_finish(bm, &bmop);
900 }
901
902 {
903 float len, len2, vec2[3];
904
905 len = 2 * rad * sinf(phid / 2.0f);
906
907 /* Length of one segment in shortest parallel. */
908 vec[0] = rad * sinf(phid);
909 vec[1] = 0.0f;
910 vec[2] = rad * cosf(phid);
911
912 mul_v3_m3v3(vec2, cmat, vec);
913 len2 = len_v3v3(vec, vec2);
914
915 /* use shortest segment length divided by 3 as merge threshold */
917 bm, op->flag, "remove_doubles verts=%fv dist=%f", VERT_MARK, min_ff(len, len2) / 3.0f);
918 }
919
920 if (calc_uvs) {
921 BMFace *f;
922 BMLoop *l;
923 BMIter fiter, liter;
924
925 /* We cannot tag faces for UVs computing above,
926 * so we have to do it now, based on all its vertices being tagged. */
927 BM_ITER_MESH (f, &fiter, bm, BM_FACES_OF_MESH) {
928 bool valid = true;
929
930 BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
931 if (!BMO_vert_flag_test(bm, l->v, VERT_MARK)) {
932 valid = false;
933 break;
934 }
935 }
936
937 if (valid) {
939 }
940 }
941
942 BM_mesh_calc_uvs_sphere(bm, FACE_MARK, cd_loop_uv_offset);
943 }
944
945 /* Now apply the inverse matrix. */
946 BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
947 if (BMO_vert_flag_test(bm, eve, VERT_MARK)) {
948 mul_m4_v3(mat, eve->co);
949 }
950 }
951
953}
954
956{
957 const float rad = BMO_slot_float_get(op->slots_in, "radius");
958 const float rad_div = rad / 200.0f;
959 const int subdiv = BMO_slot_int_get(op->slots_in, "subdivisions");
960
961 const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_PROP_FLOAT2);
962 const bool calc_uvs = (cd_loop_uv_offset != -1) && BMO_slot_bool_get(op->slots_in, "calc_uvs");
963
964 BMVert *eva[12];
965 BMVert *v;
966 BMIter liter;
967 BMIter viter;
968 BMLoop *l;
969 float vec[3], mat[4][4] /* , phi, phid */;
970 int a;
971
972 BMO_slot_mat4_get(op->slots_in, "matrix", mat);
973
974 // phid = 2.0f * float(M_PI) / subdiv; /* UNUSED. */
975 // phi = 0.25f * float(M_PI); /* UNUSED. */
976
977 for (a = 0; a < 12; a++) {
978 vec[0] = rad_div * icovert[a][0];
979 vec[1] = rad_div * icovert[a][1];
980 vec[2] = rad_div * icovert[a][2];
981 eva[a] = BM_vert_create(bm, vec, nullptr, BM_CREATE_NOP);
982
984 }
985
986 int uvi = 0;
987 for (a = 0; a < 20; a++) {
988 BMFace *f;
989 BMVert *v1, *v2, *v3;
990
991 v1 = eva[icoface[a][0]];
992 v2 = eva[icoface[a][1]];
993 v3 = eva[icoface[a][2]];
994
995 f = BM_face_create_quad_tri(bm, v1, v2, v3, nullptr, nullptr, BM_CREATE_NOP);
996
997 BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
999 }
1000
1001 /* Set the UVs here, the iteration order of the faces is not guaranteed,
1002 * so it's best to set the UVs right after the face is created. */
1003 if (calc_uvs) {
1004 int loop_index;
1005 BM_ITER_ELEM_INDEX (l, &liter, f, BM_LOOPS_OF_FACE, loop_index) {
1006 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1007 luv[0] = icouvs[uvi][0];
1008 luv[1] = icouvs[uvi][1];
1009 uvi++;
1010 }
1011 }
1012 }
1013
1014 if (subdiv > 1) {
1015 BMOperator bmop;
1016
1018 &bmop,
1019 op->flag,
1020 "subdivide_edges edges=%fe "
1021 "smooth=%f "
1022 "cuts=%i "
1023 "use_grid_fill=%b use_sphere=%b",
1024 EDGE_MARK,
1025 rad,
1026 (1 << (subdiv - 1)) - 1,
1027 true,
1028 true);
1029
1030 BMO_op_exec(bm, &bmop);
1033 BMO_op_finish(bm, &bmop);
1034 }
1035
1036 /* must transform after because of sphere subdivision */
1037 BM_ITER_MESH (v, &viter, bm, BM_VERTS_OF_MESH) {
1039 mul_m4_v3(mat, v->co);
1040 }
1041 }
1042
1044}
1045
1046static void bm_mesh_calc_uvs_sphere_face(BMFace *f, const int cd_loop_uv_offset)
1047{
1048 float *uvs[4];
1049 BMLoop *l;
1050 BMIter iter;
1051 float dx;
1052 int loop_index, loop_index_max_x;
1053
1054 BLI_assert(f->len <= 4);
1055
1056 /* If face has 3 vertices, it's a polar face, in which case we need to
1057 * compute a nearby to determine its latitude. */
1058 float avgx = 0.0f, avgy = 0.0f;
1059 BM_ITER_ELEM_INDEX (l, &iter, f, BM_LOOPS_OF_FACE, loop_index) {
1060 if (f->len == 3) {
1061 avgx += l->v->co[0];
1062 avgy += l->v->co[1];
1063 }
1064 }
1065 avgx /= 3.0f;
1066 avgy /= 3.0f;
1067
1068 BM_ITER_ELEM_INDEX (l, &iter, f, BM_LOOPS_OF_FACE, loop_index) {
1069 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1070 float x = l->v->co[0];
1071 float y = l->v->co[1];
1072 float z = l->v->co[2];
1073 float len = len_v3(l->v->co);
1074
1075 /* Use neighboring point to compute angle for poles. */
1076 float theta;
1077 if (f->len == 3 && fabsf(x) < 0.0001f && fabsf(y) < 0.0001f) {
1078 theta = atan2f(avgy, avgx);
1079 }
1080 else {
1081 theta = atan2f(y, x);
1082 }
1083
1084 /* Shift borderline coordinates to the left. */
1085 if (fabsf(theta - float(M_PI)) < 0.0001f) {
1086 theta = -M_PI;
1087 }
1088
1089 float phi = safe_acosf(z / len);
1090 luv[0] = 0.5f + theta / (float(M_PI) * 2);
1091 luv[1] = 1.0f - phi / float(M_PI);
1092
1093 uvs[loop_index] = luv;
1094 }
1095
1096 /* Fix awkwardly-wrapping UVs */
1097 loop_index_max_x = 0;
1098 for (loop_index = 1; loop_index < f->len; loop_index++) {
1099 if (uvs[loop_index][0] > uvs[loop_index_max_x][0]) {
1100 loop_index_max_x = loop_index;
1101 }
1102 }
1103
1104 for (loop_index = 0; loop_index < f->len; loop_index++) {
1105 if (loop_index != loop_index_max_x) {
1106 dx = uvs[loop_index_max_x][0] - uvs[loop_index][0];
1107 if (dx > 0.5f) {
1108 uvs[loop_index][0] += 1.0f;
1109 }
1110 }
1111 }
1112}
1113
1114void BM_mesh_calc_uvs_sphere(BMesh *bm, const short oflag, const int cd_loop_uv_offset)
1115{
1116 BMFace *f;
1117 BMIter iter;
1118
1119 BLI_assert(cd_loop_uv_offset != -1); /* caller is responsible for giving us UVs */
1120
1121 BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
1122 if (!BMO_face_flag_test(bm, f, oflag)) {
1123 continue;
1124 }
1125
1126 bm_mesh_calc_uvs_sphere_face(f, cd_loop_uv_offset);
1127 }
1128
1129 BMIter iter2;
1130 BMLoop *l;
1131 int loop_index;
1132 float minx = 1.0f;
1133
1134 BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
1135 if (!BMO_face_flag_test(bm, f, oflag)) {
1136 continue;
1137 }
1138 BM_ITER_ELEM_INDEX (l, &iter2, f, BM_LOOPS_OF_FACE, loop_index) {
1139 float *luv = BM_ELEM_CD_GET_FLOAT_P(l, cd_loop_uv_offset);
1140 if (luv[0] < minx) {
1141 minx = luv[0];
1142 }
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{
1159 BMVert **tv = static_cast<BMVert **>(MEM_mallocN(sizeof(*tv) * monkeynv * 2, "tv"));
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 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:50
MINLINE float min_ff(float a, float b)
MINLINE int max_ii(int a, int b)
#define M_PI
MINLINE float safe_acosf(float a)
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:43
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:23
@ BM_CREATE_NOP
Definition bmesh_core.hh:24
#define BM_ITER_ELEM(ele, iter, data, itype)
#define BM_ITER_MESH(ele, iter, bm, itype)
@ BM_VERTS_OF_MESH
@ BM_FACES_OF_MESH
@ BM_LOOPS_OF_FACE
#define BM_ITER_ELEM_INDEX(ele, iter, data, itype, indexvar)
ATTR_WARN_UNUSED_RESULT BMesh * bm
BMVert * BM_edge_collapse(BMesh *bm, BMEdge *e_kill, BMVert *v_kill, const bool do_del, const bool kill_degenerate_faces)
#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 XY(_x, _y)
static const short icoface[20][3]
static const int monkeyo
#define VERT_MARK
void BM_mesh_calc_uvs_cube(BMesh *bm, const short oflag)
static const float icovert[12][3]
static signed char monkeyf[250][4]
#define FACE_NEW
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)
#define FACE_MARK
void BM_mesh_calc_uvs_circle(BMesh *bm, float mat[4][4], const float radius, const short oflag, const int cd_loop_uv_offset)
void BM_mesh_calc_uvs_cone(BMesh *bm, float mat[4][4], const float radius_top, const float radius_bottom, const int segments, const bool cap_ends, const short oflag, const int cd_loop_uv_offset)
void bmo_create_icosphere_exec(BMesh *bm, BMOperator *op)
void bmo_create_cone_exec(BMesh *bm, BMOperator *op)
#define EDGE_MARK
static void bm_mesh_calc_uvs_sphere_face(BMFace *f, const int cd_loop_uv_offset)
void BM_mesh_calc_uvs_sphere(BMesh *bm, const short oflag, const int cd_loop_uv_offset)
void bmo_create_cube_exec(BMesh *bm, BMOperator *op)
static const float icouvs[60][2]
#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)
int len
draw_view in_light_buf[] float
static float verts[][3]
blender::gpu::Batch * quad
void *(* MEM_mallocN)(size_t len, const char *str)
Definition mallocn.cc:44
void MEM_freeN(void *vmemh)
Definition mallocn.cc:105
float no[3]
struct BMVert * v
struct BMEdge * e
struct BMLoop * prev
struct BMLoop * next
union BMOpSlot::@139 data
struct BMOpSlot slots_out[BMO_OP_MAX_SLOTS]
struct BMOpSlot slots_in[BMO_OP_MAX_SLOTS]
float co[3]
CustomData ldata