Solved How to Add Multiple Redshift Pazzle Matte AOVs

Hello, everyone! Im learning python and trying to make useful stuff, but it`s hard to understand some things.

I`m writing now a simple script for Redshift users. The task is:

  1. Add individual Object ID tags to selected objects (for examle, obj1 = 1, obj2 = 2 , ...)
  2. Create Redshift Pazzle Matte AOVs (PM)

The trick is to make enough PM to be enough for each object that is selected in the scene.

1 PM AOV is equal to 3 objects in scene. For example I generated 9 Object ID tags. Every tag assign uniqe number for every object (1, 2, 3, ...). For each of them I need PMs where every channel is object in scene.

  1. How to generate multiple PMs with uniqe names and increasing numbers for my Object IDs?
  2. How to improve this code?

Thank you for your attention!

Screenshot_1.png

import c4d
import c4d.documents
from c4d import gui
import redshift
from pprint import pprint

def ob_tags():

    flags = (c4d.GETACTIVEOBJECTFLAGS_SELECTIONORDER |
             c4d.GETACTIVEOBJECTFLAGS_CHILDREN)
    selection = doc.GetActiveObjects(flags)



    if not selection:
        c4d.gui.MessageDialog("Please select objects")

    doc.StartUndo()

    for i, obId in enumerate(selection):
        tag = c4d.BaseList2D(1036222)
        tag[c4d.REDSHIFT_OBJECT_OBJECTID_OVERRIDE] = True
        tag[c4d.REDSHIFT_OBJECT_OBJECTID_ID] = i+1
        obId.InsertTag(tag)
        doc.AddUndo(c4d.UNDOTYPE_NEW, tag)

    doc.EndUndo()




def CreateAOVs(vpRS):
    
    flags = (c4d.GETACTIVEOBJECTFLAGS_SELECTIONORDER |
             c4d.GETACTIVEOBJECTFLAGS_CHILDREN)
    selection = doc.GetActiveObjects(flags)
    # 1 AOV is 3 channels, for 9 objects for example need 3 Pazzle Matte
    aovs_quantity = int(len(selection) // 3)
    
    #to be sure numbers ok in console
    print('aovs_quantity is ', aovs_quantity )
    print('objects in scene ', len(selection))




    aovs = redshift.RendererGetAOVs(vpRS)
    aov = redshift.RSAOV()
    aov.SetParameter(c4d.REDSHIFT_AOV_TYPE, c4d.REDSHIFT_AOV_TYPE_PUZZLE_MATTE)
    aov.SetParameter(c4d.REDSHIFT_AOV_ENABLED, True)
    aov.SetParameter(c4d.REDSHIFT_AOV_NAME, "My PuzzleMatte")
    aov.SetParameter(c4d.REDSHIFT_AOV_PUZZLE_MATTE_MODE, c4d.REDSHIFT_AOV_PUZZLE_MATTE_MODE_OBJECT_ID)
    #this is where channels need to assign
    aov.SetParameter(c4d.REDSHIFT_AOV_PUZZLE_MATTE_RED_ID, 1)
    aov.SetParameter(c4d.REDSHIFT_AOV_PUZZLE_MATTE_GREEN_ID,2)
    aov.SetParameter(c4d.REDSHIFT_AOV_PUZZLE_MATTE_BLUE_ID,3)
    aovs.append(aov)
    return redshift.RendererSetAOVs(vpRS, aovs)



def main():

    ob_tags()
    doc = c4d.documents.GetActiveDocument()
    renderdata = doc.GetActiveRenderData()

    flags = (c4d.GETACTIVEOBJECTFLAGS_SELECTIONORDER |
             c4d.GETACTIVEOBJECTFLAGS_CHILDREN)
    selection = doc.GetActiveObjects(flags)
    aovs_quantity = int(len(selection) // 3)



    # Get the Redshift videoPost and render settings
    vprs = redshift.FindAddVideoPost(renderdata, redshift.VPrsrenderer)
    if vprs is None:
        return

    # Switch renderer
    renderdata[c4d.RDATA_RENDERENGINE] = redshift.VPrsrenderer



    CreateAOVs(vprs)



if __name__=='__main__':
    c4d.CallCommand(13957)
    c4d.EventAdd()
    main()

hi,

if you wants to know how many AOVs you need for 10 objects you should use Ceil. After that, some math to have your ID raising by 1.

   
    numberOfAOVs = math.ceil(10 / 3.0) # will give you 4
    for i in xrange(int(numberOfAOVs)):
        print ("create aov number {}".format(i))
        for j in xrange (3):
            print ("value of field will be : {}".format(j + i * 3 ) )     

I'm not a big fan of retrieving all the objects on each function. But first, make things works, than optimize. (at least at the beginning)

Cheers,
Manuel

MAXON SDK Specialist

MAXON Registered Developer