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