have you tried... siOnCreateShader? i generated this event from the wizard and it seems to log a lot of relevant info. also there is siOnConnectShader
" *Question*: Can material assignment happen without this command being run? In other words, is catching this command sufficient for monitoring all the ways that a material can be assigned to an object? I'm not very experienced with using Softimage, but I know that in Maya there are a million and one ways to assign materials. " -one could change the shader graph but not the material assignment. -one could 'drag and drop' a material from the material view in the explorer on to an object. that calls 'CopyPaste()' command. i have always been on the fence whether that command is good or bad) On Fri, May 4, 2012 at 4:39 PM, Nicolas Burtnyk <nico...@redshift3d.com>wrote: > Hi list people! > > For my custom renderer, I'm trying to keep track of when materials get > assigned to objects. > This is part of an overall system which tracks changes to the scene so > that I can incrementally process only the parts of the scene that change > between renders. > > Since there is no specific event that gets fired when a material is > assigned to an object (that I know of - please correct me if I'm wrong!), > I'm trying to use *siOnEndCommand *to catch the *AssignMaterial *command. > *By the way Softimage devs: please add a OnMaterialAssigned event :)* > > I have 1 question and 1 issue: > > *Question*: Can material assignment happen without this command being > run? In other words, is catching this command sufficient for monitoring > all the ways that a material can be assigned to an object? I'm not very > experienced with using Softimage, but I know that in Maya there are a > million and one ways to assign materials. > > *Issue*: While I'm correctly receiving the ApplyMaterial command in the > siOnEndCommand callback, I'm having trouble deciphering the command > arguments. > Basically I want to know the Material that was assigned and the Object(s) > it was assigned to. Simple, right? > In the siOnEndCommand callback, I get the "Command" attribute from the > context and create a Command object from it. I then retreive the arguments > using Command::GetArguments(). The ArgumentArray always has a count of 2 > (whether I assign the material to 1 or more objects). > The second argument (ActionWhenLocalMaterialsOverlap) is irrelevant to me. > The first argument is a CValueArray that has a CRef for the Material being > assigned as its first element and some mysterious CRef as its second item. > *My issue is that I don't know what to do with this strange CRef*. > > Here is a concrete example: > > I have 2 objects and 1 material in my scene and assign the material to > both objects in a single action: > Application.AssignMaterial("Sources.Materials.DefaultLib.Material,sphere,cylinder", > "siLetLocalMaterialsOverlap") > > In the siOnEndCommand callback I get: > > Command(Context(in_ctxt).GetAttribute(L"Command")).GetArguments()[0].GetValue()returns > a CValueArray with 2 items. > > Item 0 : CValue, m_t=siRef - this is a CRef to the Material being > assigned, as expected. GetAsText() return > "Sources.Materials.DefaultLib.Material" and GetClassIDName() returns > "Material". Good to go. > > Item 1 : CValue, m_t=siRef - this is some kind of weird CRef that I don't > know how to handle. GetAsText() returns "sphere,cylinder" and > GetClassIDName() returns "Object". What do I do now? How can I get those > objects as CRefs? Do I have to tokenize the string and parse out the > object names? It's not hard, but I'd like to do something cleaner if > possible. > > Thanks!! > > -Nicolas >