Jump to content


  • Content count

  • Donations

    0.00 CAD 
  • Joined

  • Last visited

  • Days Won


jordibares last won the day on September 7

jordibares had the most liked content!

Community Reputation

90 Excellent


About jordibares

  • Rank

Contact Methods

  • Website URL
  • Skype

Personal Information

  • Name
    Jordi Bares
  • Location
  • Interests
    Too many interests
  1. The Book of Shaders in Houdini Vex

    This is a great effort, really really nicely put together as well..
  2. 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.
  3. Solaris Reveal

    Indeed, we are witnessing something that is going to revolutionise Computer Graphics and your checkmate analogy is spot on.
  4. 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.
  5. 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)
  6. Learning DOPS, motors, constraints etc

    Richard, fantastic to see all those tools in production in such a cool way.. :-)
  7. topobuild / remesh - guides or direction

    What about this? https://www.sidefx.com/tutorials/houdini-game-dev-tools-instant-meshes-bridge/ If you want to drive the direction as you indicate, then you may want to use Instant Meshes natively.
  8. New website online

    Finally after two years of full stagnation I found the energy to fully revamp it using HUGO (which is freaking cool) and update with the very latest projects. Unfortunately 2 projects I have been working I am not allowed to share (yet)… one of them was 8 months of my life so I am pretty gutted but hopefully soon will be ok to say we did it. https://jordibares.com [jordibares.com] Most of it now is Houdini of course… :-)
  9. I know a few people are using Amazing for these modern cloud based approaches and some have dared to set up their business model around it which is looking more and more interesting. My guess is that Google cloud must have such configurations and if not, they will anytime soon.
  10. Learning DOPS, motors, constraints etc

    Hi Rich... maybe Medium? Weebly? Patreon? maybe even Blogger?
  11. Learning DOPS, motors, constraints etc

    Rich, just to let you know Tumblr puts a massive data sharing wall in your website and I would dare to suggest you move your stuff somewhere else. Many of us won't be signing to Tumblr due to the privacy concerns and massive data gathering for user profiling they do. Anyway, just though you may want to know. Cheers
  12. Houdini 17 Wishlist

    What about implementing this in Houdini? would be great! http://stanford.edu/~jingweih/papers/quadriflow/quadriflow.pdf
  13. HDA - Rope Maker

    Very Generous of you, thanks so much for sharing.
  14. MOPs: Motion Graphics Operators for Houdini

    IMHO SESI needs to invest on both areas (and others as well). Houdini needs a great modeller and a great render engine that fully takes advantage of the architecture in Houdini. None of those render engines do.
  15. MOPs: Motion Graphics Operators for Houdini

    Houdini getting easier, more accessible is a matter of time, so those that feel the need to protect their jobs I would suggest to look at both ends of the spectrum, either you bring some truly serious maths and engineering skills to the party or you bring some serious good flair and taste. Don't fight gravity... you will loose.