Jump to content


  • Content count

  • Donations

    0.00 CAD 
  • Joined

  • Last visited

  • Days Won


jordibares last won the day on September 7 2019

jordibares had the most liked content!

Community Reputation

94 Excellent


About jordibares

  • Rank

Contact Methods

  • Website URL
  • Skype

Personal Information

  • Name
    Jordi Bares
  • Location
  • Interests
    Too many interests
  1. Modeler 2021 Released!

    Seems the Dropbox link is not working.
  2. Houdini Mac user population

    I use mainly Linux at work, at home only Mac. I love my mac but my take is that the cost compares with a regular linux box is prety hard to justify. Let's see where things go.
  3. Boolean subtract geometry from curves?

    I never stop learning every single time I see one of your example scenes... what a joy to see this elegant solution. Thank you.
  4. hou ui Button Colour

    I am also interested in it... I think this may not be possible without changing the Theme design itself... and will be globa. i wish there was some extra refinements on the interface (native wise) and also allow us to further customize things like bigger buttonstrips, alignment, etc...
  5. Women Character Rigging

    Check this out. https://www.sidefx.com/learn/collections/character-masterclasses/
  6. Crowd Agents Bundle

    AFAIK there are no agents available commercially.
  7. LYNX | Free VFX Tools

    Superb toolset, really well crafted. Thank you so much for your generosity, I hope we can repay you in the form of beer or something. :-)
  8. evalAtFrame() and chop constraints weirdness

    Thanks Szymon, I did end up using that approach and it works well, nevertheless it has been quite annoying not to be able to rely on the evalAtFrame() I took advantage as well as the worldTransformAtTime does a proper evaluation on the frame so I don't need to update the frame and things are a lot faster and smoother. Thanks once again.
  9. I am writing a little python tool that requires evaluating the value of a channel a particular frame, but the object i am evaluating has a chop constraint and the function pos = internal_cam.parmTuple('t').evalAtFrame(f) returns (0,0,0) I imagine the chop network is "overriding" the value but I don't seem to get the result. Any ideas? Thanks. jb
  10. The Book of Shaders in Houdini Vex

    This is a great effort, really really nicely put together as well..
  11. Finally, 2 years later... we are now allowed to talk about it. https://www.jordibares.com/post/2018-07-07/champions-league-rebrand/ The text is a bit lame but it is the only we are allowed to use... sorry guys.
  12. Solaris Reveal

    Indeed, we are witnessing something that is going to revolutionise Computer Graphics and your checkmate analogy is spot on.
  13. NetworkImage

    Fixed, the code snippet now incorporates your fix... I did have it on my text editor correctly but something went wrong on the copy I think... thanks once again.
  14. NetworkImage

    I don't know if it is of any use but here is a linux version... DISCLAIMER, I have ignored accounting for the outputConnections() as I don't really understand the purpose... also I have commented a bit further and expand strings to support variables vs absolute paths discrepancies... should work ok. import hou import os import subprocess import nodegraphutils as utils from time import gmtime, strftime widthRatio = 4 # change to make screenshot bigger or smaller, this is ~x4 node width # -------------------------------------------------------------------------------------------- # FUNCTIONS # -------------------------------------------------------------------------------------------- def createScreenshotFolder(saveFolder): '''create screenshot folder under $HIP folder ''' # System call to create the necessary folder subprocess.check_call([r"mkdir", r"-p", saveFolder]) def takeScreenShot(savePath): '''change to your preferred capture app /!\ no error checking for now ''' # System call using ImageMagik import command that requests an interactive region to operate subprocess.check_call([r"import", savePath]) def removeBackgroundImage(**kwargs): ''' erases bg image from tuples of backgroundImages() if it can find it, updates bg ''' # find the node that is meant to be deleted deletingNode = [x[1] for x in kwargs.items()][0] # find the image in the spare tab image = deletingNode.parm('houdinipath').eval() # find the network editor = hou.ui.paneTabOfType(hou.paneTabType.NetworkEditor) # collect the images stored in it backgroundImagesDic = editor.backgroundImages() # find the one image to be deleted backgroundImagesDic = tuple(x for x in backgroundImagesDic if hou.expandString(x.path()) != hou.expandString(image)) # update the images editor.setBackgroundImages(backgroundImagesDic) utils.saveBackgroundImages(editor.pwd(), backgroundImagesDic) def changeBackgroundImageBrightness(event_type,**kwargs): ''' changes brightness/visibility if template or bypass flags are checked -- its poorly written/thought but i was tired''' # find the null holding the image nullNode = [x[1] for x in kwargs.items()][0] # find the image in the spare tab image = nullNode.parm('houdinipath').eval() # define color based on flags if nullNode.isBypassed(): brightness = 0.0 elif nullNode.isTemplateFlagSet(): brightness = 0.5 else: brightness = 1.0 # find the network editor = hou.ui.paneTabOfType(hou.paneTabType.NetworkEditor) # collect the images stored in it backgroundImagesDic = editor.backgroundImages() # traverse all images, find the one we have actioned and set the brightness i = 0 for item in backgroundImagesDic: if hou.expandString(item.path()) == hou.expandString(image): backgroundImagesDic[i].setBrightness(brightness) break i = i + 1 # update the visibility values editor.setBackgroundImages(backgroundImagesDic) utils.saveBackgroundImages(editor.pwd(), backgroundImagesDic) # -------------------------------------------------------------------------------------------- # MAIN # -------------------------------------------------------------------------------------------- # generate unique(ish) path for screenshot timestamp = strftime('%Y%m%d_%H%M%S', gmtime()) hipname = str(hou.getenv('HIPNAME')) hippath = str(hou.getenv('HIP')) + '/screenshots' screenshotName = hipname + '.' + timestamp + '.png' systempath = hippath + '/' + screenshotName houdinipath = '$HIP/screenshots/' + screenshotName # take screenshot with capture region createScreenshotFolder(hippath) takeScreenShot(systempath) # set up background image plane editor = hou.ui.paneTabOfType(hou.paneTabType.NetworkEditor) image = hou.NetworkImage() image.setPath(houdinipath) sel = hou.selectedNodes() nullNode = '' if sel: lastSel = sel[-1] nullNode = lastSel.parent().createNode('null','screenshot') nullNode.setInput(0,lastSel) #if lastSel.outputConnections(): # nullNode.setInput(0,lastSel) else: nullNode = editor.pwd().createNode('null','screenshot') nullNode.moveToGoodPosition() lastSel = nullNode # configure image plane placement nullNode.setUserData('nodeshape','task') nullNode.setPosition(lastSel.position()) nullNode.setColor(hou.Color(.3,.3,.3)) nullNode.move([lastSel.size()[0]*2,-lastSel.size()[1]*2]) rez = hou.imageResolution(systempath) ratio = 1.0*rez[1]/rez[0] rect = hou.BoundingRect(0,-lastSel.size()[1]*1.1,widthRatio,-widthRatio*ratio-lastSel.size()[1]*1.1) image.setRelativeToPath(nullNode.path()) image.setRect(rect) # following is adding a spare parm with image path to be able to know which node corresponds to which background image # could have used a user attribute or relativeToPath() and smarter logic but it works and it helps visualize filepath hou_parm_template_group = hou.ParmTemplateGroup() hou_parm_template = hou.LabelParmTemplate("houdinipath", "Label", column_labels=([houdinipath])) hou_parm_template.hideLabel(True) hou_parm_template_group.append(hou_parm_template) nullNode.setParmTemplateGroup(hou_parm_template_group) # attach a function that deletes the background image plane if the corresponding node is deleted (faster than doing it by hand) nullNode.addEventCallback((hou.nodeEventType.BeingDeleted,), removeBackgroundImage) # attach a function to change visibility or opacity if corresponding node flags are changed nullNode.addEventCallback((hou.nodeEventType.FlagChanged,), changeBackgroundImageBrightness) # add image to network background backgroundImagesDic = editor.backgroundImages() backgroundImagesDic = backgroundImagesDic + (image,) editor.setBackgroundImages(backgroundImagesDic) utils.saveBackgroundImages(editor.pwd(), backgroundImagesDic)
  15. Learning DOPS, motors, constraints etc

    Richard, fantastic to see all those tools in production in such a cool way.. :-)