Fix #100973: Node Wrangler: Previewing node if hierarchy not active
[blender-addons.git] / add_camera_rigs / create_widgets.py
blob9766554f874656173d91177a61c5ba40b4b56311
1 # SPDX-FileCopyrightText: 2019-2022 Blender Foundation
3 # SPDX-License-Identifier: GPL-2.0-or-later
5 import bpy
6 from mathutils import Vector
7 from math import cos, sin, pi
10 def create_widget(name):
11 """Create an empty widget object and return the object"""
12 prefs = bpy.context.preferences.addons["add_camera_rigs"].preferences
13 widget_prefix = prefs.widget_prefix
14 obj_name = widget_prefix + name
15 scene = bpy.context.scene
17 obj = bpy.data.objects.get(obj_name)
19 if obj is None:
20 mesh = bpy.data.meshes.new(obj_name)
21 obj = bpy.data.objects.new(obj_name, mesh)
23 # Create a new collection for the widgets
24 collection_name = prefs.camera_widget_collection_name
25 coll = bpy.data.collections.get(collection_name)
26 if coll is None:
27 coll = bpy.data.collections.new(collection_name)
28 scene.collection.children.link(coll)
29 coll.hide_viewport = True
30 coll.hide_render = True
32 # Link the collection
33 coll.objects.link(obj)
35 return obj
38 def create_corner_widget(name, reverse=False):
39 """Create a wedge-shaped widget"""
40 obj = create_widget(name)
41 if not obj.data.vertices:
42 reverse = -1 if reverse else 1
43 verts = (Vector((reverse * 0.0, 0.0, 0.0)),
44 Vector((reverse * 0.0, 1.0, 0.0)),
45 Vector((reverse * -0.1, 1.0, 0.0)),
46 Vector((reverse * -0.1, 0.1, 0.0)),
47 Vector((reverse * -1.0, 0.1, 0.0)),
48 Vector((reverse * -1.0, 0.0, 0.0)),
50 edges = [(n, (n+1) % len(verts)) for n in range(len(verts))]
52 mesh = obj.data
53 mesh.from_pydata(verts, edges, ())
54 mesh.update()
55 return obj
58 def create_circle_widget(name, radius=1.0):
59 """Create a circle-shaped widget"""
60 obj = create_widget(name)
61 if not obj.data.vertices:
62 vert_n = 16
63 verts = []
64 for n in range(vert_n):
65 angle = n / vert_n * 2*pi
66 verts.append(Vector((cos(angle) * radius,
67 sin(angle) * radius, 0.0)))
68 edges = [(n, (n+1) % len(verts)) for n in range(len(verts))]
70 mesh = obj.data
71 mesh.from_pydata(verts, edges, ())
72 mesh.update()
73 return obj
76 def create_root_widget(name):
77 """Create a compass-shaped widget"""
78 obj = create_widget(name)
79 if not obj.data.vertices:
80 verts = [(0.6307649612426758, 0.6271349787712097, 0.0),
81 (0.3413670063018799, 0.8205029964447021, 0.0),
82 (0.0, 0.8884050250053406, 0.0),
83 (-0.3413670063018799, 0.8205029964447021, 0.0),
84 (-0.6307649612426758, 0.6271349787712097, 0.0),
85 (-0.8241360187530518, 0.3377370238304138, 0.0),
86 (-0.8920379877090454, -0.003631560131907463, 0.0),
87 (0.8920379877090454, -0.003631379920989275, 0.0),
88 (0.824133038520813, 0.3377370238304138, 0.0),
89 (0.21458700299263, 1.5175920724868774, 0.0),
90 (-0.21458669006824493, 1.5175920724868774, 0.0),
91 (-0.21458700299263, 1.1372729539871216, 0.0),
92 (0.21458700299263, 1.1372729539871216, 0.0),
93 (-0.3977609872817993, 1.5175920724868774, 0.0),
94 (0.3977609872817993, 1.5175920724868774, 0.0),
95 (0.0, 2.002802848815918, 0.0),
96 (-0.8241360187530518, -0.3449999988079071, 0.0),
97 (0.8241360187530518, -0.3449999988079071, 0.0),
98 (0.6307649612426758, -0.6343979835510254, 0.0),
99 (0.3413670063018799, -0.8277660012245178, 0.0),
100 (0.0, -0.8956680297851562, 0.0),
101 (-0.3413670063018799, -0.8277660012245178, 0.0),
102 (-0.6307649612426758, -0.6343979835510254, 0.0),
103 (-2.0064330101013184, -0.003630870021879673, 0.0),
104 (-1.5212249755859375, 0.39413100481033325, 0.0),
105 (-1.5212249755859375, -0.4013940095901489, 0.0),
106 (-1.1409029960632324, 0.21095609664916992, 0.0),
107 (-1.1409029960632324, -0.2182179093360901, 0.0),
108 (-1.5212249755859375, -0.2182179093360901, 0.0),
109 (-1.5212249755859375, 0.21095609664916992, 0.0),
110 (1.5212249755859375, -0.2182179093360901, 0.0),
111 (1.5212249755859375, 0.21095609664916992, 0.0),
112 (1.1409029960632324, 0.21095609664916992, 0.0),
113 (1.1409029960632324, -0.2182179093360901, 0.0),
114 (1.5212249755859375, 0.39413100481033325, 0.0),
115 (1.5212249755859375, -0.4013940095901489, 0.0),
116 (2.0064330101013184, -0.0036309000570327044, 0.0),
117 (0.0, -2.0100629329681396, 0.0),
118 (-0.3977609872817993, -1.5248548984527588, 0.0),
119 (0.3977609872817993, -1.5248548984527588, 0.0),
120 (-0.21458669006824493, -1.144536018371582, 0.0),
121 (0.21458730101585388, -1.144536018371582, 0.0),
122 (0.21458730101585388, -1.5248548984527588, 0.0),
123 (-0.21458669006824493, -1.5248548984527588, 0.0)]
125 edges = [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (7, 8), (0, 8),
126 (10, 11), (9, 12), (11, 12), (10, 13), (9, 14), (13, 15), (14, 15),
127 (16, 22), (17, 18), (18, 19), (19, 20), (20, 21), (21, 22), (7, 17),
128 (6, 16), (23, 24), (23, 25), (24, 29), (25, 28), (26, 27), (26, 29),
129 (27, 28), (31, 32), (30, 33), (32, 33), (31, 34), (30, 35), (34, 36),
130 (35, 36), (37, 38), (37, 39), (38, 43), (39, 42), (40, 41), (40, 43),
131 (41, 42)]
133 mesh = obj.data
134 mesh.from_pydata(verts, edges, [])
135 mesh.update()
136 return obj
139 def create_camera_widget(name):
140 """Create a camera control widget"""
141 obj = create_widget(name)
142 if not obj.data.vertices:
143 verts = [(0.275136, 0, -0.275136), (0.359483, 0, -0.148903),
144 (0.389102, 0, 0), (0.359483, 0, 0.148903),
145 (0.275136, 0, 0.275136), (0.148903, 0, 0.359483),
146 (-1.94818e-07, 0, 0.389102), (-1.17505e-07, 0, -0.389102),
147 (0.148903, 0, -0.359483), (0.663549, 0, -0.0936016),
148 (0.663549, 0, 0.0936016), (0.497656, 0, 0.0936016),
149 (0.497656, 0, -0.0936017), (0.663549, 0, 0.173501),
150 (0.663549, 0, -0.173501), (0.875195, 0, 0),
151 (-0.148903, 0, 0.359483), (-0.148903, 0, -0.359483),
152 (-0.275136, 0, -0.275136), (-0.359483, 0, -0.148903),
153 (-0.389102, 0, 0), (-0.359483, 0, 0.148903),
154 (-0.275136, 0, 0.275136), (1.03426e-07, 0, 0.875195),
155 (0.173502, 0, 0.663549), (-0.173501, 0, 0.663549),
156 (0.0936017, 0, 0.497656), (-0.0936016, 0, 0.497656),
157 (-0.0936016, 0, 0.663549), (0.0936017, 0, 0.663549),
158 (-0.0936015, 0, -0.663549), (0.0936017, 0, -0.663549),
159 (0.0936017, 0, -0.497656), (-0.0936016, 0, -0.497656),
160 (0.173502, 0, -0.663549), (-0.173501, 0, -0.663549),
161 (9.42269e-08, 0, -0.875195), (-0.875195, 0, 0),
162 (-0.663549, 0, 0.173501), (-0.663549, 0, -0.173502),
163 (-0.497656, 0, 0.0936015), (-0.497656, 0, -0.0936018),
164 (-0.663549, 0, -0.0936018), (-0.663549, 0, 0.0936015),
166 edges = [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (7, 8), (0, 8),
167 (10, 11), (9, 12), (11, 12), (10, 13), (9, 14), (13, 15), (14, 15),
168 (16, 22), (17, 18), (18, 19), (19, 20), (20, 21), (21, 22), (7, 17),
169 (6, 16), (23, 24), (23, 25), (24, 29), (25, 28), (26, 29), (27, 28),
170 (31, 32), (30, 33), (32, 33), (31, 34), (30, 35), (34, 36), (35, 36),
171 (37, 38), (37, 39), (38, 43), (39, 42), (40, 41), (40, 43), (41, 42),
172 (27, 26)]
174 mesh = obj.data
175 mesh.from_pydata(verts, edges, [])
176 mesh.update()
177 return obj
180 def create_camera_offset_widget(name):
181 """Create a camera offset control widget"""
182 obj = create_widget(name)
183 if not obj.data.vertices:
184 verts = [(0.23286, 0, 0), (0.215135, 0, 0.0891117),
185 (0.164657, 0, 0.164657), (0.0891117, 0, 0.215135),
186 (0, 0, 0.23286), (-0.0891117, 0, 0.215135),
187 (-0.164657, 0, 0.164657), (-0.215135, 0, 0.0891117),
188 (-0.23286, 0, 0), (-0.215135, 0, -0.0891117),
189 (-0.164657, 0, -0.164657), (-0.0891117, 0, -0.215135),
190 (0, 0, -0.23286), (0.0891117, 0, -0.215135),
191 (0.164657, 0, -0.164657), (0.215135, 0, -0.0891117),
193 edges = [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8),
194 (8, 9), (9, 10), (10, 11), (11, 12), (12, 13), (13, 14), (14, 15),
195 (15, 0)]
197 mesh = obj.data
198 mesh.from_pydata(verts, edges, [])
199 mesh.update()
200 return obj
203 def create_aim_widget(name):
204 """Create a camera aim widget"""
205 obj = create_widget(name)
206 if not obj.data.vertices:
207 verts = [(0.31008288264274597, 0.0, 0.31008288264274597),
208 (0.40514281392097473, 0.0, 0.1678156554698944),
209 (0.43852344155311584, 0.0, 0.0),
210 (0.40514281392097473, 0.0, -0.1678156852722168),
211 (0.31008288264274597, 0.0, -0.31008288264274597),
212 (0.1678156703710556, 0.0, -0.40514281392097473),
213 (-2.1956294915526087e-07, 0.0, -0.43852344155311584),
214 (-1.3243040086763358e-07, 0.0, 0.43852344155311584),
215 (0.16781596839427948, 0.0, 0.4051426947116852),
216 (0.7993937134742737, 0.0, 0.10549049079418182),
217 (0.7993937134742737, 0.0, -0.10549048334360123),
218 (0.9863580465316772, 0.0, -0.10549048334360123),
219 (0.9863580465316772, 0.0, 0.105490542948246),
220 (0.7993937134742737, 0.0, -0.19553886353969574),
221 (0.7993937134742737, 0.0, 0.19553886353969574),
222 (0.5608659386634827, 0.0, 0.0),
223 (-0.1678159236907959, 0.0, -0.4051426947116852),
224 (-0.16781575977802277, 0.0, 0.40514281392097473),
225 (-0.31008294224739075, 0.0, 0.3100828230381012),
226 (-0.40514281392097473, 0.0, 0.16781564056873322),
227 (-0.43852344155311584, 0.0, 0.0),
228 (-0.40514281392097473, 0.0, -0.16781572997570038),
229 (-0.3100828230381012, 0.0, -0.31008294224739075),
230 (5.8281088399780856e-08, 0.0, 0.5608659982681274),
231 (-0.19553889334201813, 0.0, 0.7993938326835632),
232 (0.1955389529466629, 0.0, 0.7993938326835632),
233 (-0.10549052804708481, 0.0, 0.9863581657409668),
234 (0.10549058020114899, 0.0, 0.9863581657409668),
235 (0.10549052804708481, 0.0, 0.7993938326835632),
236 (-0.10549046844244003, 0.0, 0.7993938326835632),
237 (0.10549034923315048, 0.0, -0.7993939518928528),
238 (-0.10549066960811615, 0.0, -0.7993939518928528),
239 (-0.10549074411392212, 0.0, -0.9863584041595459),
240 (0.10549039393663406, 0.0, -0.9863584041595459),
241 (-0.19553910195827484, 0.0, -0.7993938326835632),
242 (0.19553880393505096, 0.0, -0.7993940711021423),
243 (-1.4296951178494055e-07, 0.0, -0.5608659982681274),
244 (-0.5608660578727722, 0.0, 0.0),
245 (-0.7993939518928528, 0.0, -0.19553877413272858),
246 (-0.7993937134742737, 0.0, 0.19553901255130768),
247 (-0.9863580465316772, 0.0, -0.10549040883779526),
248 (-0.9863580465316772, 0.0, 0.10549063980579376),
249 (-0.7993938326835632, 0.0, 0.10549062490463257),
250 (-0.7993938326835632, 0.0, -0.10549038648605347),
251 (-0.12803608179092407, 0.0, -0.12803612649440765),
252 (-0.167287215590477, 0.0, -0.06929267197847366),
253 (-0.18107034265995026, 0.0, 0.0),
254 (-0.167287215590477, 0.0, 0.06929262727499008),
255 (-0.12803612649440765, 0.0, 0.12803608179092407),
256 (-0.06929267197847366, 0.0, 0.167287215590477),
257 (-0.06929274648427963, 0.0, -0.1672871708869934),
258 (0.06929276883602142, 0.0, 0.1672871708869934),
259 (-5.468173824851874e-08, 0.0, 0.18107034265995026),
260 (-9.065958295195742e-08, 0.0, -0.18107034265995026),
261 (0.06929264962673187, 0.0, -0.167287215590477),
262 (0.12803609669208527, 0.0, -0.12803609669208527),
263 (0.167287215590477, 0.0, -0.06929264962673187),
264 (0.18107034265995026, 0.0, 0.0),
265 (0.167287215590477, 0.0, 0.06929264217615128),
266 (0.12803609669208527, 0.0, 0.12803609669208527),
267 (-6.667435314966497e-08, 0.0, 0.060356780886650085),
268 (-7.866697160352487e-08, 0.0, -0.060356780886650085),
269 (-0.060356780886650085, 0.0, 0.0),
270 (0.060356780886650085, 0.0, 0.0)]
272 edges = [(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6), (7, 8), (0, 8),
273 (10, 11), (9, 12), (11, 12), (10, 13), (9, 14), (13, 15), (14, 15),
274 (16, 22), (17, 18), (18, 19), (19, 20), (20, 21), (21, 22), (7, 17),
275 (6, 16), (23, 24), (23, 25), (24, 29), (25, 28), (26, 29), (27, 28),
276 (31, 32), (30, 33), (32, 33), (31, 34), (30, 35), (34, 36), (35, 36),
277 (37, 38), (37, 39), (38, 43), (39, 42), (40, 41), (40, 43), (41, 42),
278 (50, 53), (49, 52), (44, 45), (45, 46), (46, 47), (47, 48), (48, 49),
279 (44, 50), (51, 59), (51, 52), (53, 54), (54, 55), (55, 56), (56, 57),
280 (57, 58), (58, 59), (27, 26), (60, 61), (62, 63)]
282 mesh = obj.data
283 mesh.from_pydata(verts, edges, [])
284 mesh.update()
285 return obj