git clone https://git.lucas.co/hou-control.git
python3.11libs/hc/hcguides.py (7.7K)
1 import hou
2
3 class HCGuides:
4 def __init__(self, state):
5 self.state = state
6 self.cam_node = state.cam_node
7 self.cam = state.cam
8 self.scene_viewer = state.scene_viewer
9
10 self.axis_size = None
11 self.tie_axis_to_radius = None
12 self.cam_axis = None
13 self.pivot_axis = None
14 self.bbox = None
15 self.perim = None
16 self.pivot_2d = None
17 self.pivot_3d = None
18 self.ray = None
19
20 self.cam_axis_drawable = hou.GeometryDrawable(
21 scene_viewer=self.scene_viewer.hou_tab,
22 geo_type=hou.drawableGeometryType.Line,
23 name='cam_axis'
24 )
25
26 self.pivot_axis_drawable = hou.GeometryDrawable(
27 scene_viewer=self.scene_viewer.hou_tab,
28 geo_type=hou.drawableGeometryType.Line,
29 name='pivot_axis',
30 params={
31 'color1': hou.Vector4((1, 1, 1, 0.5))
32 }
33 )
34
35 self.bbox_drawable = hou.GeometryDrawable(
36 scene_viewer=self.scene_viewer.hou_tab,
37 geo_type=hou.drawableGeometryType.Line,
38 name='bbox',
39 params={
40 'color1': hou.Vector4((1, 1, 1, 0.3)),
41 'fade_factor': 0.0
42 }
43 )
44
45 self.perim_drawable = hou.GeometryDrawable(
46 scene_viewer=self.scene_viewer.hou_tab,
47 geo_type=hou.drawableGeometryType.Line,
48 name='perim'
49 )
50
51 self.pivot_2d_drawable = hou.GeometryDrawable(
52 scene_viewer=self.scene_viewer.hou_tab,
53 geo_type=hou.drawableGeometryType.Line,
54 name='pivot_2d'
55 )
56
57 self.pivot_3d_drawable = hou.GeometryDrawable(
58 scene_viewer=self.scene_viewer.hou_tab,
59 geo_type=hou.drawableGeometryType.Face,
60 name='pivot_3d',
61 params={
62 'color1': hou.Vector4(0.2, 0.8, 0.2, 0.6),
63 'fade_factor': 0.2
64 }
65 )
66
67 self.ray_drawable = hou.GeometryDrawable(
68 scene_viewer=self.scene_viewer.hou_tab,
69 geo_type=hou.drawableGeometryType.Line,
70 name='ray',
71 params={
72 'color1': hou.Vector4((1, 0.8, 1, 0.5))
73 }
74 )
75
76 def draw(self, kwargs):
77 draw_handle = kwargs['draw_handle']
78 if self.bbox: self.bbox_drawable.draw(draw_handle, {})
79 if self.cam_axis: self.cam_axis_drawable.draw(draw_handle, {})
80 if self.pivot_axis: self.pivot_axis_drawable.draw(draw_handle, {})
81 if self.perim: self.perim_drawable.draw(draw_handle, {})
82 if self.pivot_2d: self.pivot_2d_drawable.draw(draw_handle, {})
83 if self.pivot_3d: self.pivot_3d_drawable.draw(draw_handle, {})
84 if self.ray: self.ray_drawable.draw(draw_handle, {})
85
86 def update(self):
87 from hc import HCSettings
88 prefs = HCSettings().prefs().get('keycam').get('guides')
89 self.axis_size = prefs.get('axis_size')
90 self.tie_axis_to_radius = prefs.get('tie_axis_to_radius')
91 self.bbox = prefs.get('bbox')
92 self.cam_axis = prefs.get('cam_axis')
93 self.cam_geo = prefs.get('cam_geo')
94 self.pivot_axis = prefs.get('pivot_axis')
95 self.pivot_2d = prefs.get('pivot_2d')
96 self.pivot_3d = prefs.get('pivot_3d')
97 self.perim = prefs.get('perim')
98 self.ray = prefs.get('ray')
99
100 if self.bbox: self.makeBbox()
101 self.bbox_drawable.show(self.bbox)
102
103 if self.cam_axis: self.makeCamAxis()
104 self.cam_axis_drawable.show(self.cam_axis)
105
106 if self.pivot_axis: self.makePivotAxis()
107 self.pivot_axis_drawable.show(self.pivot_axis)
108
109 if self.perim: self.makePerim()
110 self.perim_drawable.show(self.perim)
111
112 if self.pivot_2d: self.makePivot2d()
113 self.pivot_2d_drawable.show(self.pivot_2d)
114
115 if self.pivot_3d: self.makePivot3d()
116 self.pivot_3d_drawable.show(self.pivot_3d)
117
118 if self.ray: self.makeRay()
119 self.ray_drawable.show(self.ray)
120
121
122 """ Construction """
123
124 def makeCamAxis(self):
125 axes = (
126 self.cam.local_x,
127 self.cam.local_y,
128 self.cam.local_z
129 )
130 geo = hou.Geometry()
131 for i in range(3):
132 P0 = self.cam.t + axes[i]
133 P1 = self.cam.t + axes[i] * -1
134 pts = geo.createPoints((P0, P1))
135 poly = geo.createPolygon(is_closed=False)
136 poly.addVertex(pts[0])
137 poly.addVertex(pts[1])
138 self.cam_axis_drawable.setGeometry(geo)
139
140 def makePivotAxis(self):
141 scale = self.axis_size
142 axes = (
143 self.cam.local_x,
144 self.cam.local_y,
145 self.cam.local_z
146 )
147 colors = (
148 [1.0, 0.7, 0.7],
149 [0.7, 1.0, 0.7],
150 [0.7, 0.7, 1.0]
151 )
152 geo = hou.Geometry()
153 geo.addAttrib(hou.attribType.Point, 'Cd', (0.1, 0.1, 0.1))
154 for i in range(3):
155 P0 = self.cam.p + axes[i] * scale
156 P1 = self.cam.p + axes[i] * -scale
157 pts = geo.createPoints((P0, P1))
158 pts[0].setAttribValue('Cd', colors[i])
159 pts[1].setAttribValue('Cd', colors[i])
160 poly = geo.createPolygon(is_closed=False)
161 poly.addVertex(pts[0])
162 poly.addVertex(pts[1])
163 self.pivot_axis_drawable.setGeometry(geo)
164 self.pivot_axis_drawable.setParams(
165 {'fade_factor': 0.0}
166 )
167
168 def makeBbox(self):
169 guide_geo = hou.Geometry()
170 target_geo = self.scene_viewer.geo()
171 bbox = target_geo.bbox()
172 box = hou.sopNodeTypeCategory().nodeVerb('box')
173 box.setParms(
174 {
175 'size': bbox.sizevec(),
176 't': bbox.center()
177 }
178 )
179 box.execute(guide_geo, [])
180 self.bbox_drawable.setGeometry(guide_geo)
181
182 def makePerim(self):
183 guide_geo = hou.Geometry()
184 circle = hou.sopNodeTypeCategory().nodeVerb('circle')
185 circle.setParms(
186 {
187 'divs': 128,
188 'type': 1,
189 't': self.cam.p,
190 'scale': self.cam.p.distanceTo(self.cam.t),
191 'orient': 2
192 }
193 )
194 circle.execute(guide_geo, [])
195 self.perim_drawable.setParams(
196 {
197 'color1': hou.Vector4(1.0, 1.0, 1.0, 0.25),
198 'fade_factor': 1.0
199 }
200 )
201 self.perim_drawable.setGeometry(guide_geo)
202
203 def makePivot2d(self):
204 guide_geo = hou.Geometry()
205 circle = hou.sopNodeTypeCategory().nodeVerb('circle')
206 circle.setParms(
207 {
208 'type': 1,
209 'r': self.cam.r,
210 't': self.cam.p,
211 'scale': self.cam.ow * 0.0075
212 }
213 )
214 circle.execute(guide_geo, [])
215 self.pivot_2d_drawable.setParams(
216 {
217 'color1': hou.Vector4(0.0, 0.0, 1, 1),
218 'fade_factor': 1.0
219 }
220 )
221 self.pivot_2d_drawable.setGeometry(guide_geo)
222
223 def makePivot3d(self):
224 guide_geo = hou.Geometry()
225 sphere = hou.sopNodeTypeCategory().nodeVerb('sphere')
226 scale = self.cam.t.distanceTo(self.cam.p) * 0.01
227 sphere.setParms(
228 {
229 'freq': 7,
230 'scale': scale,
231 'type': 1,
232 't': self.cam.p
233 }
234 )
235 sphere.execute(guide_geo, [])
236 self.pivot_3d_drawable.setGeometry(guide_geo)
237
238 def makeRay(self):
239 guide_geo = hou.Geometry()
240 guide_geo.addAttrib(hou.attribType.Point, 'Cd', (1, 0, 0))
241 pts = guide_geo.createPoints((self.cam.p, self.cam.t))
242 poly = guide_geo.createPolygon()
243 poly.addVertex(pts[0])
244 poly.addVertex(pts[1])
245 self.ray_drawable.setGeometry(guide_geo)