I double check before suggesting it, on my side, its aware of material and
animation.
The hierarchical one is pretty awesome, since it avoids you to visit an
entire subtree. so you go pretty quickly to the dirty CRef.






2012/5/4 Nicolas Burtnyk <nico...@redshift3d.com>

> 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
>>>>>
>>>>
>>>>
>>>
>>
>

Reply via email to