Re: Looking for artists

2013-09-23 Thread jo benayoun
PS: and it has been scientifically proved that websites using HTML tables
for non-tabular data can't be serious.

lol, that one killed me dude.





2013/9/23 Graham D Clark mailgrahamdcl...@gmail.com

 No I don't think they are based in Scottsdale thats Domainsbyproxy.com,
 maybe go down the other paths to Techstudios LLC, to Techstudios.net and
 keep if you have the time.
 Lucky to have a job right now, so I don't. Next time they'll ask you to
 answer a riddle to apply.


 Domain Name: BCVIPSTUDIO.COM
 Registrar: WILD WEST DOMAINS, LLC
 Whois Server: whois.wildwestdomains.com
 Referral URL: http://www.wildwestdomains.com
 Name Server: NS57.DOMAINCONTROL.COM
 Name Server: NS58.DOMAINCONTROL.COM
 Status: clientDeleteProhibited
 Status: clientRenewProhibited
 Status: clientTransferProhibited
 Status: clientUpdateProhibited
 Updated Date: 16-sep-2013
 Creation Date: 16-sep-2013
 Expiration Date: 16-sep-2014
  bcvipstudio.com registrar whois Updated 1 minute ago
 Domain Name: BCVIPSTUDIO.COM
 Updated Date: 2013-09-16 20:48:52
 Creation Date: 2013-09-16 20:48:52
 Registrar Expiration Date: 2014-09-16 20:48:52
 Registrar: TechStudios, llc
 Registrant Name: Registration Private
 Registrant Organization: Domains By Proxy, LLC
 Registrant Street: DomainsByProxy.com
 Registrant Street: 14747 N Northsight Blvd Suite 111, PMB 309
 Registrant City: Scottsdale
 Registrant State/Province: Arizona
 Registrant Postal Code: 85260
 Registrant Country: United States
 Admin Name: Registration Private
 Admin Organization: Domains By Proxy, LLC
 Admin Street: DomainsByProxy.com
 Admin Street: 14747 N Northsight Blvd Suite 111, PMB 309
 Admin City: Scottsdale
 Admin State/Province: Arizona
 Admin Postal Code: 85260
 Admin Country: United States
 Admin Phone: (480) 624-2599
 Admin Fax: (480) 624-2598
 Admin Email: [image: email]@domainsbyproxy.com
 Tech Name: Registration Private
 Tech Organization: Domains By Proxy, LLC
 Tech Street: DomainsByProxy.com
 Tech Street: 14747 N Northsight Blvd Suite 111, PMB 309
 Tech City: Scottsdale
 Tech State/Province: Arizona
 Tech Postal Code: 85260
 Tech Country: United States
 Tech Phone: (480) 624-2599
 Tech Fax: (480) 624-2598
 Tech Email: [image: email]@domainsbyproxy.com
 Name Server: NS57.DOMAINCONTROL.COM
 Name Server: NS58.DOMAINCONTROL.COM

 The data contained in this Registrar's Whois database,
 while believed by the registrar to be reliable, is provided as is
 with no guarantee or warranties regarding its accuracy. This information
 is provided for the sole purpose of assisting you in obtaining
 information about domain name registration records. Any use of
 this data for any other purpose is expressly forbidden without
 the prior written permission of this registrar.  By submitting an
 inquiry, you agree to these terms of usage and limitations of warranty.
 In particular, you agree not to use this data to allow, enable, or
 otherwise make possible, dissemination or collection of this data, in
 part or in its entirety, for any purpose, such as the transmission of
 unsolicited advertising and solicitations of any kind, including spam.
 You further agree not to use this data to enable high volume, automated
 or robotic electronic processes designed to collect or compile this data
 for any purpose, including mining this data for your own personal or
 commercial purposes.

 Please note: the owner of the domain name is specified in the registrant
 section.
 In most cases, the Registrar is not the owner of domain names listed in
 this database.

 Graham D Clark, Head of Stereography, Deluxe 3D dba Stereo D
 phone: why-I-stereo
 http://www.linkedin.com/in/grahamclark

 On Sep 22, 2013, at 7:16 PM, Sebastien Sterling 
 sebastien.sterl...@gmail.com wrote:

 Are you Based in Scottsdale ?


 On 23 September 2013 01:10, Guillaume Laforge 
 guillaume.laforge...@gmail.com wrote:

  The reason we decided to post a job offer in this list, is more than
 evident.

 You never said it was a job offer.




 On Sun, Sep 22, 2013 at 6:29 PM, BC Artist Pool 
 softimage.l...@bcvipstudio.com wrote:

 As Mirko said.  We are all grown ups here.

 The reason we decided to post a job offer in this list, is more than
 evident.

 We appreciate your feedback in the way we are handling our talent search.

 You believe that we are not serious because we have a page with HTML
 tables, it's ok.

 You don't like the Intrigue and Drama as you say, It is ok.

 You believe it is a scam.  Ok no problem also.

 And as we are a studio, yes, we have a limited number of seats.

 We respect your feelings, and we also respect if you don't want to send
 a simple e-mail to find out more.

 But we are not changing our strategy.  As you can see, a lot is being
 filtered out already by itself.

 People that really want more information are sending the mail, and they
 are being attended properly.

 Our main 3D core is based on Softimage and that is why we decided to
 post to this mailing list in first place, a list which we respect.


Re: Open source json camera I/O platform

2013-07-12 Thread jo benayoun
well job Gene,
I would now spent a bit of time on the code itself to make it more
flexible.  It would be great to have clear separation between plugins, core
lib and ui code imho.

@Alan, don't do that please...
http://en.wikipedia.org/wiki/Year_2038_problem


2013/7/11 Alan Fregtman alan.fregt...@gmail.com

 Minor pet peeve with how you're storing date and time as a string...
 you're missing seconds! but I think it might be more efficient to store the
 unix timestamp (seconds since epoch) instead of a fully formatted long
 string. Let the reader module handle the datetime formatting.



 On Thu, Jul 11, 2013 at 9:41 PM, Gene Crucean 
 emailgeneonthel...@gmail.com wrote:

 Update: https://bitbucket.org/crewshin/json-cam

 Output file:
 https://bitbucket.org/crewshin/json-cam/src/bae3c009d10002aa6d033036079064eda9d4d8d0/FromSoftimage.cam?at=master

 ScreenGrabs:

 https://bitbucket.org/crewshin/json-cam/src/bae3c009d10002aa6d033036079064eda9d4d8d0/Export.png?at=master

 https://bitbucket.org/crewshin/json-cam/src/bae3c009d10002aa6d033036079064eda9d4d8d0/Import.png?at=master

 Spec:
 https://bitbucket.org/crewshin/json-cam/src/bae3c009d10002aa6d033036079064eda9d4d8d0/SPEC_1.0.txt?at=master


 Thoughts so far? I should have Maya in the next day or so. Btw, feel free
 to send pull requests for tweaks if interested.


 @Jordi: Wanna give that Houdini .otl a test?



 On Thu, Jul 11, 2013 at 8:56 AM, Gene Crucean 
 emailgeneonthel...@gmail.com wrote:

 RE animatable parameters: This spec currently allows for any param to be
 animatable by just adding it to the anim dictionary. All the
 importers/exporters would have to do is simply check if any param besides
 transforms exist and add keyframes. This would be left up to the individual
 app scripts to implement, but the spec itself would allow for anything to
 be animatable.


 On Thu, Jul 11, 2013 at 1:41 AM, Michael Heberlein 
 micheberl...@gmail.com wrote:

 A bit off-topic already :) but I just found pyalembic in Gohlkes
 invaluable Windows binaries list:
 http://www.lfd.uci.edu/~gohlke/pythonlibs/#pyalembic

 But I also agree that something as simple and readable as JSON would be
 cool to have for (plotted?) world-space camera exchange. And _all_
 parameters should be animatable.

 Michael


 On Thu, Jul 11, 2013 at 6:17 AM, Raffaele Fragapane 
 raffsxsil...@googlemail.com wrote:

 The unit needs only be an arbitrary value in the header.
 Autodesk can say whatever it wants, but the truth is that if you
 change maya from imperial to metric at the beginning of a project (and you
 might have that on client's side) there will be repercussions, and if your
 cameras were intended as 1cm but get imported as 1 inch things will be out
 of whack. Majorly.

 Several parameters, especially so if this will get a further level of
 abstraction later on, are actually world scale dependent.
 The flm back can change with a unit change (in some apps it does, in
 some it doesn't), several rendering and grooming parameters change and so
 on.

 As for scale, I've had plenty instances when the camera was scaled for
 various reasons, frequently enough to be relevant entire chunks of a pipe
 would rely on a stupid-renderman-trick style scaled camera.


 On Thu, Jul 11, 2013 at 2:10 PM, Gene Crucean 
 emailgeneonthel...@gmail.com wrote:

 Thanks for the input guys! I'm ingesting all of it :)

 I'm quite against adding units into the main camera section of the
 file... but what about adding them to the metadata section? I really 
 don't
 understand why anyone would want this in the file though. Units should 
 only
 be conceptual imo. Autodesk says that 1 SI unit = 1 decimeter, but it has
 no concept of units... at all. Our current project is in meters, so
 conceptually we just know that 1 SI unit = 1 meter. Did we change 
 anything?
 Nope. Same thing in Maya... 1 unit = 1 meter. Didn't change a thing on 
 the
 Maya side either. I would love for someone to give me an example of why
 this should be different.

 Either way, I'll have an update tomorrow at some point, along with
 i/o for Houdini and updated Soft scripts. Maya is next and then 
 hopefully I
 can talk one of our Nuke dev's into banging out an importer. Unless 
 someone
 on here knows it's API and want's to donate some skills (once the 1.0 
 spec
 is finished). Same with any other apps :)

 Cheers


 On Wed, Jul 10, 2013 at 6:59 PM, Matt Lind 
 ml...@carbinestudios.comwrote:

 I started a toolset a few years ago based on XML as well.  It works
 and I can store robust data, but the downside is the file sizes are huge
 and slow to read/write.  Memory becomes an issue at some point.  If you
 only want to transfer cameras or simple stuff, it works fine, but large
 scenes with lots of animation data is not advised with XML as other 
 formats
 may be better suited.

 ** **

 Matt

 ** **

 ** **

 ** **

 ** **

 ** **

 *From:* softimage-boun...@listproc.autodesk.com [mailto:
 softimage-boun...@listproc.autodesk.com] *On 

Re: Open source json camera I/O platform

2013-07-12 Thread jo benayoun
@Alan, indeed, I usually tend to stay simple...

 datetime.datetime.now().strftime(%Y%m%d%H%M%S)
'20130711232548'

is imho acceptable as the number of bytes is constant and the format is
easy and fast to parse for the datetime implementation.
you still might find crazy stuff to pack a timestamp, though, I don't see
any direct benefits.

@Gene, I know.  I am going to have more free time this summer, I might give
a hand.



2013/7/11 Gene Crucean emailgeneonthel...@gmail.com

 Hehe... I love unixtime and use it for all kinds of stuff. The way I see
 it, if my code is still around in 2038, I did DAMN good :D

 I feel ya Jo. I'd love to abstract all this but my Python skills are weak
 at best. I'm an Obj-C guy and can't stand python to be honest. Please feel
 free to tweak it and shoot me a pull request if you feel strong enough
 about it.


 On Thu, Jul 11, 2013 at 11:15 PM, Alan Fregtman 
 alan.fregt...@gmail.comwrote:

 *Oh my...*

 So what's the ideal short-form datetime storage? A long string?



 On Fri, Jul 12, 2013 at 2:00 AM, jo benayoun jobenay...@gmail.comwrote:

 well job Gene,
 I would now spent a bit of time on the code itself to make it more
 flexible.  It would be great to have clear separation between plugins, core
 lib and ui code imho.

 @Alan, don't do that please...
 http://en.wikipedia.org/wiki/Year_2038_problem


 2013/7/11 Alan Fregtman alan.fregt...@gmail.com

 Minor pet peeve with how you're storing date and time as a string...
 you're missing seconds! but I think it might be more efficient to store the
 unix timestamp (seconds since epoch) instead of a fully formatted long
 string. Let the reader module handle the datetime formatting.



 On Thu, Jul 11, 2013 at 9:41 PM, Gene Crucean 
 emailgeneonthel...@gmail.com wrote:

 Update: https://bitbucket.org/crewshin/json-cam

 Output file:
 https://bitbucket.org/crewshin/json-cam/src/bae3c009d10002aa6d033036079064eda9d4d8d0/FromSoftimage.cam?at=master

 ScreenGrabs:

 https://bitbucket.org/crewshin/json-cam/src/bae3c009d10002aa6d033036079064eda9d4d8d0/Export.png?at=master

 https://bitbucket.org/crewshin/json-cam/src/bae3c009d10002aa6d033036079064eda9d4d8d0/Import.png?at=master

 Spec:
 https://bitbucket.org/crewshin/json-cam/src/bae3c009d10002aa6d033036079064eda9d4d8d0/SPEC_1.0.txt?at=master


 Thoughts so far? I should have Maya in the next day or so. Btw, feel
 free to send pull requests for tweaks if interested.


 @Jordi: Wanna give that Houdini .otl a test?



 On Thu, Jul 11, 2013 at 8:56 AM, Gene Crucean 
 emailgeneonthel...@gmail.com wrote:

 RE animatable parameters: This spec currently allows for any param to
 be animatable by just adding it to the anim dictionary. All the
 importers/exporters would have to do is simply check if any param besides
 transforms exist and add keyframes. This would be left up to the 
 individual
 app scripts to implement, but the spec itself would allow for anything to
 be animatable.


 On Thu, Jul 11, 2013 at 1:41 AM, Michael Heberlein 
 micheberl...@gmail.com wrote:

 A bit off-topic already :) but I just found pyalembic in Gohlkes
 invaluable Windows binaries list:
 http://www.lfd.uci.edu/~gohlke/pythonlibs/#pyalembic

 But I also agree that something as simple and readable as JSON would
 be cool to have for (plotted?) world-space camera exchange. And _all_
 parameters should be animatable.

 Michael


 On Thu, Jul 11, 2013 at 6:17 AM, Raffaele Fragapane 
 raffsxsil...@googlemail.com wrote:

 The unit needs only be an arbitrary value in the header.
 Autodesk can say whatever it wants, but the truth is that if you
 change maya from imperial to metric at the beginning of a project (and 
 you
 might have that on client's side) there will be repercussions, and if 
 your
 cameras were intended as 1cm but get imported as 1 inch things will be 
 out
 of whack. Majorly.

 Several parameters, especially so if this will get a further level
 of abstraction later on, are actually world scale dependent.
 The flm back can change with a unit change (in some apps it does,
 in some it doesn't), several rendering and grooming parameters change 
 and
 so on.

 As for scale, I've had plenty instances when the camera was scaled
 for various reasons, frequently enough to be relevant entire chunks of 
 a
 pipe would rely on a stupid-renderman-trick style scaled camera.


 On Thu, Jul 11, 2013 at 2:10 PM, Gene Crucean 
 emailgeneonthel...@gmail.com wrote:

 Thanks for the input guys! I'm ingesting all of it :)

 I'm quite against adding units into the main camera section of the
 file... but what about adding them to the metadata section? I really 
 don't
 understand why anyone would want this in the file though. Units 
 should only
 be conceptual imo. Autodesk says that 1 SI unit = 1 decimeter, but it 
 has
 no concept of units... at all. Our current project is in meters, so
 conceptually we just know that 1 SI unit = 1 meter. Did we change 
 anything?
 Nope. Same thing in Maya... 1 unit = 1 meter. Didn't change

Re: Open source json camera I/O platform

2013-07-10 Thread jo benayoun
Hey Gene,
that's a very good idea and if well developed could de facto become useful
to many studio outta here (most comes with their own because of this lack
of standard that would answer any needs).

Some rough notes though if I may:
- unit: as soon as you store transforms in a file, you want to keep track
of what units have been used (houdini, maya, etc are not using the same
scene units as units are usually set per show)
- camera rigs: cameras can be quite complex hierarchies, would be great to
have a way to describe what our camera rig is and it to be correctly
exported.
- scale: required (even if 1 is always assumed)
- double precision: do we really need to store so high precision doubles
for transforms? (having an option would be nice)
- file format: your backend should not be that tied to the exporting code
(use abstraction)... for many studios, json is not suitable and they might
prefer for legacy reasons to use others or use binary formats for
compression.
- spec version: backward compatibility reasons
- channels: allow the export of channels/extra attributes (would be
parameters in softimage)
- frame ranges: use frame ranges.  if your range is from 0 to 99, you dont
want to write an array of numbers, considering that:
10 + (90 * 2 characters) + 99 commas + ']' + '[' = 291 bytes (with no
counting whitespaces + newlines chars)
  while
'0-99x1' = 6 bytes...
- namespaces: believe me this will very quickly become a nightmare!
- ids: you always want ids... (for very quick comparison, and integrity
checks)... we can't rely on names.
- metadatas: what department produced it? for what role? has it been
published as an asset? how many cameras? etc. You usually cant guess right
what they would be, so allow your users to have a storage place where they
can store them (available in your API as a dict or whatever datastructure
for clients to manipulate them).
- ...

hope this contributes!
:)
--jonathan



2013/7/10 Jordi Bares jordiba...@gmail.com

 I really love the idea, if we can help surely that would good… Houdini
 import/export


  Jordi Bares
 jordiba...@gmail.com

 On 10 Jul 2013, at 14:54, Michael Heberlein micheberl...@gmail.com
 wrote:

 Sounds like a good idea. There are a few things I would like to add:

 I'd prefer one common class/module for file IO and all the necessary
 conversions like millimeters -- inches, focal length -- horizontal view
 angle, picture ratio -- film aperture, etc. so each application module
 can derive from this and stay as lightweight as possible.

 Another module could handle the dialogs but if they're optional, it's
 easier to integrate the importer/exporter into a scripted pipeline or
 toolbars. Plugins could just use the correct application module but be
 separate files again so people don't have to use them.

 Also, to make it not just another almost-useful tool, don't forget less
 common properties like optical center shift etc. required by stereo setups,
 for example. As you already wrote in SPEC.txt, all expected units have to
 be defined.

 Michael



 On Wed, Jul 10, 2013 at 8:53 AM, Sandy Sutherland 
 sandy.mailli...@gmail.com wrote:

  Gene - this would be of huge interest I think - every studio I have
 been at we have needed to do this, and have always fudged it - never had
 the time to even start looking at creating a tool!

 So - a big yes from me!

 S.


 On 2013/07/10 5:09 AM, Gene Crucean wrote:

  Hey folks,

  Who's in the mood for some open-source camera I/O code? I'm kind of
 getting bummed out on having to write the same camera tools at every studio
 just to get a simple, lightweight and most importantly reliable camera
 pushed around from app to app. FBX does *not* cut it, not to mention it's
 not available for all apps that could make use of it. So I thought I would
 whip up a spec based on json and offer it up open source so anyone willing
 to donate some time, could create some simple tools to import/export for
 their favorite app. The spec is VERY lightweight and doesn't include some
 things that I'm sure someone will want... but please let me know your
 thoughts.

  I already have a Softimage plugin working (consider it alpha). At this
 point it only has minor sanity checking and logic tests and I'm sure there
 are a zillion ways to improve it. But it's a start. The goal is to at least
 have plugins that all read and write the same spec from Houdini, Softimage,
 Maya, Max, Blender, Nuke... and more. I've built the Soft one using PyQt
 and it would be nice to maintain some consistency between apps, so I'm
 hopeful that the other versions could be based off of the same .ui file.

  What do you guys think? Any interest in this? I know it's a simple
 thing but I'm sure a lot of you also write these tools at studios quite a
 bit too and could possibly be into something like this.

  Check out the spec and source, and if you have time, play with the Soft
 plugin here: https://bitbucket.org/crewshin/json-cam


  If you have completely zero 

Re: Open source json camera I/O platform

2013-07-10 Thread jo benayoun
Hey Gene,
no worries, I don't take it wrong.  It is tough to compile a set of
arguments in a so short amount of time, but I'll give it a try.
So forgive me if I repeat myself or I am not enough detailled.
At the end there is always a good reason mostly driven by our own
experience, the production or the studio toolset.

I do believe like Alan said that you want to keep that simple and
lightweight, and this is with this in mind that I suggested
those additions.  I am not reasoning for your tool to become THE standard
but being enough generic and flexible for studios considering
its integration.

I will try to elaborate on some of my notes.

- units are usually in productions set per show whatever software's
defaults are, in other words, whatever go through the
  pipeline must be talked in that unit.  In real-life, nothing is that
perfect and often a third-party user (individuals, dept, software)
  tweaks the unit which lead to data-corruption and headaches for the
pipeline tds if the camera gets exported without considering this.  I
  would say most of the time this data would be there for pure debug
purpose though as your format is intended to be cross-applications
  and might even be cross-shows, you cannot force/restrict/deduce the
metrics used.  Your file might also get lost somewhere in the
  middle of the jungle, without this critical piece of informations, the
data is good for garbage.
  It happened more than once at work that data get exported with a
different unit that the pipeline was supposed to support
  by the anim dept, fucking up lighter's work for example.

- spec version, this information should be stored in the file itself, even
if you're working with version is 1.0.  Once the first cam
  file will be exported and published as an asset, the asset and file will
be sealed because of possible dependencies.  With that
  piece of informations, you will be able to make additions/extensions to
the file format without breaking existings.

- I mentioned the scale for pure flexibility, an artist/dept might be
working at a smaller scale than another, this informations is
  required to scale accordingly your camera transforms.  Actually this
should always be the case, when transforms are saved (not in a matrix
  form), the scale or globalScale should follow.  To transpose this to a
similar issue, transforms are usually baked out from the
  global space which piss off shot modelers.  The shot modeler does his job
fixing deformations, the geometry is baked out, but the rig
  is modified and so all the shapes must be done again.  Again pure
convenience and flexibility.

- concerning the camera rigs, the idea is not to track down an entire
hierarchy but being aware of that hierarchy.  Cameras are more than
  a null in a scene and even if you're willing to simplify this, you cannot
assume everybody want.  A side effect of being able to
  describe a camera rig to your library and this library to understand it
is you dont even have to code specific procedures to
  extract informations as the library will do it for you according the
description you've done of the rig.

- high-precision doubles is not necessarily something wanted to be output,
because they waste space, are expensive to compute (double semantics)
  and conversion are slow (bytes to doubles).  FYI, UltraJSON offers a
similar option.

- JSON is a huge standard for the web and maybe for some small studios but
I am not aware of a lot of studios using it in their pipeline (they
  usually prefer standards such as yaml for config files and xml for
whatever else, and when comes the need of speed, google protobuf).
Actually
  some of them ended up creating their own, as Dreamworks or R+H.  Anyway,
here I am talking about your architecture: you want to abstract the backend
  for clients to add in a highly convenient way support for the format they
have choosen.  My first thought is the support of a binary file format,
  they dont want to wait after you to add it.

- Channels are extra properties attached to a scene object (softimage
object parameters, Maya node attributes, ...)
  A lot of informations are stored in those, and other applications may
require them to properly re-build a camera from the data.
  Again, you dont know what will be their specifics (naming conv, which
ones must be ignored, etc -- it depends a lot from the
  artist/dept/studio).

- what you call tiny a file size may be not acceptable size for others.
exporting a camera with a frame range spanning 1000 frames will result
  in 2mb on disk just to store a frame range which can be specify as simply
as 1-1001x1.  Time is also spent in reading those data.
  Size is just an argument as convenience could be, this makes the data
dense and editing might be tedious as error-prone.
  We had a need once to export very dense geometries with their internal
structure.  Because our pipeline was not designed to handle
  so much density, the firt try has been a disaster resulting in easily an
hour 

Re: Python Multiprocessing in Softimage

2013-05-30 Thread jo benayoun
Hey Vincent,
multithreading is different of multiprocessing...
short long story, multithreading is about running many threads in the same
memory space (so shared memory and so use of patterns such as mutex,
semaphore,...)
while multiprocessing is about running different external processes (all
having their own memory space)...
It becomes tedious when you want to share data then across those different
processes as they don't share a common memory space, Python designers
achieve this by simply pickling the datas you want to share
(and so you have to be sure they are pickable) and saving them somewhere in
memory or on disk (where processes known where to look for).
multiprocessing is a powerful concept equivalent in theory to pipes or even
co-routines.
As Matt said, the sdk is not thread-safe, so forgetting about
multithreading is a good rule to follow, while I wouldnt even think about
multiprocessing to access scene graph components.
To boost your operator, review and be sure your code is optimized (thats
just all what it takes 90% of the cases) !  if this is still too slow, move
to Cpp...
--jon



2013/5/30 Matt Lind ml...@carbinestudios.com

 Outside of ICE, the SDK is not thread safe.

 Matt


 -Original Message-
 From: softimage-boun...@listproc.autodesk.com [mailto:
 softimage-boun...@listproc.autodesk.com] On Behalf Of Vincent Ullmann
 Sent: Thursday, May 30, 2013 3:43 PM
 To: softimage@listproc.autodesk.com
 Subject: Re: Python Multiprocessing in Softimage

 Hmm... ok, thanks

 Is it possible to write a multiThreaded CustomOperator in C++ ?
 I already build a simpler version of my ScriptedOp in C, so i might just
 make it multiThreaded ;-) But first it would be nice to know if
 Softimage could handle this


 Am 31.05.2013 00:36, schrieb Matt Lind:
  Outside of ICE, the SDK is not thread safe.
 
  Matt





