git.lucas.co / hou-control
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)