Found 17 posts.
Search results Show results as topic list.
Technical Discussion » Verbifying HDAs
-
- nhillier
- 17 posts
- Offline
Does anyone know if it's possible to verbify HDAs so that they can be called from Python? I'm trying to encapsulate some behavior so I can call it from a nodeless Python state.
Technical Discussion » Virus warning on Windows H17 install...?
-
- nhillier
- 17 posts
- Offline
I've had similar issues with ByteFence. Not just H17, either. I started getting it on and off a few weeks ago.
Technical Discussion » Surfacing FLIP - Delete colliding points, aka 'keep the water line only'.
-
- nhillier
- 17 posts
- Offline
My first instinct would be to first cull particles prior to meshing, and then raying meshed points within a certain threshold.
Technical Discussion » Rendering options for personal work
-
- nhillier
- 17 posts
- Offline
I'm struggling to find the right fit in a renderer right now. I've started to do more animation, and as such, need a solution with some speed.
I started with Mantra, naturally, and it's still my favorite for flexibility. But speed is lacking, especially when dealing with complicated lighting scenarios - lot's of refraction, SSS, etc.
For a short while I was using Octane, but I ran into memory issues a couple times, and I found that very frustrating.
Currently I'm using Arnold, which seems on average to be a bit zippier than Mantra (though you lose flexibility.) There's a pretty good deal with Gridmarkets which alows you to render without the need for purchasing your own license. So far this has worked well, but on slower renders it starts to get a bit pricey.
I haven't tried Redshift, but from what I've read it doesn't have the memory limitations of Octane, which makes it rather attractive.
What are your experiences/recommendations?
I started with Mantra, naturally, and it's still my favorite for flexibility. But speed is lacking, especially when dealing with complicated lighting scenarios - lot's of refraction, SSS, etc.
For a short while I was using Octane, but I ran into memory issues a couple times, and I found that very frustrating.
Currently I'm using Arnold, which seems on average to be a bit zippier than Mantra (though you lose flexibility.) There's a pretty good deal with Gridmarkets which alows you to render without the need for purchasing your own license. So far this has worked well, but on slower renders it starts to get a bit pricey.
I haven't tried Redshift, but from what I've read it doesn't have the memory limitations of Octane, which makes it rather attractive.
What are your experiences/recommendations?
Technical Discussion » Painting textures directly in Houdini
-
- nhillier
- 17 posts
- Offline
qLib has a couple tools that can be jerry-rigged together to effectively create a a texture painting tool. Theres a SOP that generate points on a surface according to the UVs and a texture size, with each point equating to a pixel. There's then a COP that can read those points and write their color to a texture. You can then read that texture back into a material on the orginal geo. It's unworkably slow for interactive painting, however.
Conceivably you could also build something around the stroke SOP, but it would be a lot of R&D.
Conceivably you could also build something around the stroke SOP, but it would be a lot of R&D.
Houdini Indie and Apprentice » Upgrading Indie from 15.0 to 15.5
-
- nhillier
- 17 posts
- Offline
Houdini Indie and Apprentice » Upgrading Indie from 15.0 to 15.5
-
- nhillier
- 17 posts
- Offline
Is it possible to upgrade an Indie license to the newest version? I seem to remember doing this in the past, but I can't for the life of me figure it out now.
Technical Discussion » triggering Qt Python Panel reloads
-
- nhillier
- 17 posts
- Offline
I just ran through this in a standalone app and figured out how to get things working. Previous to this project I did a tutorial on model/view programming in PyQt. As a part of that I implemented insertRows and removeRows on a custom list model. This was the way in which data was added and removed from the model.
Since my current project gets the data by dynamically querying the inputAncestors() of a node, I saw no reason to implement these methods. Something very important was happening in the tutorial code that escaped me. The body of insertRows() is surounded by a call to beginInsertRows() and endInsertRows(). These functions are responsible for notifying the view of which items will need to be updated.
As I am not using my model to insert or remove (at least not currently). I found that using the reset functions works to let the view know that the model has changed:
model.beginResetModel()
model.endResetModel()
That does the trick of refreshing properly. This one liner also seems to work fine:
model.reset()
Although the documentation advises against it. (http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#reset [qt-project.org])
I don't fully understand the reasoning, and it might not apply to my example, as I am not actively invalidating the model, but responding to changes in the Houdini scene.
I think we can call this one solved
Using node event callbacks still leaves something to be desired. Keeping in sync with my node network by recursively attaching callbacks to all my nodes seems rather kludgey. I wish there was some mechanism that was a bit more universal, but that may be a larger topic than this thread.
Thanks for the help!
Since my current project gets the data by dynamically querying the inputAncestors() of a node, I saw no reason to implement these methods. Something very important was happening in the tutorial code that escaped me. The body of insertRows() is surounded by a call to beginInsertRows() and endInsertRows(). These functions are responsible for notifying the view of which items will need to be updated.
As I am not using my model to insert or remove (at least not currently). I found that using the reset functions works to let the view know that the model has changed:
model.beginResetModel()
model.endResetModel()
That does the trick of refreshing properly. This one liner also seems to work fine:
model.reset()
Although the documentation advises against it. (http://qt-project.org/doc/qt-4.8/qabstractitemmodel.html#reset [qt-project.org])
I don't fully understand the reasoning, and it might not apply to my example, as I am not actively invalidating the model, but responding to changes in the Houdini scene.
I think we can call this one solved

Using node event callbacks still leaves something to be desired. Keeping in sync with my node network by recursively attaching callbacks to all my nodes seems rather kludgey. I wish there was some mechanism that was a bit more universal, but that may be a larger topic than this thread.
Thanks for the help!
Edited by - March 2, 2015 00:44:04
Technical Discussion » triggering Qt Python Panel reloads
-
- nhillier
- 17 posts
- Offline
1. Whether your callback gets called at the right time.Yeah, I'm definitely finding this to be pretty finicky. So far my best solution is to add the callback to my target node, and then to all of its input ancestors. This seems to be the only way I can catch name changes on all the nodes. Right now I'm catching all event types, just to make sure nothing slips by me:
event_types = (hou.nodeEventType.BeingDeleted,
hou.nodeEventType.NameChanged,
hou.nodeEventType.FlagChanged,
hou.nodeEventType.FlagChanged,
hou.nodeEventType.AppearanceChanged,
hou.nodeEventType.PositionChanged,
hou.nodeEventType.InputRewired,
hou.nodeEventType.InputDataChanged,
hou.nodeEventType.ParmTupleChanged,
hou.nodeEventType.ChildSelectionChanged,
hou.nodeEventType.ChildCreated,
hou.nodeEventType.ChildDeleted,
hou.nodeEventType.ChildSwitched,
)
2. Sounds kinda like a pyqt layout thing to meI suspect you're right about this. I'm pretty green at Qt, so I guess I'm missing something about how widgets/views resize.
in non-H14 PyQt scripts, I've been able to update using show()
Yeah, this doesn't seem to work for me. I'm calling everything I can think of to try to get updates now:
def refreshCallback(**kwargs):
list_view.update()
list_view.show()
layout.update()
root_widget.update()
root_widget.show()
QtCore.QCoreApplication.processEvents()
But to no avail. I also noticed some suspect members on QListView and QLayout, that I thought I might need to set to make sure everything rezizes properly when updating:
list_view.setResizeMode(QtGui.QListView.ResizeMode.Adjust)
layout.setSizeConstraint(QtGui.QLayout.SizeConstraint.SetNoConstraint)
Still no luck. Very perplexing indeed. Hopefully a Qt wizard will see this post. If I figure it out I'll post my solution.
Technical Discussion » paint textures in viewport
-
- nhillier
- 17 posts
- Offline
Bump. 
Is this on the roadmap at all? I would be very interested in seeing this feature, particularly with ptex support.
I may try my hand at the HDK at some point to see if I can get this functionality, but currently that is a bit beyond me.

Is this on the roadmap at all? I would be very interested in seeing this feature, particularly with ptex support.
I may try my hand at the HDK at some point to see if I can get this functionality, but currently that is a bit beyond me.
Technical Discussion » triggering Qt Python Panel reloads
-
- nhillier
- 17 posts
- Offline
Thanks, Edward. That moves me closer to what I want, but I'm still seeing some issues.
I can now trigger refreshes with this callback:
def refreshCallback(**kwargs):
root_widget.update()
QtCore.QCoreApplication.processEvents()
This means I don't need to mouse over the Python Panel to get updates, but things still act weirdly if I'm adding additional nodes to the input chain.
If my node has three input ancestors and they appear in the list like so:
THREE
TWO
ONE
Adding an additional node “FOUR” bumps an item off the list until I click reload:
FOUR
THREE
TWO
After clicking reload:
FOUR
THREE
TWO
ONE
The really weird thing is that if I have n input ancestors, and I have previously had at least n+1 ancestors, adding an additional node works properly. In other words, there seems to be some memory somewhere of the largest number of items that have ever been in the list, and adding removing nodes up to that number works properly, but going above that number requires a manual reload.
I can now trigger refreshes with this callback:
def refreshCallback(**kwargs):
root_widget.update()
QtCore.QCoreApplication.processEvents()
This means I don't need to mouse over the Python Panel to get updates, but things still act weirdly if I'm adding additional nodes to the input chain.
If my node has three input ancestors and they appear in the list like so:
THREE
TWO
ONE
Adding an additional node “FOUR” bumps an item off the list until I click reload:
FOUR
THREE
TWO
After clicking reload:
FOUR
THREE
TWO
ONE
The really weird thing is that if I have n input ancestors, and I have previously had at least n+1 ancestors, adding an additional node works properly. In other words, there seems to be some memory somewhere of the largest number of items that have ever been in the list, and adding removing nodes up to that number works properly, but going above that number requires a manual reload.
Technical Discussion » Fluid Explodes?
-
- nhillier
- 17 posts
- Offline
The reason your fluid is exploding is because it is colliding with your “domain” static object, but it is inside of the object, so it is constantly in collision and constantly trying to escape.
To get your box to act like a container (like walls of a building, instead of a brick) you need to reverse your face normals.
Simply place a Reverse SOP between box1 and attribcreate1 in /obj/domain. that should fix the problem.
Also, it is not necessary to manually create container like this. The FLIP solver has built-in limits on the Volume Motion / Volume Limits tab. You can set which boundaries you want the FLIP Object to collide with on the Initial Data tab (Closed Boundaries parameters).
To get your box to act like a container (like walls of a building, instead of a brick) you need to reverse your face normals.
Simply place a Reverse SOP between box1 and attribcreate1 in /obj/domain. that should fix the problem.
Also, it is not necessary to manually create container like this. The FLIP solver has built-in limits on the Volume Motion / Volume Limits tab. You can set which boundaries you want the FLIP Object to collide with on the Initial Data tab (Closed Boundaries parameters).
Technical Discussion » Velocity Fields to Major Lines
-
- nhillier
- 17 posts
- Offline
You could try scattering points inside your field, and then using a Solver SOP to advect them through your field. You can then use a Trail SOP to trace the the path of your points over time.
Technical Discussion » triggering Qt Python Panel reloads
-
- nhillier
- 17 posts
- Offline
What's the best way to keep a Python Panel in sync with the rest of Houdini? I have a simple test where I populate a QListView based on the inputAncestors of a node.
When I make changes in the Node Editor I find I have to at least mouse over my interface to see the update. Sometimes when adding a node, the interface only updates existing rows, but does not add an additional row. In this case I have to click the reload button at the top of the Python Panel Pane. Otherwise the interface falls out of step with Houdini.
Here is my model which adapts a node into a list of the names of its input ancestors:
from PySide import QtGui, QtCore
import hou
class NodeInputListModel(QtCore.QAbstractListModel):
def __init__(self, node = None, parent = None):
QtCore.QAbstractListModel.__init__(self, parent)
self.__node = node
def rowCount(self, parent):
return len(self.__node.inputAncestors(include_ref_inputs=False))
def data(self, index, role):
if role == QtCore.Qt.DisplayRole:
row = index.row()
if self.__node is not None:
inputs = self.__node.inputAncestors(include_ref_inputs=False)
return inputs.name()
And here is my createInterface function:
def createInterface():
# Create a listView and model
listView = QtGui.QListView()
model = NodeInputListModel(hou.node('/obj/geo1/OUT'))
listView.setModel(model)
# Create a widget with a vertical box layout.
# Add the listView to the layout.
root_widget = QtGui.QWidget()
layout = QtGui.QVBoxLayout()
layout.addWidget(listView)
root_widget.setLayout(layout)
# Return the top-level widget.
return root_widget
Is it possible to trigger refreshes of my panel whenever my node network changes?
When I make changes in the Node Editor I find I have to at least mouse over my interface to see the update. Sometimes when adding a node, the interface only updates existing rows, but does not add an additional row. In this case I have to click the reload button at the top of the Python Panel Pane. Otherwise the interface falls out of step with Houdini.
Here is my model which adapts a node into a list of the names of its input ancestors:
from PySide import QtGui, QtCore
import hou
class NodeInputListModel(QtCore.QAbstractListModel):
def __init__(self, node = None, parent = None):
QtCore.QAbstractListModel.__init__(self, parent)
self.__node = node
def rowCount(self, parent):
return len(self.__node.inputAncestors(include_ref_inputs=False))
def data(self, index, role):
if role == QtCore.Qt.DisplayRole:
row = index.row()
if self.__node is not None:
inputs = self.__node.inputAncestors(include_ref_inputs=False)
return inputs.name()
And here is my createInterface function:
def createInterface():
# Create a listView and model
listView = QtGui.QListView()
model = NodeInputListModel(hou.node('/obj/geo1/OUT'))
listView.setModel(model)
# Create a widget with a vertical box layout.
# Add the listView to the layout.
root_widget = QtGui.QWidget()
layout = QtGui.QVBoxLayout()
layout.addWidget(listView)
root_widget.setLayout(layout)
# Return the top-level widget.
return root_widget
Is it possible to trigger refreshes of my panel whenever my node network changes?
Technical Discussion » Bug? Capture region end caps aren't visible.
-
- nhillier
- 17 posts
- Offline
Figured it out. The end caps are part of the handle, and for some reason the handle wouldn't activate. Restarting Houdini fixed the issue, everything is normal now.

Technical Discussion » Bug? Capture region end caps aren't visible.
-
- nhillier
- 17 posts
- Offline
Hey, I'm new to Houdini character tools. I'm watching a tutorial series, and I've gotten to the capture regions. I'm noticing that in the video their regions have end caps, but I don't see any in my session. Is this a preference or parameter somewhere? A different behavior for my version of Houdini? A flat-out bug?
I'm on 13.0.260 on Windows 7
I'm on 13.0.260 on Windows 7
Technical Discussion » Error copying project to cloud
-
- nhillier
- 17 posts
- Offline
I'm trying to get up an running with HQueue Cloud, but I am running into a very frustrating issue. When I submit, Houdini creates a .project_parms file and a .tar.bz2 for upload, but it puts a space (and parentheses, though I don't think that's the issue) in the filenames causing errors when setting up on the farm. Is there any way to specify how Houdini names these files?
I'm currently running version 12.5.316.22 for 64bit Windows.
Here is an excerpt from cloudsubmit.log:
Error: Failed to extract files on the remote machine:
bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `cd /mnt/projects && tar xfj Nathan_2_tetra2 (1).tar.bz2 && rm Nathan_2_tetra2 (1).tar.bz2'
I'm currently running version 12.5.316.22 for 64bit Windows.
Here is an excerpt from cloudsubmit.log:
Error: Failed to extract files on the remote machine:
bash: -c: line 0: syntax error near unexpected token `('
bash: -c: line 0: `cd /mnt/projects && tar xfj Nathan_2_tetra2 (1).tar.bz2 && rm Nathan_2_tetra2 (1).tar.bz2'
-
- Quick Links