Re: WWD the 3D movie

2013-05-01 Thread jo benayoun
I wasnt expecting this.  Really surprised as it looks really good, congrats
to the team for the release!
-- jo



Le mercredi 1 mai 2013, Christopher a écrit :

 The next one will make a louder dino sound, that is what it will
 differentiate it from the other 30 :)

 ::Christopher

 Andre De Angelis wrote:

 You mean to go along with his other 30? ;-)


 On Thu, May 2, 2013 at 11:47 AM, Christopher 
 christop...@thecreativesheep.ca javascript:_e({}, 'cvml',
 'christop...@thecreativesheep.ca'); wrote:

 You know your son is going to want a toy dinosaur soon, just warning you
 :)

 ::Christopher


 Andre De Angelis wrote:

 Looks stunning Raf,

 I made the mistake of watching the trailer in front of my son and now he
 has is looping.


 On Thu, May 2, 2013 at 10:39 AM, Raffaele Fragapane 
 raffsxsil...@googlemail.com javascript:_e({}, 'cvml',
 'raffsxsil...@googlemail.com'); wrote:

 Thought I'd plug it here since all rigging and animation (not to mention
 a considerable amount of topology work) is Softimage, and some familiar
 names from the list worked on it:


 http://io9.com/walking-with-dinosaurs-3d-trailer-is-simply-stunning-486248262




 --
 Andre De Angelis




 --
 Andre De Angelis




Re: Modo's Deformation (Weight Containers)

2013-04-13 Thread jo benayoun
actually, this is not really new and is quite similar to the way
envelopping is done for years in the in-house 3D package at R+H from what
I remember.  They had a complete different way to do rigging/skinning that
I was used to see in other studios.  I wouldn't be surprised, this
feature is coming from one of those big.
-- jon


Le samedi 13 avril 2013, Sebastien Sterling a écrit :

 (this may be a stupid assumption) i didn't exactly follow all the dude was
 saying, thx matt for the clarification, his examples where very abstract...
 would being able to disassociate parent hierarchy have any effect on gimble
 lock ? making it easier to evade ?


 On 13 April 2013 17:23, Marco Peixoto mpe...@gmail.com wrote:

  At first I thought that it was a simple Pose based Deformation like
 Secondary Shape Modeling, but its not. He says that Modo has now a very
 similar Weighting System that Pixar uses (he doesnt say that on the video
 but he did on the forums) and that video was to show what Hippodrome (ex
 Pixar character Modeler) will be teaching on its coming iBook Art of
 Moving Points:

 http://hippydrome.com/iBookExmpls.html






 On 13-04-2013 16:06, Christopher wrote:

 I watched the video, interesting stuff, I'd like to see a comparison
 between what was shown in the video and Softimage, specifically what I
 liked in the Modo video was the sliding skin effect.

 Christopher

   Matt Lind
  Friday, April 12, 2013 11:19 PM
   Basically the guy took 24 minutes to explain a 2 minute concept.

 The main point is Modo can define the order in which deformers are
 evaluated to solve envelope weights, and envelope weights are assigned
 using 'weight containers' which are logical assignments of points to
 deformers.  A different kind of weight map.

 The example shows an arm enveloped over 2 bones (3 joints).  In Softimage
 you'd normally place the bones into a hierarchy and assign the weights to
 the joints.  as you rotate the shoulder, the elbow and wrist would tag
 along for the ride via inheritance of the shoulder's transformation.  If
 you rotate the elbow, the shoulder is unaffected, but the wrist moves
 because it inherit's the elbow's transformation.  The point being the
 deformer has to reside in the location of the envelope deformation, and
 this can be inconvenient for thinking/viewing certain problems such as
 wanting to only rotate a deformer by a few degrees.  in the case of the
 elbow, it may already be rotated to some arbitrary angle making
 adding/subtracting a few degrees difficult to visualize.

 In Modo, the weights were assigned to the individual bones via 'weight
 containers' (their version of a weight map), but the bones were not placed
 into a hiearchy.  they were scattered about wherever was convenient.  This
 allowed the artist to work with the deformations in the local space of the
 deformer so if he wanted to say, limit envelope deformations to rotations
 of 10 degrees or less, the artist could easily see a 10 degree rotation and
 work with the deformer weights.  think of it as compensation mode for
 vertices of an envelope.  You apply the envelope to the defomers, but


compose-unknown-contact.jpg

Re: SI 2014 sneak peek

2013-02-28 Thread jo benayoun
I am still amazed by seeing what big studios with a few software developers
can produce as amazing technologies in a year and what is released every
year for 3d packages by AD...
I can clearly say that the status of technologies last time I checked were
ten times more exciting (in rigging, lighting, compositing, ... fields)
than what we get this year...
What is released to public don't really show what new technologies in this
industry are and in-use in studios...
Though, the quality is there and the product is pleasant to play with!
-- jon






2013/2/28 Michal Doniec doni...@gmail.com

 And the animatic part counts for about 1% of the work for most studios

 There are many studios which use Softimage for games, especially in Japan,
 I don't have exact numbers, but I would risk saying that majority of
 Softimage seats are used to create games, not adverts or film. This sort of
 workflow is definitely not 1% of the work and is very important for in game
 cinematics.


 On 28 February 2013 06:36, Stefan Andersson sander...@gmail.com wrote:

 ok this was probably the dumbest sneak preview to date. I can't
 comment on the 3dsmax preview as I don't use 3dsmax

 *Maya*: Great, but there already is a grease pencil plugin (free) out
 there. Though it's nice that it now comes out of the box.
 Added value: None

 *Softimage: *A good addition, but not really something amazing. And I've
 seen it in action before. And the animatic part counts for about 1% of the
 work for most studios, I see it handy for the pre-viz studios. For me it's
 rather pointless as we have fixed shots to begin with.

 I'm sure there are other improvements, but as a sneak preview (which is
 supposed to get you excited) this was pretty dumb.


 be safe
 stefan




 On Wed, Feb 27, 2013 at 11:08 PM, Ahmidou Lyazidi 
 ahmidou@gmail.comwrote:

 http://area.autodesk.com/blogs/shawn/sneak-peek-time


 Ahmidou Lyazidi
 Director | TD | CG artist
 http://vimeo.com/ahmidou/videos




 --
 *Stefan Andersson | Digital Janitor*
 blog http://sanders3d.wordpress.com | showreelhttp://vimeo.com/sanders3d|
 twitter http://twitter.com/sanders3d | 
 LinkedInhttp://www.linkedin.com/in/sanders3d| cell:
 +46-73-6268850 | skype:sanders3d





 --
 --
 Michal
 http://uk.linkedin.com/in/mdoniec



Re: fastest way through script to get all parameters in a scene of certain value?

2013-02-28 Thread jo benayoun
Hey Enoch,
unless I missed something, the way you're doing is already the fastest on
my machine...


for reference:

# INFO : tag operation1 (tag): 2.13486326588
# INFO : tag operation2 (tag+): 18.2174550721
# INFO : tag operation3 (OM): 18.2086833524
# INFO : get operation1 (tagparams): 0.452397979784 4204
# INFO : get operation2 (xsicoll): 7.46562998296 4204


import time
from win32com.client import constants
class Softimage:
__getattr__ = lambda x, a: getattr(Application, a, False) or
getattr(constants, a)
softimage = Softimage()
softimage.factory = XSIFactory
softimage.message = lambda x, *args:
softimage.LogMessage(str(x).format(*args))
softimage.SetUserPref(SCR_CMDLOG_ENABLED, False)
items = softimage.ActiveSceneRoot.FindChildren2()


t = time.clock()
parameters = [{0}.visibility.viewvis.format(x) for x in items]
softimage.Tag(parameters, softimage.siTag1)
softimage.message(tag operation1 (tag): {0}, time.clock() - t)

t = time.clock()
for item in items:
softimage.Tag(item.FullName + '.visibility.viewvis', softimage.siTag1)
softimage.message(tag operation2 (tag+): {0}, time.clock() - t)

t = time.clock()
tag1 = softimage.siTag1
parameters = (x.Properties(visibility).Parameters(viewvis) for x in
items)
for parameter in parameters:
parameter.Tags |= tag1
softimage.message(tag operation3 (OM): {0}, time.clock() - t)

t = time.clock()
params = softimage.ActiveSceneRoot.TaggedParameters(softimage.siTag1)
softimage.message(get operation1 (tagparams): {0} {1}, time.clock() - t,
params.Count)

t = time.clock()
parameters = softimage.factory.CreateObject(XSI.Collection)
parameters.SetAsText(*.visibility.viewvis)
parameters = [x for x in parameters if x.Tags  softimage.siTag1]
softimage.message(get operation2 (xsicoll): {0} {1}, time.clock() - t,
len(parameters))

