Jump to content
Sign in to follow this  
hindukush

Arnold lights instances normal

Recommended Posts

Hi everybody,

i'm facing issues orienting Arnold lights copy to points normal.I'm actually using this .hda (https://www.artstation.com/artwork/zA3BVd)

But no chance to get orientation.I should get the point normal and convert to degrees for the light.

Can anybody point me in the right direction?

Anyone knows a better way to copy arnold lights to points?

Thank you sooo much!

Carlo

The python script that is used is :

from math import sqrt

def destroyInstance(kwargs):
    # Define Variable
    node = kwargs['node'] 
    try:
        scatterNodePath = node.parm('scatterPath').eval()
        scatterNode = hou.node(scatterNodePath)
        scatterGeo = scatterNode.geometry()
    except: 
        hou.ui.displayMessage('I can\'t find the scatter node "' + scatterNodePath + '" !')
        exit()

    scatterNodePath = node.parm('scatterPath').eval()
    scatterNode = hou.node(scatterNodePath)
    scatterGeo = scatterNode.geometry()
    instanceName = node.parm('instanceName').eval()

    # Instance Loop
    try:
        for pt in scatterGeo.points():
                nameInstance = instanceName + '_' + str(pt.number())
                instances = hou.node('/obj/' + nameInstance)
                instances.destroy()
        hou.item('/obj/networkInst').destroy()
        hou.item('/obj/networkMain').destroy()
    except: pass


def createInstance(kwargs):
    node = kwargs['node']
    
    # Define Variable
    try:
        scatterNodePath = node.parm('scatterPath').eval()
        scatterNode = hou.node(scatterNodePath)
        scatterGeo = scatterNode.geometry()
    except: 
        hou.ui.displayMessage('I can\'t find the scatter node "' + scatterNodePath + '" !')
        exit()

    try:
        instanceNodeName = node.parm('nameNode').eval()
        test = hou.node('/obj/').createNode(instanceNodeName, "test")
        test.destroy()
    except: 
        hou.ui.displayMessage('The name of node "' + instanceNodeName + '" doesn\'t exist ! ')
        exit()

    linkPosPts = node.parm('linkPosPts').eval()
    instanceName = node.parm('instanceName').eval()
    linkAttribPt = node.parm('linkAttribPt').eval().split()
    copyPtAttribValue = node.parm('copyPtAttribValue').eval().split()
    linkParmFirstInstance = node.parm('linkParmFirstInstance').eval().split()
    revertParmValue = node.parm('revertParmValue').eval().split()
    parmList = revertParmValue + linkParmFirstInstance + copyPtAttribValue +linkAttribPt
    attribList = linkAttribPt + copyPtAttribValue

    # Instance Loop
    for pt in scatterGeo.points():
        # Create Light
        nameInstance = instanceName + '_' + str(pt.number())
        try: 
            test = hou.node('/obj/' + nameInstance).name()
            networkBoxMain = hou.node('/obj/' + 'networkMain')
            instances = hou.node('/obj/' + nameInstance)
            firstRun = 0
        except:
            # Create Node
            firstRun = 1
            instances = hou.node('/obj/').createNode(instanceNodeName, nameInstance)

        #TEST
        if nameInstance == instanceName + '_0':
            for p in parmList:
                try:
                    instances.parm(p).eval()
                except: 
                    hou.ui.displayMessage('The parameter "' + p + '" doesn\'t exit !')
                    if(firstRun == 1): instances.destroy()
                    exit()
            for a in attribList:
                try:
                    pt.attribValue(a)
                except: 
                    hou.ui.displayMessage('The Attribut "' + a + '" doesn\'t exit !')
                    if(firstRun == 1): instances.destroy()
                    exit()

        # Position Light
        if linkPosPts == 1:
            instances.parm('tx').setExpression('point("' + scatterNodePath + '", ' + str(pt.number()) + ', "' + 'P' + '", 0)')
            instances.parm('ty').setExpression('point("' + scatterNodePath + '", ' + str(pt.number()) + ', "' + 'P' + '", 1)')
            instances.parm('tz').setExpression('point("' + scatterNodePath + '", ' + str(pt.number()) + ', "' + 'P' + '", 2)')
        else :
            instances.parm('tx').deleteAllKeyframes()
            instances.parm('tx').set(pt.position()[0])
            instances.parm('ty').deleteAllKeyframes()
            instances.parm('ty').set(pt.position()[1])
            instances.parm('tz').deleteAllKeyframes()
            instances.parm('tz').set(pt.position()[2])

        # Revert parm value to default value
        for rpv in revertParmValue:
            instances.parm(rpv).deleteAllKeyframes()
            instances.parm(rpv).revertToDefaults()
        
        # Copy Points Value in Paramaters
        for cap in copyPtAttribValue:
            instances.parm(cap).deleteAllKeyframes()
            instances.parm(cap).set(pt.attribValue(cap))

        # Link Points Value in Paramaters
        for lap in linkAttribPt:
            type = scatterGeo.findPointAttrib(lap).dataType()
            if str(type) == "attribData.String" :
                print(type)
                instances.parm(lap).setExpression('points("' + scatterNodePath + '", ' + str(pt.number()) + ', "' + lap + '")')
            else :
                instances.parm(lap).setExpression('point("' + scatterNodePath + '", ' + str(pt.number()) + ', "' + lap + '", 0)')
        
        if pt.number() == 0 :
            # Color Node
            instances.setColor(hou.Color((1.0, 0.72, 0)))
        else : 
            instances.setColor(hou.Color((1, 0.98, 0.67)))
            # Link Paramaters To First Instance's paramaters
            for lpfi in linkParmFirstInstance:
                instances.parm(lpfi).setExpression('chs("/obj/' + instanceName + '_0/' + lpfi + '")')

    # NetworkBox
    networkBoxMain = hou.item('/obj/networkMain')
    networkBoxInst = hou.item('/obj/networkInst')
    try: 
        if networkBoxMain.comment() == instanceName: 
            networkBoxMain.destroy(False)
    except: pass
    try: 
        if networkBoxInst.comment() == (instanceName + "_Instance"): 
            networkBoxInst.destroy(False)
    except: pass

    networkBoxMain = hou.node('/obj/').createNetworkBox('networkMain')
    networkBoxMain.setComment(instanceName)
    networkBoxMain.setColor(hou.Color((0.98, 0.78, 0.26)))
    networkBoxMain.setMinimized(1)
    networkBoxInst = hou.node('/obj/').createNetworkBox('networkInst')
    networkBoxInst.setComment(instanceName + "_Instance")
    networkBoxInst.setColor(hou.Color((1, 0.98, 0.67)))
    networkBoxInst.setMinimized(1)

    col = round(sqrt(len(scatterGeo.points())))

    for pt in scatterGeo.points():
        nameInstance = instanceName + '_' + str(pt.number())
        i = pt.number()
        node = hou.node('/obj/' + instanceName + '_' + str(i))
        if i == 0:
            node.setPosition([.2, .8])
            networkBoxMain.addItem(node)
            networkBoxMain.addNetworkBox(networkBoxInst)

        else :
            networkBoxInst.addItem(node)
            tmpPos = [i%col*3, round((col*col-i / col)-.5)]
            node.setPosition(tmpPos)

    networkBoxInst.resize([1, 1])
    networkBoxInst.setPosition([1.5, 0])
    networkBoxMain.resize([1, 1])
    tmpPos = scatterNode.parent().position()
    tmpPos[0] += 4
    networkBoxMain.setPosition(tmpPos)
    networkBoxMain.setMinimized(0)

Share this post


Link to post
Share on other sites

Maibe adding something like this?

dirx:

euler = hou.parmTuple("r").eval()
dir = hou.Vector3((0,1,0)) * hou.hmath.buildRotate(euler)
return dir[0]

diry:

euler = hou.parmTuple("r").eval()
dir = hou.Vector3((0,1,0)) * hou.hmath.buildRotate(euler)
return dir[1]

dirz:

euler = hou.parmTuple("r").eval()
dir = hou.Vector3((0,1,0)) * hou.hmath.buildRotate(euler)
return dir[2]

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×