To Guillaume: Thanks for the heads-up! Do you know of any example scripts that demonstrate this? I can't seem to assign materials to objects this way. Also I found 1 more: the ApplyShader command.
To Jo: Well I wasn't even aware of this GetEvaluationID/ GetHierarchicalEvaluationID! I will definitely take a look at this. Thanks! On Fri, May 4, 2012 at 5:46 PM, jo benayoun <jobenay...@gmail.com> wrote: > Hey Nicolas, > > I know, this is not answering directly to your issue here, but rethinking > to your problems (tracking FCurves, materials, etc) for the project you're > working, I would ask why not building a custom scene graph (something > relatively simple) where all nodes are just CRef (the encapsulated pointer > to object should stay valid) pointing to SceneObjects. A custom scene graph > would let you implement a faster visitor pattern that you could think of > using the API, which would query the GetEvaluationID and > GetHierarchicalEvaluationID (awesome to avoid to visit an entire branch - > good for perfs) methods to track which scene objects is getting dirty. You > could also register to "siOnObjectAdded" and "siOnObjectRemoved" events to > keep your custom scene graph updated and aware to the scene. The scene > graph would be built when your renderer gets initialized. Im quite sure, it > doesnt fit your needs, but maybe it could help you to get new ideas :) > > A node of your scene graph, could be as simple as: > """ > struct scenegraphnode > { > /* next sibling and children as linkedlist */ > struct scenegraphnode *siblings[2]; > /* previous dirty number */ > ulong_t prev_dirty; > /* visitor to query the node */ > void (*visit)(struct scenegraphnode *self, struct visitor v); > /* the actual ref */ > XSI::CRef ref; > }; > > """ > > Your "struct visitor" could be a struct checking the dirty count, and if > it is not equal to the previous, in charge of getting the new material, > fcurve, position, etc > and sending those new informations to your renderer. > again, just an idea ... > -jo > > > > > > > > 2012/5/4 Nicolas Burtnyk <nico...@redshift3d.com> > >> Thanks Steven! >> >> I already use siOnConnectShader (and siOnDisconnectShader) to track >> changes to the shader tree. These don't get fired as a result of assigning >> a material to an object. siOnCreateShader only gets called when you create >> a shader node and in fact partially fails at even that since it doesn't get >> called when you create a material (which creates a shader as well). >> >> Thanks for the tip on material assignment via drag & drop. Kind of a >> shame that it ends up calling CopyPaste command but it should be simple >> enough to monitor for that command as well. >> >> -Nicolas >> >> >> >> On Fri, May 4, 2012 at 4:54 PM, Steven Caron <car...@gmail.com> wrote: >> >>> 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 >>>> >>> >>> >> >