parameters = (x.Properties(visibility).Parameters(viewvis) for x in
items)
for param in parameters:
param.Tags = ~softimage.siTag1







2013/2/28 Matt Lind ml...@carbinestudios.com

 Retrieving the value is the same.  If you use the object model you’ll have
 direct access to the parameter whether it’s the tag or the value.  Just
 switch “oParameter.Tags” with “oParameter.value” in my example and you have
 your answer.

 ** **

 If you’re looking to retrieve a specific value, or parameters with a
 common value, then you have no choice but to loop through all of them and
 do comparisons to find what you’re looking for.  In your case using the
 other notation with wildcards is only useful if you’re setting a set of
 parameters to a common value.

 ** **

 ** **

 Matt

 ** **

 ** **

 *From:* softimage-boun...@listproc.autodesk.com [mailto:
 softimage-boun...@listproc.autodesk.com] *On Behalf Of *Enoch Ihde
 *Sent:* Thursday, February 28, 2013 10:00 AM

 *To:* softimage
 *Subject:* Re: fastest way through script to get all parameters in a
 scene of certain value?

 ** **

 sorry, i wasn't really clear.  i'm aware the tagging bit was slow, i
 couldn't be bothered to tag it object modelwise.

 i'm referring only to the value retrieval of the parameter.  not the setup
 time.

 

 again:
 # INFO : 0.788785183814 seconds --- accessing 3618 parameters's values by
 tag

 # INFO : 2.12563553863 seconds  --- accesssing 3618 parameters's values
 by GetPropertyFromName2(propertyname).Parameters(paramname)

 # INFO : 7.84713397563  accessing 3618 parameter's values by
 Property(propertyname).Parameters(paramname)

 tagging is by far the fastest, but in imo, is unacceptably slow.
 compare that to a method such as IsSelected(), getting a report on a large
 number of objects is negligible. 

 ** **

 ** **

 On Wed, Feb 27, 2013 at 10:29 PM, Matt Lind ml...@carbinestudios.com
 wrote:

 The slowness is coming from using the Tag() command.  Try using the object
 model to cut out the middle man:

  

 // Jscript

 main();

  

 function main()

 {

 var oItems = ActiveSceneRoot.FindChildren2();

 

 LogMessage( oItems.Count );

 

 for ( var i = oItems.Count - 1; i = 0; i--) {

 

 var oItem   = oItems(i);

 var oParameter  = oItem.Properties(
 Visibility ).Parameters( viewvis );

 oParameter.Tags = siTagNone;

 }

 

 return;

 }

  

  

 If the parameters you are attempting to modify have a large degree of
 consistency in name and location, you can use some of Softimage’s wildcards
 to find them faster:

  

 var oParameters = XSIFactory.CreateActiveXObject( “XSI.Collection” );

 oParameters.Unique = true;

  

 // Get viewvis and rendvis parameters of the visibility
 property on each X3DObject

 oParameters.items = 

Re: fastest way through script to get all parameters in a scene of certain value?

2013-02-28 Thread jo benayoun
I suspect it to be the runtime dispatching and attribute access (dictionary
lookups) cost...
Tho the Tag command allow us to pass a collection instead of giving
sequentially items, this resulting in a great improvement.
-- jon




2013/2/28 Matt Lind ml...@carbinestudios.com

 Interesting how much choice of language affects performance. 

 ** **

 In your tests the Object model has the same runtime as calling commands.
 On my computer using Jscript, the object model is at least 4x faster than
 calling Tag() command.  

 ** **

 ** **

 Matt

 ** **

 ** **

 ** **

 ** **

 *From:* softimage-boun...@listproc.autodesk.com [mailto:
 softimage-boun...@listproc.autodesk.com] *On Behalf Of *jo benayoun
 *Sent:* Thursday, February 28, 2013 2:49 PM
 *To:* softimage@listproc.autodesk.com

 *Subject:* Re: fastest way through script to get all parameters in a
 scene of certain value?

 ** **

 Hey Enoch,

 unless I missed something, the way you're doing is already the fastest on
 my machine...

 ** **

 ** **

 for reference:

 ** **

 # INFO : tag operation1 (tag): 2.13486326588

 # INFO : tag operation2 (tag+): 18.2174550721

 # INFO : tag operation3 (OM): 18.2086833524

 # INFO : get operation1 (tagparams): 0.452397979784 4204

 # INFO : get operation2 (xsicoll): 7.46562998296 4204

 ** **

 ** **

 import time

 from win32com.client import constants

 class Softimage:

 __getattr__ = lambda x, a: getattr(Application, a, False) or
 getattr(constants, a)

 softimage = Softimage()

 softimage.factory = XSIFactory

 softimage.message = lambda x, *args:
 softimage.LogMessage(str(x).format(*args))

 softimage.SetUserPref(SCR_CMDLOG_ENABLED, False)

 items = softimage.ActiveSceneRoot.FindChildren2()

 ** **

 ** **

 t = time.clock()

 parameters = [{0}.visibility.viewvis.format(x) for x in items]

 softimage.Tag(parameters, softimage.siTag1)

 softimage.message(tag operation1 (tag): {0}, time.clock() - t)

 ** **

 t = time.clock()

 for item in items:

 softimage.Tag(item.FullName + '.visibility.viewvis', softimage.siTag1)
 

 softimage.message(tag operation2 (tag+): {0}, time.clock() - t)

 ** **

 t = time.clock()

 tag1 = softimage.siTag1

 parameters = (x.Properties(visibility).Parameters(viewvis) for x in
 items)

 for parameter in parameters:

 parameter.Tags |= tag1

 softimage.message(tag operation3 (OM): {0}, time.clock() - t)

 ** **

 t = time.clock()

 params = softimage.ActiveSceneRoot.TaggedParameters(softimage.siTag1)

 softimage.message(get operation1 (tagparams): {0} {1}, time.clock() - t,
 params.Count)

 ** **

 t = time.clock()

 parameters = softimage.factory.CreateObject(XSI.Collection)

 parameters.SetAsText(*.visibility.viewvis)

 parameters = [x for x in parameters if x.Tags  softimage.siTag1]

 softimage.message(get operation2 (xsicoll): {0} {1}, time.clock() - t,
 len(parameters))

 ** **

 parameters = (x.Properties(visibility).Parameters(viewvis) for x in
 items)

 for param in parameters:

 param.Tags = ~softimage.siTag1

 ** **

 ** **

 ** **

 ** **

 ** **

 ** **

 2013/2/28 Matt Lind ml...@carbinestudios.com

 Retrieving the value is the same.  If you use the object model you’ll have
 direct access to the parameter whether it’s the tag or the value.  Just
 switch “oParameter.Tags” with “oParameter.value” in my example and you have
 your answer.

  

 If you’re looking to retrieve a specific value, or parameters with a
 common value, then you have no choice but to loop through all of them and
 do comparisons to find what you’re looking for.  In your case using the
 other notation with wildcards is only useful if you’re setting a set of
 parameters to a common value.

  

  

 Matt

  

  

 *From:* softimage-boun...@listproc.autodesk.com [mailto:
 softimage-boun...@listproc.autodesk.com] *On Behalf Of *Enoch Ihde
 *Sent:* Thursday, February 28, 2013 10:00 AM


 *To:* softimage
 *Subject:* Re: fastest way through script to get all parameters in a
 scene of certain value?

  

 sorry, i wasn't really clear.  i'm aware the tagging bit was slow, i
 couldn't be bothered to tag it object modelwise.

 i'm referring only to the value retrieval of the parameter.  not the setup
 time.

 again:
 # INFO : 0.788785183814 seconds --- accessing 3618 parameters's values by
 tag

 # INFO : 2.12563553863 seconds  --- accesssing 3618 parameters's values
 by GetPropertyFromName2(propertyname).Parameters(paramname)

 # INFO : 7.84713397563  accessing 3618 parameter's values by
 Property(propertyname).Parameters(paramname)

 tagging is by far the fastest, but in imo, is unacceptably slow.
 compare that to a method such as IsSelected(), getting a report on a large
 number of objects is negligible. 

  

  

 On Wed, Feb 27, 2013 at 10:29

Re: Sublime definitions for Softimage

2013-01-31 Thread jo benayoun
IDEs provide code completion and code analysis by actually having a backend
specific to the language the editor is set to.  Thats actually one of the
main difference between a text editor (sublime) and an IDE (eclipse).  The
editor does not just consider the text as a suite of words but as a
language and so understand what you write.

To implement such thing, you will need basically to do the job of the
python engine (minus compilation/interpreter step).  Meaning, use an ast
generator and write python specifics.

The actual parser generator used internally by the CPython implementation
is exposed in the std library under the name pgen2 (do a grep for seeing
its usage).  Because this is just a parser generator, you will need then a
way to get and manipulate the ast the parser will generate for ya.
fortunately, there is a bunch of modules that provide exactly what you need
(ast, keyword, ...) that let you go further in the code exploration.
(pgen2 and parser/ast/keyword/... are two separate things with two
different usages, dont mix them up)

Thats about python, for the softimage libraries, you're on the right way :)
--jon






2013/1/31 Alan Fregtman alan.fregt...@gmail.com

 I've generated autocompletions, but it seems (and kinda makes sense) that
 I cannot really know what class someone is coding for to show the methods
 filtered by that class alone, so in its current state I will autocomplete
 both global commands AND all methods. That said, for methods I put [blabla
 class] after them so you know which one it's for. I still think it's
 useful, but I wish it could be better.

 Anyone have any bright ideas for somehow knowing what class someone is
 coding for? (...because Sublime won't load Softimage's Python environment
 to actually know what is what, what with the dynamic dispatching and all.)

 By the way, once you tab to choose one, I autocomplete all the arguments
 as a snippet and you can tab through the named arguments to write your
 own variables or delete them.




 On Wed, Jan 30, 2013 at 10:56 PM, Alan Fregtman 
 alan.fregt...@gmail.comwrote:

 Okay... Getting somewhere!

 import sysimport os.pathfrom win32com.client import makepy

 tlbs = 
 ['/path/to/Softimage_2013_SP1/Application/bin/Converter.tlb','/path/to/Softimage_2013_SP1/Application/bin/LightRig.tlb','/path/to/Softimage_2013_SP1/Application/bin/XSIDial.tlb','/path/to/Softimage_2013_SP1/Application/bin/dotXSI_ie.tlb','/path/to/Softimage_2013_SP1/Application/bin/dsauto.tlb','/path/to/Softimage_2013_SP1/Application/bin/enums.tlb','/path/to/Softimage_2013_SP1/Application/bin/ophelper.tlb','/path/to/Softimage_2013_SP1/Application/bin/si3dobjectmodel.tlb','/path/to/Softimage_2013_SP1/Application/bin/si3dobjectmodel10.tlb','/path/to/Softimage_2013_SP1/Application/bin/siobjectmodel.tlb','/path/to/Softimage_2013_SP1/Application/bin/xsiutils.tlb']
 for path in tlbs:
 baseFolder = r'/path/somewhere/to/save/pyfiles/'
 sys.argv = [makepy, -o, %s/%s.py % (baseFolder, 
 os.path.basename(path).split('.')[0]), path]
 makepy.main()


 This gets me some files I can introspect for methods and such.



 On Wed, Jan 30, 2013 at 10:20 PM, Alan Fregtman 
 alan.fregt...@gmail.comwrote:

 Reviving this old thread out of interest...

 So, with that sample code, we can introspect predefined global objects
 like Application and XSIUtils. That's cool, but for example, another object
 type like... Parameter that's a class but I can't create it. I can't
 do win32com.client.Dispatch(Parameter) and
 XSIFactory.CreateObject(Parameter) won't work either.

 Is there any way I can somehow create the object on the fly, knowing its
 class type, some other way so that I can query its methods and properties?


 ps: Raff, could you elaborate how you AL guys got your introspection
 going for non-predefined globals?



 On Fri, Jan 4, 2013 at 6:15 AM, Andy Nicholas a...@andynicholas.comwrote:

  You guys should check this out. It might give you a good start...


 http://xsisupport.com/2012/10/06/saturday-snippet-getting-a-list-of-properties-and-methods-with-python-introspection/



 On 04 January 2013 at 00:54 jo benayoun jobenay...@gmail.com wrote:


  The Softimage API (object model) is not visible because its all about
 dynamic
  dispatching at runtime.  This is like thinking your editor will be
 natively
  enough smart to detect attributes you would add dynamically when
 overriding
  the __getattr__ method of a class.
   Happily for us the dispatching is cached somewhere and even
 introspectable by
  using the pythoncom/pywin32 API.  With a little effort and sticking
 with
  python, one would have no problem in developing a plugin for this
 text editor
  specially if sublime API is as convenient as it is claimed.  The
 first step is
  to learn how to use correctly the pywin32 package and what it does
 under the
  hood to fully understand what the 'ultimate' solution could be.
   --jo
 
 
 
 
 
   2013/1/3 César Sáez cesa...@gmail.com mailto:cesa...@gmail.com

Re: building asset tools

2013-01-27 Thread jo benayoun
hey Stefan
I would say, the most important is to make the right difference between the
asset and the file on disk.
The asset is just a concept, often just an entry in whatever storage unit
you choose with metadatas and bind to a file on disk.
So to keep things simple, why not considering your asset as a zip archive
on disk, in which you may use different file formats to store datas
depending on the type of the asset and the
application it's most often used in.  Bundled with the archive, add it a
json/xml/whatever file used to store the metadatas (creator, ctime,
asset-type, ...)
It becomes easy then when an asset is wanted to retrieve the adequat file
(if exists) or run a converter (if needed).   This allows you to keep
application-specific file formats while not having trade-offs on their
re-use in others by abstracting.  Your asset manager don't know about the
files but only about assets.
Dont bother with file formats but make your asset manager enough solid to
handle whatever is used underneath to store datas.
--jon




2013/1/27 Stefan Andersson sander...@gmail.com

 Hello everyone,

 I'm building a set of tools for a asset manager for Softimage. I've had it
 working in Maya for a while, but I'm now converting it and re-writing it to
 fit Softimage. I'm quite tempted to use Collada as it's a xml format and
 pretty easy to work with. But I would like to hear what everyone else is
 using? I *need* to be able to export it as collada or fbx for the model
 assets so that it can be imported into other applications. The Rig/Sim
 assets will be native emdl as they are only going to be used in softimage
 (though I have my issues there too...).

 A few things my exporter is doing are

 * exporting MatLib with all materials
 * exporting ColladaXML
 * exporting/converting images to exr (via OIIO)
 * parse MatLib and fix the filepaths for the textures (pointing at asset
 location)


 Big plus for using Collada
 * will work with most applications
 * can be used in Softimage as Reference
 * xml based

 Big plus for FBX
 * will work with most applications

 Big Minus for FBX
 * can NOT be used in Softimage as Reference
 * not a xml format (need to make your own parser)

 Big Minus for dotXSI
 * tends to crash other applications when importing dotXSI

 Big Minus for emdl
 * binary, impossible to edit

 So all of the above points towards Collada, but what do you guys think?
 Any takers?

 regards
 stefan


 --
 *Stefan Andersson | Digital Janitor*
 blog http://sanders3d.wordpress.com | showreelhttp://vimeo.com/sanders3d|
 twitter http://twitter.com/sanders3d | 
 LinkedInhttp://www.linkedin.com/in/sanders3d| cell: +46-73-6268850 | 
 skype:sanders3d





Re: Get enum array items

2013-01-04 Thread jo benayoun
looks like Eric is already preparing the 2013 contest by creating new
threads that he solves himself! nice try Eric but no ...
:P
--jon






2013/1/4 Eric Thivierge ethivie...@gmail.com

 Scratch that.

 oItem = PPG.Item(myItemName)
 lUIItems = oItem.UIItems

 
 Eric Thivierge
 http://www.ethivierge.com


 On Fri, Jan 4, 2013 at 4:38 PM, Eric Thivierge ethivie...@gmail.comwrote:

 Need to get the array items of an enum control in a PPG. I thought I saw
 a thread a while back with that but can't seem to find it... any help?

 
 Eric Thivierge
 http://www.ethivierge.com





Re: Sublime definitions for Softimage

2013-01-03 Thread jo benayoun
The Softimage API (object model) is not visible because its all about
dynamic dispatching at runtime.  This is like thinking your editor will be
natively enough smart to detect attributes you would add dynamically when
overriding the __getattr__ method of a class.
Happily for us the dispatching is cached somewhere and even introspectable
by using the pythoncom/pywin32 API.  With a little effort and sticking with
python, one would have no problem in developing a plugin for this text
editor specially if sublime API is as convenient as it is claimed.  The
first step is to learn how to use correctly the pywin32 package and what it
does under the hood to fully understand what the 'ultimate' solution could
be.
--jo





2013/1/3 César Sáez cesa...@gmail.com

 You're right, sublime/any-other-editor can't see that softimage variables.
 If you're using 'Application' (or any 'implicit variable' like that) your
 script will fail on import, sipyutils module (or your own version of it) is
 the way to go IMHO.


 On Thu, Jan 3, 2013 at 9:18 PM, Alan Fregtman alan.fregt...@gmail.comwrote:

 But it won't be able to find global XSI objects just like that, right?
 Application is defined by the axscript module, but I feel like SI
 internally dispatches it in a way I don't think Sublime could see it.



 On Thu, Jan 3, 2013 at 1:40 PM, César Sáez cesa...@gmail.com wrote:

 You have to add your environment paths to the 'env' tag in your
 python.sublime-build config file, this way if you have a shortcuts module
 it will instrospect it.
 El 03/01/2013 17:34, Gene Crucean emailgeneonthel...@gmail.com
 escribió:

  Hehe I was trying to figure out the same thing.


 On Thu, Jan 3, 2013 at 8:09 AM, Alan Fregtman 
 alan.fregt...@gmail.comwrote:

 I use SublimeCodeIntel too but it's not aware of XSI globals like
 Application, XSIUtils and so on, so it won't introspect them.

 How would one hack it to be more aware of such?



 On Wed, Jan 2, 2013 at 9:19 PM, César Sáez cesa...@gmail.com wrote:

 SublimeCodeIntel does a great job autocompleting python modules and
 import statements (via introspoction, works with your own modules too),
 it's not softimage specific but helps alot.

 Another cool package is the SublimeLinter, it highlight potential
 errors in your code (IDE-like). I have no idea how far I was from PEP8
 until I start using it, now my code is way cleaner and easy to the eyes 
 :)


 On Thu, Jan 3, 2013 at 12:22 AM, Raffaele Fragapane 
 raffsxsil...@googlemail.com wrote:

 You actually can introspect recursively almost the entirety of the
 scripting API and generate a dummy set of libraries from there. That 
 will
 offer autocompletion in most IDEs.

 We've had that running here in AL for a while thanks to Aloys'
 efforts a long time ago and it's worked without a hitch for years.


 On Thu, Jan 3, 2013 at 10:18 AM, Gene Crucean 
 emailgeneonthel...@gmail.com wrote:

 It would be completely bitchin if it autocompleted the entire
 sdk... and not just simple commonly used snippets.






 --
 Gene Crucean - Emmy winning - Oscar nominated VFX Supervisor / iOS-OSX
 Developer / Filmmaker / Photographer
 ** *Freelance for hire* **
 www.genecrucean.com

 ~~ Please use my website's contact form on www.genecrucean.com for any
 personal emails. Thanks. I may not get them at this address. ~~






Re: Softimage Picker

2012-11-22 Thread jo benayoun
hey david,
you shouldn't need to update your widgets every time the user has changed
its selection (completely behind steve on that one) but everytime focus has
changed back to your widget.
overload QWidget::enterEvent or QWidget::focusInEvent and update your
highlight buttons when the widget is under the cursor.
your developer could also have a look to the tool sdk, both are compatible
and you could end up with something nice (custom manipulater + synoptic).
-- jo





2012/11/21 Steven Caron car...@gmail.com

 this is a good example. combined with a few other good reasons i would
 probably implement an event, but if this were the only good reason i would
 still avoid doing it with an event. as i said in my email to david, if
 performance were to be an issue, i would highlight the controls in the gui
 once the cursor enters the application.

 there are a few things in softimage that make me paranoid and selection
 events is one of them. i remember a plugin that was installed at blur a
 long time ago that did an on selection change script that was the culprit
 for some serious lag for the animators.

 i also imagine one might want to keep open multiple character guis and i
 can see this getting out of hand. but its still worth some investigation.

 s


 On Wed, Nov 21, 2012 at 3:56 PM, Raffaele Fragapane 
 raffsxsil...@googlemail.com wrote:

 Bi-Directionality is actually quite important.
 A lot of people want to do part of a selection in the viewport quickly,
 and then add a few missing, or easier to retrieve, bits clicking around in
 the character pane.

 Doing it with events isn't a huge drag, it only kicks in at selection
 time in the viewport, and it's most likely done with a monitor job in Maya,
 which tends to have comparable lag, so if people find it ok in one they
 will most likely be fine with the other's.


 On Thu, Nov 22, 2012 at 9:52 AM, Steven Caron car...@gmail.com wrote:

 ya, it might be slow.

 i dont see an advantage to the bi-directionality feature, anyone care to
 give me a good example?

 s





Re: Overlapping UV (Scripting)

2012-11-01 Thread jo benayoun
Hey Martin,
I am afraid that the software is not aware of this concept assuming this is
only revealed when drawing into the texture editor viewport.  You can still
deduce it by scripting.  what about this:
  - get the texture projection elements
  - create a bitmap matching the uv space (minmax u for columns, minmax v
for rows, using a precision number to calculate the stepping)
  - iterate over the samples coordinates using their rounded (using the
precision number) u and v values as indices of the bitmap
  - if the bit is already positive, it means the sample is overlapping
  - from the samples, retrieve the geometry components
its should be quite efficient (compared to some bbox collision systems) and
straightforward in python to write.
-- jo






Le mercredi 31 octobre 2012, Martin a écrit :

 Hi list,

 Overlapping UVs aren't good for baking textures, so we need to check if
 the UVs are overlapping in any way and fix them.

 We are doing it manually right now. I mean, if the UV plane turns red, it
 is overlapping. It's quite simple, but really tedious when you have
 thousands of UV samples and lots of scenes and objects to check.

 Is it possible to make this task faster and more accurate?

 Any ideas?

 Thanks

 M.Yara



Re: SDK: When *exactly* does XSIUnloadPlugin get called

2012-10-26 Thread jo benayoun
I guess the plugin is loaded once for discovering and registration (plugin
manager), and then reloaded for getting the actual features (actual
extension of features).
Usually, plugin systems use a specification file for each new plugin (xml
or other) that is in charge of describing (description, name, version,
author, ...) and register items (commands, windows, ...) plus the actual
plugin where the Load and Unload functions are only called once.  Wouldnt
be great to have something similar for XSI ?

-- jo





2012/10/26 Luc-Eric Rousseau luceri...@gmail.com

 sounds like if you put some code in the constructor of a global
 variable, then you'd be called twice per xsi session, since your dll
 will be loaded and unloaded twice?

 On Fri, Oct 26, 2012 at 9:34 AM, Marc-Andre Belzile
 marc-andre.belz...@autodesk.com wrote:
  Sorry for not being clear enough. When a plugin is loaded at startup or
 through LoadPlugin, all plugin items are registered through XSILoadPlugin
 and then the dll is unloaded by XSI *without* calling XSIUnloadPlugin.
 Anything allocated in the current dll process will be zapped by the OS at
 this point. The plugin dll will be loaded back again when one of the
 registered plugin item is required by XSI, and in this case XSILoadPlugin
 *won't* be called again. So if you allocated objects or resources in the
 plugin dll process through XSILoadPlugin, they will not be available when
 the dll is loaded back.
 
  -mab




Re: combobox

2012-10-26 Thread jo benayoun
hey Gareth,
if I remember correctly and in the case where the multi-selection flag is
not on, you can do something like this:

 values = ['red', 'orange', 'blue']
 formatted = list()
 [formatted.extend(x) for x in enumerate(values)]
['red', 0, 'orange', 1, 'blue', 2]
 values[listbox.Value]

no ?
-- jo



2012/10/26 Peter Agg peter@googlemail.com

 I usually just do a quick python type thing:

 selected = box.Value
 boxList = box.UIItems
 boxList[ boxList.index(selected) - 1 ]

 That's presuming that each Label and Value entry are unique, of course.


 Pete



 On 26 October 2012 14:56, Gareth Bell gareth.b...@primefocusworld.comwrote:

  Afternoon all,

 ** **

 So a combobox is derived from two values - the Label and the Value e.g. *
 ***

 ** **

 box = [Label1, Value1, Label2, Value2]

 ** **

 Say I've selected Label1

 ** **

 by using GetValue (box) the value it returns will be Value1

 ** **

 Is it possible to get the label as a return value other than setting the
 value to the same as the label?

 ** **





Re: SDK: When *exactly* does XSIUnloadPlugin get called

2012-10-26 Thread jo benayoun
You mean like the .spdl and .preset formats?

nope at all, I mean like a specification file.  plugins specifications are
usually little xml/json files where all informations relative to the plugin
are written (what you do with the PluginRegistrar::Put* calls).  This has
mainly two big advantages which are:
  - the shared library itself (plugin) has no need to be loaded to be
discovered and exposed to the audience of what it is about and what does it
do.
  - In the case of complex plugin systems, to declare dependencies to other
plugins for the plugin manager to resolve them before loading the actual
plugins.
This is something powerful and flexible where some systems are like
Softimage or Maya more traditional in the way they ask for an handle,
keeping it in memory and whatever happens, they don't really care.
Spdl s have a different meaning (description language used to declare and
define multiple things) as are presets (data storage).
-- jo






2012/10/26 Nicolas Burtnyk nico...@redshift3d.com

 Yep cached.  That explains it.


 On Fri, Oct 26, 2012 at 4:37 PM, Kamen Lilov kamen.li...@chaosgroup.com
 wrote:
  On 10/26/2012 7:52 PM, Nicolas Burtnyk wrote:
 
  I'm confused.  I just tested this and global variable constructors
  only get called once in my plugin (on 2012 SP1).
 
  Nicolas, is your plugin DLL marked as 'cached'?
 
  Because I double-checked the mechanism explained by Marc-Andre, turns out
  he's right (not surprisingly - he's the SDK lead after all ;) ) BUT -
 this
  all applies only to external plugins not marked as cached. Cached ones
 -
  which happens to be the default - are LoadLibrary-ied just once, and
  FreeLibrary-ied just once (unless ofcourse you select Reload)
 
 



Re: Qt Wrapper command log issue

2012-10-24 Thread jo benayoun
The different API usages have already been mentioned there for reference:
https://groups.google.com/forum/m/?fromgroups#!topic/xsi_list/1HqDKBMspyE

Pyside shouldnt have the same problem tho because of their design choices.
http://qt.gitorious.org/pyside/pseps/blobs/3cb0883a01206033b8c549815bed9f9e388129b8/psep-0101.txt

I would be curious Tony to know if the same problem occurs using the
official dist of pyqt from riverbank?  Your code should run and actually do.
If this is working when you're assigning the layout to a variable before
adding it to the main layout and you're only notice this crash's happening
with pyside and the case where youre nesting the return value into the
addLayout function call, I would think first to a bug from the binding
(python memory model managment can be thought to deal with and can easily
crash any software).  Please, let us know how this is going.
 -- jo





Le mercredi 24 octobre 2012, Raffaele Fragapane a écrit :

 This is Spring, actually. You'll know it's summer this year when inline
 skating will feel like stilt walking because the asphalt is practically
 fluid.

 On Thu, Oct 25, 2012 at 1:22 PM, Eric Thivierge ethivie...@gmail.comwrote:

 Its nice! Clear blue skies with a high of 80F / 32C. Got to love summer!


 
 Eric Thivierge
 http://www.ethivierge.com


 On Thu, Oct 25, 2012 at 11:49 AM, Tim Crowson 
 tim.crow...@magneticdreams.com wrote:

  I keep forgetting what a time difference there is. How does the future
 look?
 -Tim




 --
 Our users will know fear and cower before our software! Ship it! Ship it
 and let them flee like the dogs they are!




Re: PyQtForSoftimage: QFileDialog

2012-10-19 Thread jo benayoun
Hey Cesar,
there is no limitations nor bugs, its just softimage is setting new
controls to use its style and qt lets do.  Use this and you should be safe.

 void  
SuspendWin32ControlsHookhttp://download.autodesk.com/global/docs/softimage2013/en_us/sdkguide/si_cpp/classXSI_1_1Desktop.html#a93ffc147515c5cfbbe7d8f0b9d2aab4f
 () void  
RestoreWin32ControlsHookhttp://download.autodesk.com/global/docs/softimage2013/en_us/sdkguide/si_cpp/classXSI_1_1Desktop.html#a890a0a0469659022bb54a1a10d8e108f
 ()

-- jo



2012/10/18 César Sáez cesa...@gmail.com



 On Fri, Oct 19, 2012 at 7:26 AM, César Sáez cesa...@gmail.com wrote:

 Hi list,
 I'm starting to use PyQtForSoftimage and I'm having some issues with a
 QFileDialog, it works but the dialog get mixed with the softimage ones.
 Is there any way to make it work properly? Has something to do with *
 modal* dialog limitations? Just a known issue?

 I'm just calling a QFileDialog.getOpenFileName in a button signal.

 Thanks!





Re: Qt Wrapper command log issue

2012-10-16 Thread jo benayoun
hey Tony,
welcome aboard.  I did not find any explicit message that would match what
you get (I quickly grep the source code, this would deserve much more
investigations).
As you're the first one to report this kind of problem, and as you have
compiled pyside, Ive emitted the idea that it could be one of the qt source
numerous debug messages because of a debug flag accidentally turned on for
compilation.  Even if I wish, I can't really help on that one, I miss time
because of the job and my other commitments but feel free to use my email
anytime ...
 For completeness, the code in cpp you can find in the plugin has been put
there to show the way I did my personal qt integration when people were
asking how ... Ive always warned and repeated about the fact that this is
what it is, a demo code ... Ive been just too busy (or maybe lazy) to
release the complete thing I guess.  besides, I've not worked that much
with pyside in softimage, mainly because when I wrote the code, pyside
wasnt even in beta and studios are still committed to riverbank ... but
considering the only major difference between pyqt and pyside is the vendor
and the binding generator, this doesn't change anything on its usage with
the plugin nor with the way I used to integrate qt into proprietary
softwares ...
 -- jo




2012/10/16 Tony Barbieri great...@gmail.com

 Hey Steven,

 I just joined the list this morning so I could join in the conversation.
  Do you happen to know if Jo found that in the actual Qt source code or in
 PySide?

 I compiled both debug and release but compiled PySide against the release
 .dlls.

 Thanks!

 -tony

 so, you guys are compiling it yourself... maybe with debug mode on? jo
 just grep'd the qt code base and found debug message with caught in it


 On Mon, Oct 15, 2012 at 4:54 PM, Steven Caron car...@gmail.com wrote:

 oh nice!


 On Mon, Oct 15, 2012 at 4:46 PM, Bradley Gabe witha...@gmail.com wrote:

 Tony said he didn't have to do any work to get PySide going. He just
 compiled the latest version...


 --
 -tony



Re: etRenamer 3.0, now with PyQt version

2012-10-16 Thread jo benayoun
regular expressions are clearly a must have ... you clearly see their power
when switching to linux.
because when you have a dude who called you to his desk to say Hey that
cmd gives me an error like what the *bip* has no subscriptions to the *bip*
but in the *bip* it turns out it has ...
well, you don't have the time to go back at your desk, launch your
favourite python editor (OR sublime-text) and write a beautiful python tool
to parse the output from one custom cmd to use it as input for another one,
repeated 10 times and handling special cases, but you clearly have the time
to open a shell and use your best buddies: Pipe, Sed, Awk and XArgs, to
finally ending with a freaking 10 lines long command. and voilà ... the
*bip* has now the right subscriptions to the *bip*...!

=)
*bip*: f**king NDA ...
**: fucking decency...
-- jo




2012/10/16 Alok Gandhi alok.gandhi2...@gmail.com

 We use regex in some pipeline tools for softimage  but that is all coming
 from python 're' module. Personally I have used regex to do some screen
 scraping off webpages for some personal projects. But for that all
 Beautiful Soup is a great package for python.

 ** **

 ** **

 *From:* softimage-boun...@listproc.autodesk.com [mailto:
 softimage-boun...@listproc.autodesk.com] *On Behalf Of *Eric Turman

 *Sent:* Tuesday, October 16, 2012 6:30 PM
 *To:* softimage@listproc.autodesk.com
 *Subject:* Re: etRenamer 3.0, now with PyQt version

 ** **

 nice..I like that one since it has community examples. Thanks for sharing.
 

 On Tue, Oct 16, 2012 at 8:25 PM, Chris Gardner chrisg.dot@gmail.com
 wrote:

 I use this one online: http://gskinner.com/RegExr/

 get it right in realtime before you stuff it into code.

 cheers,
 chrisg



 On 17 October 2012 12:21, Eric Turman i.anima...@gmail.com wrote:
  This is a really handy tools to nail that regex just right.
  http://download.cnet.com/The-Regex-Coach/3000-2056_4-10795049.html




 --




 -=T=-




 --




Re: the goon kickstarter.

2012-10-12 Thread jo benayoun
FYI, if you guys get this funded and need some help rigging you know who
to call.

thanks dude for referencing me, I appreciate.  =D



2012/10/12 Eric Thivierge ethivie...@gmail.com

 FYI, if you guys get this funded and need some help rigging you know who
 to call.



Re: Raafal

2012-10-10 Thread jo benayoun
wait a sec, a framework written in purebasic, based on open techs with a
Softimage UI ... the headlines sound cool but ...
if Guy is planning developing a framework that will be used to build a 3d
software like what he has in mind, I would hear more about how he is
thinking the architecture than the UI which is really not the key concept
of a framework ...
PureBasic, really ? why making that choice when your project will use and
be open source ... it is closing a lot of doors here ...
Is there any roadmaps for the future months ?

Anyways, still good to hear about new projects and I wish him success and
courage =)
-- jo










2012/10/10 Jeff McFall jeff.mcf...@sas.com

  Heck yeah!

 ** **

 *From:* softimage-boun...@listproc.autodesk.com [mailto:
 softimage-boun...@listproc.autodesk.com] *On Behalf Of *Alan Fregtman
 *Sent:* Wednesday, October 10, 2012 2:05 PM
 *To:* softimage@listproc.autodesk.com
 *Subject:* Re: Raafal

 ** **

 Via Google Translate:

 *Hello, I am announcing the creation of the project raafal.

 This is an application framework 3d, free, open source and cross-platform
 for professional use and an alternative to blender. internal code will be
 inspired concepts Blender and use of open-source libraries Pixar, ILM,
 Disney, Sony, etc. .. but with an interface and ergonomic blender
 completely different, closer to that of SOFTIMAGE | XSI.

 The framework and the UI will be fully coded in PureBasic (but probably
 much more than that.) No precipitation however, I realize that this is a
 project spanning several years see decades. This project was born after
 years of frustration at the behavior of some companies developing dcc tools
 such as Autodesk. Experts PureBasic 3d experts and developers are welcome.

 This project is sponsored by my company, radfac. I worked as R  D Manager
 and as Technical Director 3d for over 15 years. The site will be hosted at:
 http://www.raafal.org Several mailing lists are already in place:
 http://raafal.org/mailman/listinfo

 Thank you for your attention. Sincerely, Guy.*


 On Wed, Oct 10, 2012 at 1:58 PM, Greg Punchatz g...@janimation.com
 wrote:
  Based on a few comments on this list and reading the fine print, it looks
  like Guy Rabiller is making a fabric engine type dev platform but
  instead he is going open source. Look forward to both of these projects
  bringing us truly next generation tools.
  
  Greg Punchatz
  Sr. Creative Director
  Janimation
  214.823.7760
  www.janimation.com
  On 10/10/2012 11:40 AM, benjamin malartre wrote:
 
  Hello list, a message from the future:
 
  http://raafal.org/fr/
 
 
 



Re: OT - Python Question: how to get the Handle (Windows) for a specific application?

2012-07-29 Thread jo benayoun
Hey Tim,
there is many ways to bring back a window to the foreground, and the way
you're going is one of them.  In any cases, you will need the window handle
to manipulate the right window.
There is many ways to retrieve this handle, start looking thru the Fusion
SDK, if they are not exposing it or just use the win32 api and its
convenient functions to enumerate the windows and find the one you're
interested in. You have btw to be sure you have the handle of the parent
window of the application.
I remember having posted times ago some examples related to the Qt
integration in xsi which could fit your needs.
=)
-- Jo




2012/7/29 Tim Crowson tim.crow...@magneticdreams.com

  Somewhat OT here...  I've been Googling for half an hour without much
 luck...

 I have a tool which contains a button that either launches a program (in
 this case Fusion), or brings it to the foreground if it's already running.
 Launching it if it's not already running is trivial, but I can't quite
 figure out how to bring it to the foreground (and take focus away from
 XSI). I know it's bad manners to steal focus, but in this case it kinda
 makes sense (plus it's been requested).

 As far as I can tell, I can use win32gui.BringWindowToTop() to bring
 Fusion to the foreground, but I need to pass the program's handle to it.
 Can anyone shed some light on how to go about getting said handle?

 Or, if you have a suggestion for switching app focus from Soft to Fusion
 (via a button, not Alt-tab!), I'm all ears. Thanks for any and all
 assistance!

 --



 *Tim Crowson
 **Lead CG Artist*

 *Magnetic Dreams Animation Studio, Inc.
 *2525 Lebanon Pike, Building C. Nashville, TN 37214
 *Ph*  615.885.6801 | *Fax*  615.889.4768 | www.magneticdreams.com
 tim.crow...@magneticdreams.com





Re: get all the expressions driven by a parameter

2012-07-27 Thread jo benayoun
Hey Jeremie,
Here is what I am coming with on a character with thousands of expressions:
# method 1 took 5.42011094882 and find 3 expressions.
# method 2 took 2.31037755754 and find 3 expressions.
# method 3 took 5.41616293425 and find 3 expressions.
I would recommend you to take a look at a paradigm that is called
Data-Oriented Design and which is specially considered to avoid CPU usage
and fast computation.
Let me know if this fit your needs :)
-- Jo




import time


SI_EXPRESSION_ID = 49


def Jerems( param ):
 allExpressions = Application.FindObjects(None,
{12723EB2-7DDB-11D0-A57F-00A0C91412DE})
 result = []
 for exp in allExpressions:
if exp.OutputPorts.Count:
   for port in exp.InputPorts:
   if port.Target2.IsEqualTo(param):
result.append(exp)
break
 return result


def exprs_from_parameters(parameters):
if type(parameters) not in (list, tuple):
parameters = (parameters, )

res = list()
parameters = [p for p in parameters if p is not None]
nparameters = len(parameters)
if nparameters == 0:
return res

expressions = Application.FindObjects2(SI_EXPRESSION_ID)

res = [list() for i in xrange(nparameters)]
for exp in expressions:
sources = [iport.Target2 for iport in exp.InputPorts]
for i in xrange(nparameters):
b = [src.IsEqualTo(parameters[i]) for src in sources]
if any(b):
res[i].append(exp)
return tuple(res)


def Aloks(param):
PARAM_EXPR_DICT = {}
for expr in Application.FindObjects(None,
{12723EB2-7DDB-11D0-A57F-00A0C91412DE}):
ports = expr.InputPorts
if not ports.Count:
continue
for port in ports:
paramName = port.Target2.FullName
if not PARAM_EXPR_DICT.has_key(paramName):
PARAM_EXPR_DICT[paramName] = []
PARAM_EXPR_DICT[paramName].append(expr)
return PARAM_EXPR_DICT[param.FullName] if
PARAM_EXPR_DICT.has_key(param.Name) else None



msg = method {0} took {1} and find {2} expressions.


def timethat1():
ppg = Application.Selection(0)
res = []
t = time.clock()
for param in ppg.Parameters:
res.append(Jerems(param))
t = time.clock() - t
print msg.format(1, t, sum([len(r) for r in res]))


def timethat2():
ppg = Application.Selection(0)
t = time.clock()
res = exprs_from_parameters(tuple(ppg.Parameters))
t = time.clock() - t
print msg.format(2, t, sum([len(r) for r in res]))


def timethat3():
ppg = Application.Selection(0)
res = []
t = time.clock()
for param in ppg.Parameters:
res.append(Aloks(param))
t = time.clock() - t
print msg.format(3, t, sum([len(r) for r in res]))



timethat1()
timethat2()
timethat3()






















2012/7/27 Jeremie Passerin gerem@gmail.com

 Thanks Matt !

 Interesting solution Alok, my issue is not the 2sec that it takes to
 perform the seach but that I am looping on this method about 20 times... so
 it makes sense to try something like that ! I'll give it a try right now !


 On 27 July 2012 15:54, Alok alok.gan...@modusfx.com wrote:

  Maybe globally store the expressions with their params in a hash
 (dictionary in Python) and then do the reverse look up. Will not run
 faster but will save you time for each call to
 getExpressionsDrivenByParameter()

 In this case:
 PARAM_EXPR_DICT = {}
 for expr in Application.FindObjects(None,
 {12723EB2-7DDB-11D0-A57F-00A0C91412DE}):
 ports = expr.InputPorts
 if not ports.Count:
 continue
 for port in in ports :
 paramName = port.Target2.FullName
 if not PARAM_EXPR_DICT.has_key(paramName):
 PARAM_EXPR_DICT[paramName] = []
 PARAM_EXPR_DICT[paramName].append(expr)


 Then you can test it for parameter simply by:
 def getExpressionsDrivenByParameter( param ):
 return (PARAM_EXPR_DICT[param.FullName] if
 PARAM_EXPR_DICT.has_key(param.Name) else None)




 Alok.

  On 27/07/2012 5:44 PM, Jeremie Passerin wrote:

 Hi guys,

  I was wondering what is your technique to get all the expressions
 driven by a parameter.
 I'm trying to find the fastest way to do it.
 here is my code :

  def getExpressionsDrivenByParameter( param ):

  allExpressions = xsi.FindObjects(None,
 {12723EB2-7DDB-11D0-A57F-00A0C91412DE})
   result = []
  for exp in allExpressions:
  for port in exp.InputPorts:
  if port.Target2.IsEqualTo(param) and exp.OutputPorts.Count:
  result.append(exp)
  break
   return result

  With around 5000 expressions in my scene it takes about 2sec to get the
 result. Anyone got a faster solution ?

  cheers,
 Jeremie

 No virus found in this message.
 Checked by AVG - www.avg.com
 Version: 2012.0.2197 / Virus Database: 2437/5158 - Release Date: 07/27/12






Re: Shed Pose Library

2012-07-23 Thread jo benayoun
Hey Miquel,
looks terrific! thanks for sharing this with us!
-- jo




Le lundi 23 juillet 2012, Miquel Campos a écrit :

 Hello Softimage fellas,

 At shed we did some tools for the animators and one of them is
 shed_poseLib a Pose manager to help speed up the animation process. The
 tool stores the poses in XML format and allows to exchange it between
 characters(or any model with rig) and projects.

 The repositories are user base so we can exchange the poses from one user
 to other.

 For more information and download the tool :
 http://www.akaosaru.com/p/tools.html


 I would like to thanks Sly, Ph, Renaud and Shed team to allow me to
 release this tool. I hope it is useful for many animators :P


 Cheers,
 Miquel

 
 
 Miquel Campos
 *Character  Animation TD*

 Working at: www.shedmtl.com
 Personal web: www.akaosaru.com
 
 




Re: Inherit from a Softimage class

2012-07-15 Thread jo benayoun
Hey Chris,
I assume you're referring to that part:
you're able to inherit some classes of the C++ API [..]  and create a
python binding to it using the Python API.

There is no magic.  Once you've inherited the desired class in cpp (in
which the CBase is part of the inheritance tree), write your extension
using the CPython API.  To provide a smoother inter-operability between
both, I rely on the pythoncom lib and the XSI::ConvertObject function.

I'm not going to implement a complete subclass (too lazy on a sunday), but
here is a sample that should show you the basic idea.  Note that
I omitted any security code for brevity.  For other folks, don't use that
in a production-context, it deserves much more love.
*First link of the list here. http://www.jobenayoun.com/*

There could be some drawbacks depending on what is your usage as well as
major differences between the two interfaces (C++ vs COM).  This is far
from being *perfect* nor *elegant*, but still, I consider this mechanism
valid for specific needs.
I would stay on my first suggestion for Jeremie tho, which is to wrap the
desired class directly in python as it's also the way recommended by Mark
Hammond himself according his book (he refers to it as the *delegate*
pattern).

=)
-- Jo






2012/7/12 Chris Chia chris.c...@autodesk.com

 Will be interesting to see how u would implement that... Do share when you
 have something ;)

 Chris

 On 13 Jul, 2012, at 6:57 AM, Jeremie Passerin gerem@gmail.com
 mailto:gerem@gmail.com wrote:

 Thanks Jo,

 That was more a thinking I had rather than a real intention to do it...
 I'm looking for different way to organize my code. Thanks for the advice !

 On 11 July 2012 12:10, jo benayoun jobenay...@gmail.commailto:
 jobenay...@gmail.com wrote:
 Hey Jeremie,
 considering the COM architecture (interfaces inheritance) + the python
 binding (dynamically invoking), this is really a bad idea to even think to
 inheritance...  The most easiest and elegant way that I think of is to wrap
 the desired object into a class.
 On another hand, you're able to inherit some classes of the C++ API (even
 if its not recommended and limited) and create a python binding to it using
 the Python API.  Not even sure, you will get what you're looking for.
 =(
 -- Jo







 2012/7/10 Jeremie Passerin gerem@gmail.commailto:gerem@gmail.com
 
 Hi list,

 I'm pretty sure I know the answer to that one but just wondering.
 Do we have a way in Python to create a class that inherits from a class of
 the softimage SDK ?

 Let's say I want to extend the SIVector3 or the Null object ?

 Any chance I could do something like that  ?

 class mySIVector3( SIVector3 )
 or
 class myCustomNull( Null )


 Jeremie





Re: Inherit from a Softimage class

2012-07-11 Thread jo benayoun
Hey Jeremie,
considering the COM architecture (interfaces inheritance) + the python
binding (dynamically invoking), this is really a bad idea to even think to
inheritance...  The most easiest and elegant way that I think of is to wrap
the desired object into a class.
On another hand, you're able to inherit some classes of the C++ API (even
if its not recommended and limited) and create a python binding to it using
the Python API.  Not even sure, you will get what you're looking for.
=(
-- Jo






2012/7/10 Jeremie Passerin gerem@gmail.com

 Hi list,

 I'm pretty sure I know the answer to that one but just wondering.
 Do we have a way in Python to create a class that inherits from a class of
 the softimage SDK ?

 Let's say I want to extend the SIVector3 or the Null object ?

 Any chance I could do something like that  ?

 class mySIVector3( SIVector3 )
 or
 class myCustomNull( Null )


 Jeremie



Re: Getting the bounding box for a subcomponentcollection?

2012-07-09 Thread jo benayoun
for completeness...
-- Jo


def get_bbox_pos(obj):
pos = [0, 0, 0]
res = Application.GetBBox(obj)
xmin, ymin, zmin, xmax, ymax, zmax = res
x = (xmin + xmax) * 0.5
y = (ymin + ymax) * 0.5
z = (zmin + zmax) * 0.5
return (x, y, z)


def marker_at_center(comp):
pos = get_bbox_pos(comp)

parent = comp.SubComponent.Parent3DObject
basename = parent.Name
if len(basename)  3 and basename[3] == _:
basename = basename[4:]

nil =parent.Model.AddNull(MARKER_ + basename)
kine = nil.Kinematics.Global
kine.posx = pos[0]
kine.posy = pos[1]
kine.posz = pos[2]

nil.shadow_icon = 4
nil.shadow_scaleX = 0.5
nil.shadow_scaleY = 0.5
nil.shadow_scaleZ = 0.5

return None


def do_it():
selection = Application.Selection
if selection.Count  0:
comp = selection(0)
marker_at_center(comp)
return None


do_it()



2012/7/9 Vincent Ullmann vincent.ullm...@googlemail.com

 For the Center i did a little Script some time ago
 Sadly it only works when the Object got no Transformations on it.
 Also these RotationStuff may be incorrect

 To get a BoundingBox, you could try to modify this, so that it keeps the
 lowest/highest X/Y/Z-Component and Outputs them
 (See the CustomICE-Node-Example Get BoundingBox, thats exactly the thing
 i would do in jScript to get a BoundingBox)



 // Get Selection

 var oSel = selection(0);

 var oSelCtr = Sel_Center(oSel);
  var vVecX = oSelCtr[0];
  var vVecY = oSelCtr[1];
 var vVecZ = oSelCtr[2];
  var vRotX = oSelCtr[3];
 var vRotY = oSelCtr[4];
  var vRotZ = oSelCtr[5];


 // 
 // Get Selection Center

 function Sel_Center(oSel)
 {
 var vAllVerts = 0;
  var vPosX = 0; var vPosY = 0; var vPosZ = 0;
  var vNrmX = 0; var vNrmY = 0; var vNrmZ = 0;

 var oSelType = oSel.Type;
 switch (oSelType)
 {
  // If Poly or Edge
 case polySubComponent:
 case edgeSubComponent:
  var vSubCompCount = oSel.SubComponent.ComponentCollection.Count;
 for (i=0; ivSubCompCount; i++)
  {
 var vVertCount =
 oSel.SubComponent.ComponentCollection.Item(i).Vertices.Count;
  for (j=0; jvVertCount; j++)
 {
 var vAllVerts = vAllVerts + 1;
  var vPosX = vPosX +
 oSel.SubComponent.ComponentCollection.Item(i).Vertices(j).Position.x;
  var vPosY = vPosY +
 oSel.SubComponent.ComponentCollection.Item(i).Vertices(j).Position.y;
  var vPosZ = vPosZ +
 oSel.SubComponent.ComponentCollection.Item(i).Vertices(j).Position.z;
  var vNrmX = vNrmX +
 oSel.SubComponent.ComponentCollection.Item(i).Vertices(j).Normal.x;
  var vNrmY = vNrmY +
 oSel.SubComponent.ComponentCollection.Item(i).Vertices(j).Normal.y;
  var vNrmZ = vNrmZ +
 oSel.SubComponent.ComponentCollection.Item(i).Vertices(j).Normal.z;
  } // for j End
 } // for i End
 break; // Case End

 // If Vertex
 case pntSubComponent:
 var vAllVerts = oSel.SubComponent.ComponentCollection.Count;
  for (i=0; ivAllVerts; i++)
 {
 var vPosX = vPosX +
 oSel.SubComponent.ComponentCollection.Item(i).Position.x;
  var vPosY = vPosY +
 oSel.SubComponent.ComponentCollection.Item(i).Position.y;
  var vPosZ = vPosZ +
 oSel.SubComponent.ComponentCollection.Item(i).Position.z;
  var vNrmX = vNrmX +
 oSel.SubComponent.ComponentCollection.Item(i).Normal.x;
  var vNrmY = vNrmY +
 oSel.SubComponent.ComponentCollection.Item(i).Normal.y;
  var vNrmZ = vNrmZ +
 oSel.SubComponent.ComponentCollection.Item(i).Normal.z;
  } // for i End
 break;
  //If Selection =/= Poly/Vertex/Edge
 default:
 var vAllVerts = 1;
  } //Switch End

 //Convert Normal-Direction to Rotation
  var vecWorldX = XSIMath.CreateVector3(); vecWorldX.Set (1,0,0);
  var vecWorldY = XSIMath.CreateVector3(); vecWorldY.Set (0,1,0);
  var vecWorldZ = XSIMath.CreateVector3(); vecWorldZ.Set (0,0,1);

 var vecNrmX = XSIMath.CreateVector3(); vecNrmX.Set ( vNrmX/vAllVerts,
 vNrmY/vAllVerts, vNrmZ/vAllVerts);
  var vecNrmY = XSIMath.CreateVector3(); vecNrmY.Set ( 0, vNrmY/vAllVerts,
 vNrmZ/vAllVerts);
  var vecNrmZ = XSIMath.CreateVector3(); vecNrmZ.Set ( 0, 0,
 vNrmZ/vAllVerts);
  var vRotX = vecNrmX.Dot (vecWorldX);
  var vRotY = vecNrmY.Dot (vecWorldY);
  var vRotZ = vecNrmZ.Dot (vecWorldZ);

 LogMessage (Position: X:  + vPosX/vAllVerts +  / Y:  + vPosY/vAllVerts
 +  / Z:  + vPosZ/vAllVerts);
  LogMessage (Rotation: X:  + vRotX +  / Y:  + vRotY +  / Z:  +
 vRotZ);
 return [vPosX/vAllVerts, vPosY/vAllVerts, vPosZ/vAllVerts, vRotX, vRotY,
 vRotZ]
 }
 // 



Re: XSI Import troubles

2012-06-07 Thread jo benayoun
No need of plugins Eric, when coding on Notepad, you know you have to be
aware of everything and can't trust anything. That makes your code looking *
sublime*, smarter and more professional ! :D

-- Jo


2012/6/7 Eric Thivierge ethivie...@gmail.com

 Notepad might have a plugin for all of that...

 
 Eric Thivierge
 http://www.ethivierge.com



Re: Scripting Development with an external IDE

2012-05-31 Thread jo benayoun
Sublime has this shiny side I don't like and do definitively less than an
emacs or cie, its the perfect tool to develop snippets and little tools tho
...
What a good IDE should have:
  - a good code editor
  - an awesome project manager
  - an amazing debugger
  - a without-effort integrated build environment
IMHO, Sublime fails on the last 3 points.
When is coming the time to develop serious stuff and packages in python, no
doubts, Eclipse is the only valid choice to me !
I guess, the most important is just you feel comfortable with your choice
and super-productive ... I find often myself more confortable to write in
the notepad app than in a code editor ...

- jo






2012/5/31 Dan Yargici danyarg...@gmail.com

 Thanks Alan, I'm sold!

 I was using Komodo, however I just do the odd script here and there so
 this suits my needs better I think.  It's great that it's available on
 Linux also.


 On Thu, May 31, 2012 at 2:34 AM, Alan Fregtman alan.fregt...@gmail.comwrote:

 Screencast.com cut me off for eating the free monthly limit of 2GB, lol.

 Just put the video on my blog thanks to Vimeo:
 http://darkvertex.com/wp/2012/05/30/i-love-sublimetext2/


 On Tue, May 29, 2012 at 9:58 PM, Alan Fregtman 
 alan.fregt...@gmail.comwrote:

 Recorded a little video running down through some Sublime features:
 http://www.screencast.com/t/0KEX9gW0

 My apologies for uhms, ehhs and ocassional ranting. This is what happens
 when you record straight ahead. :p


 By the way, while it is a commercial product, you can try it out for as
 long as you wish with all features; it just nags once every so many file
 saves. Go try! http://www.sublimetext.com/2


 On Tue, May 29, 2012 at 12:04 PM, Alan Fregtman alan.fregt...@gmail.com
  wrote:

 It's good for everyone, projects big or small. The multi-select tricks
 in particular are like pure witchcraft.

 I'll make a video capture showing some of the cool stuff later when I
 get home.

 On Tue, May 29, 2012 at 11:56 AM, Gustavo Eggert Boehs 
 gustav...@gmail.com wrote:

 what is so good about it?
 will it help me on my very narrow PY developments, or is it only good
 for thousands of lines type of work?








Re: PyQtForSoftimage vs Blur-dev

2012-05-08 Thread jo benayoun
Hey Ana,

I'm agreed with you about how softimage events are managed for now is not
the best way to go ...
Ideally, we should have QEvent subclasses for Softimage events and one and
unique method with the following signature
SoftimageWidget::softimageEvent(QEvent *event) to handle them (and fit
the Qt design, events are not signals) and a method to register to them.
There is also lot of other additions to think about to get everything's
working fine.
But as you guess, Steve or me have jobs and personal projects on the way
which make our free time precious.
As I told you, any additions or examples are welcomed to be commit to the
github repo and would be greatly appreciated by Steve or me.
In a wonderful world, it would be awesome if more people were jumping on Qt
to let developers and artists having the same experience on the different
platforms and 3d packages ...
Thanks to have done that jump :)

-jo





2012/5/8 Ana Gomez agomezalca...@gmail.com

 Hello again!

 My concern was if some features have been lost in the process of exposing
 the pyqt implementation from the Blur tools. Or if someone has had problems
 by using this plugin.

 You told me that people is using it, more or less, without problem so I'm
 going to keep testing it. I don't really want to install the Blur tools
 just for PyQt. I don't need its rest of tools, nor the wrappers for the
 rest of softwares.

 I see that Steven has just made a new example that uses a ui file in
 response to the last issue. Thanks and thanks for pointing me the issue, I
 hadn't read it.

 On the other hand, I've rewritten some of the code in order to control the
 XSI events because I don't like the idea of having unecessary active
 events. I read that Steven doesn't like this idea (last comments in Issue
 #1) but if you like, i'll give you the changes (well, I haven't invented
 the wheel).

 :)







Re: PyQt For Softimage

2012-05-07 Thread jo benayoun
Hi Enrique,

You can still (as suggested by Stefan) subscribe to the siOnValueChanged
which will give you back a reference to the parameter to retrieve its new
value.
A good option would be to implement a custom engine.
You can imagine a mechanism implemented in your main SynopticWidget which
will be responsible to catch the xsi parameters bound to your sliders
(acting like a mapping).
For convenience, you should also implement a custom slider widget ala
softimage reproducing the main signals/slots of the existing QSlider.
Then a good API to bind/add a slider to a xsi parameter could be something
like mysynoptic.addSlider(mysiobject.kine.posx), behind the scenes
everything would be handled by your custom synoptic 
If you're worried by the performances especially with python, you still
have the option to implement everything in cplusplus which should be faster
in communicating with qt widgets and create a command to add xsi parameters
to
you synoptic. Considering the type of the parameter (string, float,
whatever), your engine would be capable of install and bind the right
widget.

xsiparameters
   |
  handle by (siOnValueChanged)
   |
SynopticWidget    contains and bind to xsi parameters 
SynopticSlider
   contains and bind to xsi parameters 
SynopticController (why not to recreate a facial panel, its just 2d
graphics ...)
   contains and bind to xsi parameters 



-jo








2012/5/7 Stefan Kubicek s...@tidbit-images.com

 I'm just diving into it as well, but the way I'd do it is to implement a
 siOnTimeChange event
 that either calls a function in your UI (or menu) to update it's
 parameters, or, if you want the UI
 to respond to value changes happening without the time slider being moved
 (somebody changes a parameter
 through scripting or the normal Softimage interface) you probably have to
 implement an onValueChanged event.
 How sophistivated this event is (whether it checks for what values
 actually have changed and whether the Qt
 UI has to be upated or not, or whether it just stupidly calls the Update
 QT UI function every time) comes down
 to performance. Keep it simple first and optimize if required.

 Would love to hear more ideas on this as well.



  Just bringing this thread back to life.

  We are getting more into using PYQT here and I am looking into completely
 replacing synoptics and use PYQT instead.

 I was hoping somebody could help me figure out how to get information from
 XSI sent to PYQT currently everything that I have done has been the
 opposite, where PYQT drives something, but does very little evaluation of
 the scene.

 An example would be.

 When a characters facial animation is animated, and the time slider
 scrubs,
 I will need the PYQT slider that drives that facial animation to detect
 the
 value change in XSI and show its new value in the menu.

 Currently I don't really know how to do that, as the example SignalSlot
 function that comes with this implementation only covers something with a
 registered event.

 Do I need to create onValueChanged events for every value on the rig?

 any help would be awesome, I'm pretty new to PYQT still.

 thanks,
  Enrique

 On Wed, Feb 29, 2012 at 3:29 PM, Enrique Caballero 
 enriquecaball...@gmail.com wrote:

  For those of us using linux, is there an out of box PYQT implementation
 such as this that we can use?



 On Thu, Dec 8, 2011 at 6:45 AM, Alok Gandhi alok.gandhi2...@gmail.com*
 *wrote:

  Oh ok, thanks for the info Steven.


 On Wed, Dec 7, 2011 at 5:24 PM, Steven Caron car...@gmail.com wrote:

  well for your reference, i am using Alan Jones' cmake softimage module.
 it automates a lot of the process for creating softimage plugins with
 cmake. it can be found in the src\CMake\Modules folder. its very handy
 :)

 s


 On Wed, Dec 7, 2011 at 2:21 PM, Alok Gandhi alok.gandhi2...@gmail.com
 **wrote:

  Yep that works too, I knew that it did not need shader lib for sure,
 but was not sure, so I set the path anyways.


 On Wed, Dec 7, 2011 at 2:08 PM, Steven Caron car...@gmail.com
 wrote:

  well it doesn't need that actually, let the entry in the cmake gui
 stay red. just hit generate... does this work for you?



 --





 --






 --
 --**-
 Stefan Kubicek   Co-founder
 --**-
  keyvis digital imagery
 Wehrgasse 9 - Grüner Hof
   1050 Vienna  Austria
Phone:+43/699/12614231
 --- www.keyvis.at  ste...@keyvis.at ---
 --  This email and its attachments are
 --confidential and for the recipient only--




Re: PyQtForSoftimage vs Blur-dev

2012-05-07 Thread jo benayoun
Hi Ana,

Qt on windows relies on the win32 api as well as Softimage (MFC). As they
share a common base, both are hackable.
So, whatever the strategy that is used, it still remains the same ...
hooking a widget into the main softimage app by going thru the win32 api.
The only main difference I would say by using pyQtSoftimage (except the
source codes) is to not have to deal with all the overhead and extra layers
Blur developers put over their modules/wrappers ...
Those packages are both first steps considering more should be done by
spending time on it and make things working better.
I had lot of feedback around me saying studios are using this
implementation ... so it should be solid enough to go with it.
So feel free to make your own additions and come back here to share them
with us ...

:)
-jo






2012/5/7 Ana Gomez agomezalca...@gmail.com

 Hello everybody!

 I'm trying PyQtForSoftimage and I'm wondering some questions.
 As far as I know, this plugin is based on Blur tools. So, which are the
 differences between them? Do they have the same features? (of course, from
 the point of view of PyQt)

 Thanks in advance and thanks to Steven Caron and Jo Benayoun for sharing
 it.





Re: Getting the objects to which a material was assigned in siOnEndCommand

2012-05-04 Thread jo benayoun
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.comwrote:

 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
 

Re: Getting the objects to which a material was assigned in siOnEndCommand

2012-05-04 Thread jo benayoun
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

Re: Getting the objects to which a material was assigned in siOnEndCommand

2012-05-04 Thread jo benayoun
Well, you can still subscribe to an event like siOnValueChange or why not
a timer that will helps you to get an idea to when run your visitor thru
your custom scene graph.
It would be enough to make a trace between each user edit. At worst you can
adjust the stepping of your custom timer. Also since you're only storing
the previous ID, that should not be a problem.
Thinking of lexer implementation, why not storing the last two IDs, and be
sure your object is actually changing before firing an update. Im quite
sure actually you will get the opposite issue, that the render event is
fired too often instead of not enough ...
Anyways, there is more to explore and if you go with that way, Im sure new
issues will pop up !

:)
-jo




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

 To Steven : if the application of the shader to the object creates a
 shader and a material and connects the shader to the material, then yeah,
 those events are called.  But if you assign an existing material, they're
 not.

 To Jo: I'm playing with this right now and it's very promising.  I wonder
 though if it's possible to get the same hierarchical evaluation id after
 some edits.  The reason I'm worried about this is that I noticed that
 assigning different materials to an object caused the hierarchical
 evaluation id to go up and down.  I wonder if some combination of edits
 could result in the same evaluation id and therefore cause my system to
 think nothing has changed which would obviously be pretty bad!  Other than
 this worry, and verifying that this is valid for all kinds of edits that
 might change the way an object is rendered, this technique of checking the
 hierarchical object id might be a lot simpler than chasing down every last
 little command, callback, etc.. that can change the scene.

 Thanks guys!!


 On Fri, May 4, 2012 at 6:02 PM, Steven Caron car...@gmail.com wrote:

 in my quick test i applied multiple shader's from the menu, both standard
 and custom. both seemed to get fired. i could have been wrong.


 On Fri, May 4, 2012 at 5:20 PM, Nicolas Burtnyk 
 nico...@redshift3d.comwrote:

 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 

Re: Getting the objects to which a material was assigned in siOnEndCommand

2012-05-04 Thread jo benayoun
Hey Nicolas,

This depends of the frequency of your scenegraph traversal. For sure, if
you run it like this

Start: sphere with bend modifier, Material2 assigned (226)
traversal
Assign material 1 (206)
Change the bend angle 10 times (226)
traversal

the system will break. But visiting at this frequency will work:

Start: sphere with bend modifier, Material2 assigned (226)
traversal
Assign material 1 (206)
traversal
Change the bend angle 10 times (226)
traversal

Since you can avoid visiting entire branches because of the hierarchical
attribute. I bet a traversal would be really fast to do reducing the number
of visited node (all nodes are not traversed unlike the original visitor
pattern).
The frequency is up to you, with a custom timer, or by subscribing to
siOnValueChanged should be enough.

-jo




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

 Unfortunately I was able to pretty easily break this system :(
 While playing around with all kinds of edits, I noticed that when I had
 Material1 assigned to my object the hierarchical eval id was 20 less than
 when I had Material2 assigned.  I also noticed that if the object had a
 bend modifier on it, changing the bend angle would increment the
 hierarchical eval id by 2.  So with this sequence of events, I got the same
 eval id before and after edits.

 *Hierarchical eval id of the sphere is shown in brackets at each step*
 Start: sphere with bend modifier, Material2 assigned (226)
 Assign material 1 (206)
 Change the bend angle 10 times (226)

 The problem is the way the hierarchical eval id is computed by simply
 summing the eval ids up the hierarchy.  Maybe instead, I could crawl the
 hierarchy myself (annoying but not a big deal) and compute a hash from all
 eval ids in the hierarchy of the object.  Assuming a suitable hash
 function, any change to any eval id in the hierarchy would cause big
 changes in the hash and bring the probability of a false negative down to
 some infinitesimally small amount.


 On Fri, May 4, 2012 at 6:12 PM, Nicolas Burtnyk nico...@redshift3d.comwrote:

 To Steven : if the application of the shader to the object creates a
 shader and a material and connects the shader to the material, then yeah,
 those events are called.  But if you assign an existing material, they're
 not.

 To Jo: I'm playing with this right now and it's very promising.  I wonder
 though if it's possible to get the same hierarchical evaluation id after
 some edits.  The reason I'm worried about this is that I noticed that
 assigning different materials to an object caused the hierarchical
 evaluation id to go up and down.  I wonder if some combination of edits
 could result in the same evaluation id and therefore cause my system to
 think nothing has changed which would obviously be pretty bad!  Other than
 this worry, and verifying that this is valid for all kinds of edits that
 might change the way an object is rendered, this technique of checking the
 hierarchical object id might be a lot simpler than chasing down every last
 little command, callback, etc.. that can change the scene.

 Thanks guys!!


 On Fri, May 4, 2012 at 6:02 PM, Steven Caron car...@gmail.com wrote:

 in my quick test i applied multiple shader's from the menu, both
 standard and custom. both seemed to get fired. i could have been wrong.


 On Fri, May 4, 2012 at 5:20 PM, Nicolas Burtnyk 
 nico...@redshift3d.comwrote:

 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
 

Re: Getting the objects to which a material was assigned in siOnEndCommand

2012-05-04 Thread jo benayoun
Hey Nicolas,

I think there is a misunderstanding on what I'm suggesting and what you
could expect.

1/ When I was talking about increasing the frequency of the custom scene
graph traversal, I was thinking to it in the context of a quick preview
ala render region where things have to be updated when a slider is touched.
subscribing to the siOnValueChanged or with a custom timer fit the case.

2/ A regular scene graph traversing would happen in the context of your
render is launched but with a range of frames (let say 0-100) where you
dont need to take care of user edits. It means, that the user press
starts, your scene graph gets initialized and scene graph traversing is
done for every frame. ID is ideal to track animated objects, ...

3/ The other and last one Im thinking about is if the user ask the renderer
for one frame and press the button start, no need of a custom scene graph.
You have to evaluate everything.

In this three cases, I don't see which one would make the system breaks
considering the ID increased or decreased between updates.
If there is a context or something I didn't think about, please, let me
know, that I could try to think to something else ! :)

:)
-jo



2012/5/4 Alok Gandhi alok.gandhi2...@gmail.com

 Hi Nicolas,

 If I understand what you are saying, for each dirty of your interest,
 you would like to capture and store that as soon as it happens and compare
 it with last render event to process the delta change. And right now you
 the challenge that you are faced with is capturing the dirties, specially
 with the material assignment.

 But isn't it true that Joe's proposal lets you visit the scene graph to
 capture the scene graph changes at each render, still doing the same thing
 but with a different approach.

 Please correct me if I am wrong.

 Alok.



Re: [C++] store Fcurve in a CRefArray?

2012-05-02 Thread jo benayoun
Hey Ahmidou,
Is the ref you try to add to the array is the ref returned by the
FCurve::GetRef() method ?
-jo


2012/5/2 Ahmidou Lyazidi ahmidou@gmail.com

 Hi
 Is it possible ? I can't get it working...

 Thanks

 --
 Ahmidou Lyazidi
 Director | TD | CG artist
 http://vimeo.com/ahmidou/videos




Re: Convert Position Fcurves key's tangents in 3d space

2012-05-02 Thread jo benayoun

def find_closest_point(obj, pos):
x, y, z = pos
points = obj.ActivePrimitive.Geometry.Points
count = points.Count
points = points.PositionArray
xx, yy, zz = points
delta = [((x-xx[i])**2 + (y-yy[i])**2 + (z-zz[i])**2) for i in
xrange(count)]
return delta.index(min(delta))



results:
# brad: 2380 in 0.0239490809458 sec.
# alan: 2380 in 0.00761895761661 sec.
# jojo: 2380 in 0.00452239920537 sec.

jo





2012/5/2 Jens Lindgren jens.lindgren@gmail.com

 Nice find Alan!

 /Jens

 On Wed, May 2, 2012 at 8:25 PM, Alan Fregtman alan.fregt...@gmail.comwrote:

 Nice response man!

 A good way to paste code safely is to highlight it first:
 http://tohtml.com/python/

 then copy from the browser and paste into Gmail while Rich Formatting
 is enabled.


 On Mon, Apr 30, 2012 at 2:19 PM, jo benayoun jobenay...@gmail.com
 wrote:
  Hi Ahmidou,
  looks quite nice ! :)
 
  For your problem, I would go in c by reproducing a kinda structure that
  mimic FCurves ones like the following.
 
  
  struct bezfragments {
  double cps[4][3];
  uint_t interp;
  };
 
  struct motionpath {
  constchar_t *source;
  ushort_t color[3];
  uint_t flags;
  uint_t nbezfragments;
  struct bezfragments *[1];
  };
  
 
  A MotionPath as a FCurve is a fixed length array of bezier curves with
 some
  extra informations like the object which is the source, the color of the
  path and some other flags for ui convenience (selection mode, ...).
  You have the choice to represent your bezier segments by  pairing
 control
  points by 3 or by 4, I dont think it makes a huge difference.
  This system coupled with a MotionPathManager will avoid you to have to
  query the softimage API each time you need to redraw your viewport as
 your
  datas are cached in memory.
  Also, by subscripting to any event like siOnValueChange, you will be
 able
  to rebuild a motion path targeting just what you need. Also a good
 point for
  perfs.
  Anyways  Here is a little pysnippet (I dont have the possibility to
  write it in C right now) ! It should I hope answer to your first
 question !
  :)
 
  jo
 
 
  
  # Im quite sure gmail will eat my indent efforts so take care about
 that !
  # Each key for each params must have a buddy on the others axes.
  # Create a cube, animate its pos's being sure a key is set at the same
 frame
  for the three axes.
  #
 
  import random
 
 
  class BezFragment(object):
  cpoints = tuple()
  interp = int()
 
  class MotionPath(object):
  source = str()
  color = tuple()
  bezfragments = tuple()
 
 
  def build_axis_data(param):
  keys = tuple(param.Source.Keys)
  res = list()
  bfrag = None
  i = 0
 
  while i  (len(keys)-1):
  cp = list()
 
  key = keys[i]
  nextkey = keys[i+1]
  cp.append(round(key.Value, 1))
  cp.append(round(key.Time, 1))
  cp.append(round(key.Value + key.LeftTanX, 1))
  cp.append(round(key.Time + key.LeftTanY, 1))
  cp.append(round(nextkey.Value - key.RightTanY, 1))
  cp.append(round(nextkey.Time - key.RightTanX, 1))
  cp.append(round(nextkey.Value, 1))
  cp.append(round(nextkey.Time, 1))
 
  bfrag = BezFragment()
  res.append(bfrag)
  bfrag.interp = key.Interpolation
  bfrag.cpoints = tuple(cp)
 
  i += 1
 
  return tuple(res)
 
 
  def build_motion_path(siobj):
  x = build_axis_data(siobj.Kinematics.Local.posx)
  y = build_axis_data(siobj.Kinematics.Local.posy)
  z = build_axis_data(siobj.Kinematics.Local.posz)
 
  mp = MotionPath()
  mp.source = siobj.FullName
  mp.color = (random.randint(120, 255), random.randint(120, 255),
  random.randint(120, 255),
  )
  mp.bezfragments = tuple(zip(x, y, z))
  return mp
 
 
  def log_bezfragment(bfrag):
  msg = {0}:({1}, {2})---o ({3}, {4})  ({5}, {6})o---({7}, {8})\n \
   \__/
  print msg.format(, *bfrag.cpoints)
  return None
 
 
  def log_obj_motionpath():
  for obj in Application.Selection:
  mp = build_motion_path(obj)
 
  print source: {0}.format(mp.source)
  print mp-color: {0}.format(mp.color)
  for bezf in mp.bezfragments:
  print \ncp
  for xyz in bezf:
  log_bezfragment(xyz)
  return None
 
 
  log_obj_motionpath()
 
  
 
 
 
 
 
 
 
 
 
 
 
 
  2012/4/30 Ahmidou Lyazidi ahmidou@gmail.com
 
  I think I got it :)
 
 
  2012/4/30 Halim Negadi hneg...@gmail.com
 
  Looks awesome Ahmidou, can't wait to play with it.
  Cheers,
  H.
 
 
  On Mon, Apr 30, 2012 at 4:44 PM, Ahmidou Lyazidi 
 ahmidou@gmail.com
  wrote:
 
  Well, as soon as I have resolved the tangent handle stuff :) I'm sure
  it's simple, but I can't get

Re: Convert Position Fcurves key's tangents in 3d space

2012-05-02 Thread jo benayoun
oops ! wrong topic :(



2012/5/2 Eric Thivierge ethivie...@gmail.com

 PYTHON THUNDER DOME :D

 2 coders enter, 1 coder leaves

 
 Eric Thivierge
 http://www.ethivierge.com



 On Thu, May 3, 2012 at 4:57 AM, jo benayoun jobenay...@gmail.com wrote:

 
 def find_closest_point(obj, pos):
 x, y, z = pos
 points = obj.ActivePrimitive.Geometry.Points
 count = points.Count
 points = points.PositionArray
 xx, yy, zz = points
 delta = [((x-xx[i])**2 + (y-yy[i])**2 + (z-zz[i])**2) for i in
 xrange(count)]
 return delta.index(min(delta))

 

 results:
 # brad: 2380 in 0.0239490809458 sec.
 # alan: 2380 in 0.00761895761661 sec.
 # jojo: 2380 in 0.00452239920537 sec.

 jo




Re: Scripting: Closest Point On a Point Cloud?

2012-05-02 Thread jo benayoun

def find_closest_point(obj, pos):
x, y, z = pos
points = obj.ActivePrimitive.Geometry.
Points
count = points.Count
points = points.PositionArray
xx, yy, zz = points
delta = [((x-xx[i])**2 + (y-yy[i])**2 + (z-zz[i])**2) for i in
xrange(count)]
return delta.index(min(delta))



results:
# brad: 2380 in 0.0239490809458 sec.
# alan: 2380 in 0.00761895761661 sec.
# jojo: 2380 in 0.00452239920537 sec.













2012/5/2 Bradley Gabe witha...@gmail.com

 Thanks Alan! You have officially leveled up and gained the title of SI
 Python Optimizer (Spo).

 I knew the math, but for some reason assumed that compiled Math functions
 would run faster than Python. That'll teach me. [?] Actually, thinking
 about it now, anything that has to repeated call the COM layer would end up
 being slow-ish.

 Nifty trick there using a key sort in lieu of comparing values to figure
 out the min.

 FYI, it might be even faster for multi-Pos queries to provide an optional
 3rd argument allowing the user to input the PosArray if they have already
 generated it:

 def FindClosestPoint( inObj, inPos, pos=None ):


 fX, fY, fZ = inPos.Get2()

 if not pos:

  pts = inObj.ActivePrimitive.Geometry.Points   pos = pts.PositionArray


 d = dict( [ (i, (fX-pos[0][i])**2 + (fY-pos[1][i])**2 + (fZ-pos[2][i])**2 
 ) for i in xrange(pts.Count) ] )
 closestIndices = sorted(d, key=d.get)

 # distance = d[closestIndices[0]]**0.5
 return closestIndices[0]



 On Wed, May 2, 2012 at 2:00 PM, Alan Fregtman alan.fregt...@gmail.comwrote:

 Hey Brad,

 I wondered if using math directly would be faster than working with
 XSIMath objects, so I tried. You probably knew this, but to get a distance
 between two 3D vectors the formula is quite easy:

 * d = √  (Ax-Bx)2 + (Ay-By)2 + (Az-Bz)2
 *
 where A and B are two vectors to measure from.

 However, you can skip the squareroot if you're only comparing relative
 distances. Squareroots can be computationally expensive.


 Knowing this, I wrote a version which appears to run about 77% faster,
 and it's shorter too! (It takes 4.5s testing a null near a 1000x1000
 pointcloud grid, vs your code taking about 20.3s on the same task.)

 def FindClosestPoint( inObj, inPos ):
 fX, fY, fZ = inPos.Get2()
 pts = inObj.ActivePrimitive.Geometry.Points
 pos = pts.PositionArray

 d = dict( [ (i, (fX-pos[0][i])**2 + (fY-pos[1][i])**2 + 
 (fZ-pos[2][i])**2 ) for i in xrange(pts.Count) ] )
 closestIndices = sorted(d, key=d.get)

 # distance = d[closestIndices[0]]**0.5
 return closestIndices[0]



 I love me a Python optimization challenge. :)
 Cheers,

-- Alan



 ps: Friendly nod to Xavier for pointing out ** syntax does to the
 power of so I don't need to use math.pow() in my code.


 On Tue, May 1, 2012 at 5:55 PM, Bradley Gabe witha...@gmail.com wrote:

 Sure, have at it:

 def FindClosestPoint( inObj, inPos):
  dist = 1
 ID = -1
  Pos = XSIMath.CreateVector3()
 PosArr = inObj.ActivePrimitive.Geometry.Points.PositionArray
  for index in range(inObj.ActivePrimitive.Geometry.Points.Count):
  Pos.Set(
 PosArr[0][index],
  PosArr[1][index],
 PosArr[2][index]
  )
 Pos.SubInPlace(inPos)
  D = Pos.Length()
 if D  dist:
  dist = D
 ID = index
  return ID




 On Tue, May 1, 2012 at 5:52 PM, Alan Fregtman 
 alan.fregt...@gmail.comwrote:

 Care to share a sample snippet? Maybe there are even faster ways to
 approach it.


 On Tue, May 1, 2012 at 5:42 PM, Bradley Gabe witha...@gmail.comwrote:

 UPDATE:

 All things considered, it's not too horrible simply looping through
 every position from the Geometry.Points.PositionArray, and comparing the
 distance in order to find the closest point in the cloud. So far, that
 technique is faster than anything else I've attempted to cook up.

 -Bradley


 On Tue, May 1, 2012 at 3:01 PM, Bradley Gabe witha...@gmail.comwrote:

 Nah, it was raising errors when I tried it before starting this
 thread, and it still is now [?]:

 # ERROR : 2028 - Traceback (most recent call last):
 #   File Script Block , line 2, in module
 # obj.ActivePrimitive.Geometry.GetClosestLocations([0, 0, 0])
 #   File COMObject unknown, line 2, in GetClosestLocations
 # COM Error: Invalid argument specified. - [line 2]


 On Tue, May 1, 2012 at 2:58 PM, Bradley Gabe witha...@gmail.comwrote:

 I was going by the following quote from the docs:

 Note: Point locators are currently only supported by
 NurbsSurfaceMesh and PolygonMesh objects.


 But I'll still give it a shot...


 On Tue, May 1, 2012 at 2:54 PM, Stephen Blair 
 stephen.bl...@autodesk.com wrote:

 But doesn't a PointCloudGeometry support GetClosestLocations? Can
 you use that (I didn't try it yet) ?








338.gif347.gif

Re: Convert Position Fcurves key's tangents in 3d space

2012-04-30 Thread jo benayoun
Hi Ahmidou,
looks quite nice ! :)

For your problem, I would go in c by reproducing a kinda structure that
mimic FCurves ones like the following.


struct bezfragments {
double cps[4][3];
uint_t interp;
};

struct motionpath {
constchar_t *source;
ushort_t color[3];
uint_t flags;
uint_t nbezfragments;
struct bezfragments *[1];
};


A MotionPath as a FCurve is a fixed length array of bezier curves with some
extra informations like the object which is the source, the color of the
path and some other flags for ui convenience (selection mode, ...).
You have the choice to represent your bezier segments by  pairing control
points by 3 or by 4, I dont think it makes a huge difference.
This system coupled with a MotionPathManager will avoid you to have to
query the softimage API each time you need to redraw your viewport as your
datas are cached in memory.
Also, by subscripting to any event like siOnValueChange, you will be able
to rebuild a motion path targeting just what you need. Also a good point
for perfs.
Anyways  Here is a little pysnippet (I dont have the possibility to
write it in C right now) ! It should I hope answer to your first question !
:)

jo



# Im quite sure gmail will eat my indent efforts so take care about that !
# Each key for each params must have a buddy on the others axes.
# Create a cube, animate its pos's being sure a key is set at the same
frame for the three axes.
#

import random


class BezFragment(object):
cpoints = tuple()
interp = int()

class MotionPath(object):
source = str()
color = tuple()
bezfragments = tuple()


def build_axis_data(param):
keys = tuple(param.Source.Keys)
res = list()
bfrag = None
i = 0

while i  (len(keys)-1):
cp = list()

key = keys[i]
nextkey = keys[i+1]
cp.append(round(key.Value, 1))
cp.append(round(key.Time, 1))
cp.append(round(key.Value + key.LeftTanX, 1))
cp.append(round(key.Time + key.LeftTanY, 1))
cp.append(round(nextkey.Value - key.RightTanY, 1))
cp.append(round(nextkey.Time - key.RightTanX, 1))
cp.append(round(nextkey.Value, 1))
cp.append(round(nextkey.Time, 1))

bfrag = BezFragment()
res.append(bfrag)
bfrag.interp = key.Interpolation
bfrag.cpoints = tuple(cp)

i += 1

return tuple(res)


def build_motion_path(siobj):
x = build_axis_data(siobj.Kinematics.Local.posx)
y = build_axis_data(siobj.Kinematics.Local.posy)
z = build_axis_data(siobj.Kinematics.Local.posz)

mp = MotionPath()
mp.source = siobj.FullName
mp.color = (random.randint(120, 255), random.randint(120, 255),
random.randint(120, 255),
)
mp.bezfragments = tuple(zip(x, y, z))
return mp


def log_bezfragment(bfrag):
msg = {0}:({1}, {2})---o ({3}, {4})  ({5}, {6})o---({7}, {8})\n \
 \__/
print msg.format(, *bfrag.cpoints)
return None


def log_obj_motionpath():
for obj in Application.Selection:
mp = build_motion_path(obj)

print source: {0}.format(mp.source)
print mp-color: {0}.format(mp.color)
for bezf in mp.bezfragments:
print \ncp
for xyz in bezf:
log_bezfragment(xyz)
return None


log_obj_motionpath()













2012/4/30 Ahmidou Lyazidi ahmidou@gmail.com

 I think I got it :)


 2012/4/30 Halim Negadi hneg...@gmail.com

 Looks awesome Ahmidou, can't wait to play with it.
 Cheers,
 H.


 On Mon, Apr 30, 2012 at 4:44 PM, Ahmidou Lyazidi 
 ahmidou@gmail.comwrote:

 Well, as soon as I have resolved the tangent handle stuff :) I'm sure
 it's simple, but I can't get it...


 2012/4/30 Philip Melancon philip.melan...@modusfx.com

  This is looking amazing, do you have an idea of when/how you plan to
 release this nice little piece of animation goodness? I know that the
 animators I work with would kill for something like this!

 Philip Melancon
 Lead Crowd TD
 Modus FX


 On 4/30/2012 10:30 AM, Xavier Lapointe wrote:

 Whoa, this is awesome.

  I feel some animators out there are probably jubilating right now :)

 No virus found in this message.
 Checked by AVG - www.avg.com
 Version: 2012.0.1913 / Virus Database: 2411/4969 - Release Date:
 04/30/12




 --
 Ahmidou Lyazidi
 Director | TD | CG artist
 http://vimeo.com/ahmidou/videos





 --
 Ahmidou Lyazidi
 Director | TD | CG artist
 http://vimeo.com/ahmidou/videos




Re: PyQt For Softimage - COM Error: Out of present range. (0x-7ffdfff6)

2012-04-30 Thread jo benayoun
Hi Jared,
yo Steve,

Jared, you should unplug all the extras python modules and see how is
output the anchor's adress (is valid ? is bigger than a long on your
machine ?) from the cpp side.
That's where I would start.

jo




2012/4/30 Steven Caron car...@gmail.com

 hey jared

 i haven't seen this before. is there any other information you can share?

 s


 On Mon, Apr 30, 2012 at 7:09 AM, Jared Glass 
 jared.gl...@triggerfish.co.za wrote:

  Hi There

 I recently moved the softimage workgroups that Steven's awesome
 PyQtForSoftimage plugin was installed to and since then the plugin has been
 giving the following error message every now and then:

 # ERROR : Traceback (most recent call last):
 #   File Script Block , line 9, in module
 # Application.getQtSoftimageAnchor()
 #   File COMObject Application, line 2, in getQtSoftimageAnchor
 # COM Error: Out of present range. (0x-7ffdfff6)

 BUT when I get this error I can still call:
 Application.killQtSoftimageAnchor()
 and that works absolutly fine.

 It seems that a freshly opened xsi's  getQtSoftimageAnchor() will always
 work but after loading a scene the command may stop working. I say may
 because you can load a .scn and the plugin wont work but next time you load
 the exact same .scn it will.

 Also one of the more complex plugins I've created that uses the
 qtSoftimage now crashes instead of returning an error message. It didn't do
 this before the workgroup move. Could it be the move?

 The thing is I've uninstalled the addon from the moved workgroups and
 re-installed it just to make sure and that hasn't made the plugin any more
 stable.

 As I said it was working perfectly before. I'm using the
 PyQtForSoftimage_beta4.xsiaddon.

 Please let me know if anyone has any ideas?
 --
 Kind Regards,
 Jared Glass jared.gl...@triggerfish.co.za | Technical Lead
 Triggerfish Animation Studios http://www.triggerfish.co.za
 Zambezia Movie http://www.zambeziamovie.com/ | Khumba 
 Moviehttp://www.triggerfish.co.za/khumba/





Re: CRefArray doesn't respect C++ copy semantics

2012-04-30 Thread jo benayoun
Hey Nicolas,
never ran into that, but should definitively logged as bug ! :(
jo




2012/4/30 Nicolas Burtnyk nico...@redshift3d.com

 I ran into this today while trying to figure out why my code was broken.
 Thought I'd pass this along and hopefully save someone some wasted time in
 the future...

 CRefArray a1;
 a1.Add(CRef());
 a1.Add(CRef());
 CRefArray a2(a1);
 a2.Add(CRef());
 LONG n1 = a1.GetCount();  // expected n1 == 2
 LONG n2 = a2.GetCount();  // expected n2 == 3

 I expected a2 to be a copy of a1 before the last add and so I assumed a1
 would have 2 elements.
 Instead, I was surprised to find that n1 == n2 == 3!





Re: CRefArray doesn't respect C++ copy semantics

2012-04-30 Thread jo benayoun
in this case,


CRefArray a1;
a1.Add(CRef());
a1.Add(CRef());
CRefArray a2(a1);
a2.Add(CRef());


The copy constructor is invoked and is not the one you mentioned Alok but
this one CRefArray(const CRefArray other) which have different behaviors
and purposes than the overloaded assignment operator.

*Copy constructor* is called every time a copy of an object is made.
When you pass an object by value, either into a function or as a function's
return value, a temporary copy of that object is made.

Assignment operator is called whenever you assign to an object. Assignment
operator must check to see if the right-hand side of the assignment
operator is the object itself. It executes only the two sides are not equal


Referring to the docs : Constructs a
CRefArrayhttp://download.autodesk.com/global/docs/softimage2012/en_us/sdkguide/si_cpp/classXSI_1_1CRefArray.htmlobject
from another
CRefArrayhttp://download.autodesk.com/global/docs/softimage2012/en_us/sdkguide/si_cpp/classXSI_1_1CRefArray.htmlobject.
which is the expected behavior.

For completeness, the copy constructor in the case of an array, a string, a
ptr or whatever container has a main purpose to pass an implicit shared
memory block to save memory specially in
the case of passing arguments by value. A deep copy is done only at the
first call of a method non-const which should create a brand new underlying
object (concept called copy-on-write).
In this case, it seems its not what happens ... which is a bug in all case
unless its a wanted behavior and it should be specified in the doc !
A more comprehensible example is the python list example:
doing an assignment mylist = myotherlist creates a shallow copy and
returns the myotherlist object to the mylist which is not the case of
calling the ctor directly with mylist = list(myotherlist). That's a
behavior that could be implemented here.


mylist = [1, 2]
print mylist
myotherlist = mylist
mylist.append(6)
print mylist
print myotherlist
myoolist = list(mylist)
mylist.append(9)
print mylist
print myotherlist
print myoolist



Sethttp://download.autodesk.com/global/docs/softimage2012/en_us/sdkguide/si_cpp/classXSI_1_1CRefArray.html#acb58b1fecf704752ebcf59a50444cf37(const
CValueArrayhttp://download.autodesk.com/global/docs/softimage2012/en_us/sdkguide/si_cpp/classXSI_1_1CValueArray.htmlin_valarray)
I dont see any overloaded cast method nor ctors for a CRefArray to
CValueArray. Even if there was, it would mean that your CValueArray have to
be built from a CRefArray before being passed by reference. Which is an
overhead instead of using the copy ctor.
const is a keyword that we use to assure to the compiler, we will not try
to modify the underlying memory block nor call any procedures that could do
this. Of course, the compiler takes this as serious and do optimizations in
consequences which is a good thing for us.

jo














2012/4/30 piotrek marczak piotrek.marc...@gmail.com

   Maybe a2.Set(a1) or a2+=a1 would work?

 newbie question
 isn’t “const” keyword a hint that we won’t change input array?
   *From:* Alok Gandhi alok.gan...@modusfx.com
 *Sent:* Tuesday, May 01, 2012 1:31 AM
 *To:* softimage@listproc.autodesk.com
 *Subject:* Re: CRefArray doesn't respect C++ copy semantics

 The docs say that:

   
 CRefArrayhttp://download.autodesk.com/global/docs/softimage2012/en_us/sdkguide/si_cpp/classXSI_1_1CRefArray.html
 operator= ( const 
 CRefArrayhttp://download.autodesk.com/global/docs/softimage2012/en_us/sdkguide/si_cpp/classXSI_1_1CRefArray.html
 *in_refArray* )

 *Assigns* a 
 CRefArrayhttp://download.autodesk.com/global/docs/softimage2012/en_us/sdkguide/si_cpp/classXSI_1_1CRefArray.htmlobject
  to this one.
  *Parameters:*   in_refArray A constant 
 CRefArrayhttp://download.autodesk.com/global/docs/softimage2012/en_us/sdkguide/si_cpp/classXSI_1_1CRefArray.htmlobject.
 *Returns:* A new reference object.

 So what I think is happening is that the copy constructor is doing exactly
 what it is supposed to do and returns the new CRefArray object which still
 points to a1, 'assigns' is the operative word here. To keep them separate I
 would rather do:


 CRefArray a1;
 a1.Add(CRef());
 a1.Add(CRef());
 CRefArray a2;

 for(int i=0; ia1.GetCount(); i++)
 {
 a2.Add(a1[i]);
 }

 a2.Add(CRef());

 //a2.Add(CRef());
 LONG n1 = a1.GetCount();  // expected n1 == 2
 LONG n2 = a2.GetCount();  // expected n2 == 3

 which gives me correctly:

 # VERBOSE : cRefArrayTest_Execute called
 # VERBOSE : Count a1: 2
 # VERBOSE : Count a2: 3



 On 4/30/2012 7:13 PM, Nicolas Burtnyk wrote:

 Yeah, exactly as I unfortunately discovered :(

 On Mon, Apr 30, 2012 at 3:49 PM, Alok Gandhi alok.gan...@modusfx.comwrote:

 A quick test gives me following result:

 # VERBOSE : cRefArrayTest_Execute called
 # VERBOSE : Count a1: 3
 # VERBOSE : Count a2: 3


 On 4/30/2012 6:24 PM, Nicolas Burtnyk wrote:

  I ran into this today while trying to figure out why my code was
 broken.
 

Re: install directories

2012-04-27 Thread jo benayoun
Oh ! I see, makes sense :)

You can still look in the winreg, you have the install paths per version
and per machine.
You launch a shell or a pyscript from your cmake at compile time to
retrieve those informations.



2012/4/27 Steven Caron car...@gmail.com

 thanks jo

  Something in mind or happened to you ? 

 nope, just improving my cmake search directories


 On Fri, Apr 27, 2012 at 10:24 AM, jo benayoun jobenay...@gmail.comwrote:

 Hey Steve,

 I install on vm, my softimage versions in the same legacy folder than
 before adsk acquisition meaning D:\\Softimage\\whatever_name_I_use.
 On my host machine, I have them in the same folder than Maya,
 D:\\Program Files[(x64)]\\Autodesk\\.
 I never had any troubles on both sides (work production as
 customization). Something in mind or happened to you ?

 jo




 2012/4/27 Steven Caron car...@gmail.com

 hey guys

 i wanted to gather some feedback about where people install
 softimage... who uses the default installation directory and who uses a
 modified installation directory? if you use a modified folder what types of
 variations do you make?

 i personally named 2012 Subscription Advantage Pack to 2012.5.

 s






Re: Softimage development

2012-04-18 Thread jo benayoun
*Couple people from PDI were around too saying they were using Soft|3D for
a show that would have blown our minds (which ended up becoming shrek).*

From what I heard, *Antz* has also been done with Softimage by PDI
(*Antz*was the first movie of the couple PDI-Dreamworks before
*Shrek*) ...

jo







2012/4/18 Matt Lind ml...@carbinestudios.com

 And Ovaltine was there….

 ** **

 ** **

 ** **

 ** **

 *From:* softimage-boun...@listproc.autodesk.com [mailto:
 softimage-boun...@listproc.autodesk.com] *On Behalf Of *Raffaele Fragapane
 *Sent:* Wednesday, April 18, 2012 7:40 PM

 *To:* softimage@listproc.autodesk.com
 *Subject:* Re: Softimage development

 ** **

 Last part I meant in the context of the original timeline I posted, sorry.


 Jan '98 and then March '98 in Milan, first at smau and then at the local
 siggy chapter, MS and Avid had opposing stands and I'm sure Soft was still
 with MS back then, and DS was being demoed by someone I don't remember, and
 twister by Raffaele Rodaro on the floor. The Avid guys were clearly
 resenting it as the media composer station had no crowd :p

 I think it was the first time I saw the render region... maybe :)

 Couple people from PDI were around too saying they were using Soft|3D for
 a show that would have blown our minds (which ended up becoming shrek).***
 *

 On Thu, Apr 19, 2012 at 12:23 PM, Luc-Eric Rousseau luceri...@gmail.com
 wrote:

 Last paragraph offsetted by two years.. we were sold to Avid in 1998, and
 shipped XSI in year 2000.

 On Apr 18, 2012 5:40 PM, Raffaele Fragapane raffsxsil...@googlemail.com
 wrote:

 Actually I can think of a couple names that drifted in and out that I
 recognized across different lists and stuff.

 I think Brent might be kidding there, as 14 years and two months ago Maya
 was being released for the first time, and only became remotely usable a
 few months later with 1.0.1 (Q4 98). At that point it had so many issues
 and limitations (many of them similar to xsi 1 ironically), that most of us
 only started taking it seriously with 1.5, which sadly was an IRIX only
 release (only a few weeks after the buggy 1.0.1 for win).

 2.5.2 in 2000 is where it really took off like a rocket.
 Weta's first images of gollum in the trailer and some leaks, together with
 Framestore moving across a few months before, and Dneg choosing maya and
 getting all of pitch black done with it in record time and budget spun the
 hype mill so hard there was no going back in public perception. Producers
 were mesemrized by Weta's results and Dnegs budgets, TDs were swayed by
 having scripting (at all) and an API that didn't suck yards of penis, and
 decision makers all swung around within less than a year between 99 and 2k.

 Sumatra was still unseen at that point, the buzz was around the beta of
 twister that was being demoed alongside Softimage|DS. This was at the
 microsoft stand, right across the Avid one. You could zap a cellphone dead
 from static just walking between the two :p

 On Thu, Apr 19, 2012 at 1:30 AM, Xavier Lapointe xl.mailingl...@gmail.com
 wrote:

 I would love hearing about maya devs who switched to the xsi team !

  

 Not sure that ever happened ... (unless that was sarcasm)




 --
 Our users will know fear and cower before our software! Ship it! Ship it
 and let them flee like the dogs they are!



Re: Envelope Weights Without the Envelope Op?

2012-04-17 Thread jo benayoun
Hi Bradley,

What about transferring the weights on a cav map (script or direct paint on
it ?), creating a group of siobjects and keep a relationship between both
by the display color - color at vertex (smooth weights should not be that
easy to process, but at least absolute ones should be ... ) ??

Another solution could be a 'userdatamap' ('facerobot' uses some to store
extra envelopes informations for custom ops) mixed with a cav map.
This last idea would be the same as applying an envelope, painting it,
creating a group to keep a track to the deformers, duplicating the envelope
cluster and it's map, and finally freezing.

just some thoughts,
:)
jo






2012/4/17 Bradley Gabe witha...@gmail.com

 I'd like to be able to use the envelope weighting workflow to control a
 custom ICE deformer, rather than an envelope op.

 The hacky way to do this is to mute the envelope operator, but I was
 wondering if anyone has figured out a more direct way to get access to the
 weight painting workflow without applying the envelope deformation.

 -B



Re: Cython

2012-04-17 Thread jo benayoun
Hi Eugen,
There is a bunch of tools like cython which are simply code generators (py
- c, a quick google search should give you a good list of them).

Imho, cython leads to ugly and unreadable python-like code and breaks the
ideas and concepts behind the language.
(there is a big bunch of devs behind the py core, and each design decision
takes long talks and many implementations before being incorporated in the
public release).
Then, the c code generated by cython is unreadable and produces usually
bigger binaries (example of a cython hello world generating hundreds
lines of code where in a regular cpy extension, it could be a dozen).
I also heard about lot of memory related problems. Maybe fixed now ?

If you are looking for speed, I would recommend writing your modules
directly in C using the C Python API which is kinda smart and convenient.
(before being a language, python is a c library which is damn useful:
unicode support, data-structures implementations, etc).
If you don't want to bother with C, you can still use the 'ctypes' packages
which will let you code in python and keeping a bridge to the C world for
specific speed purposes.

In a pure performances topic on processing softimage world datas, I
observed:
c dlls called by ctypes = c extensions using cpython =  cython = pure
ctypes.
 Im sure this scale depends of the context and the implementations. 

** prototyping ops in cython using the si python binding ? writing qt
widgets in cython using pyqt ?
In the way I understand it, no, it should not be possible (or maybe with a
huge amount of work and time to get everything working).

A python binding can be tough to produce and usually deals/answers to
specific needs/cases of the target API. That's why, I would tend to prefer
pybindings provided by Qt or Softimage instead of solution like this.
If there is no available binding (which is kinda rare cases), or when I
need speed improvements, I'm choosing, pure c/cpp implementation bind with
'ctypes' or c python extensions.

Finally, I would say, in a prototyping context, there is definitively no
point to use something else than pure python and official bindings, then
reimplementing the code in c/cpp.

Anyway, hope this general feedback will be valuable to you,
jo


2012/4/17 Eugen Sares softim...@keyvis.at

 without