Poser Delta Injection Documentation - Copyright © 2002 Robert E. Whisenant

Last updated: Wednesday, January 8, 2003 15:13 MST (GMT -0700)

 NOTE :  This page is in the process of being written (I am updating periodically as I write). Some of the information on this page may not make sense until the document is complete, but it is being provided in the event that the information I already covered helps someone with a project they are working on at the moment.

Now you're gonna feel a little sting, okay? (Delta Injection)

Author : Rob Whisenant (aka "rbtwhiz")

 NOTE :  This document is geared toward Poser users that have some knowledge of how the internals of Poser files are constructed. If you are new to Poser, I wouldn't recommend tackling this tutorial just yet. A fellow Poser user (Kevin Rose) had written  this  as an explanation of P3 cr2 files quite a while ago, and it may bring you to a point where this document will make more sense. You may also find  this  tutorial at DAZ Arcana (by Ted St. John) useful in bringing you up to speed.

What:

Delta, when speaking in terms of mathematics, is a symbol or term used to denote a quantitative [expressible] change. In Poser, delta is used to describe a change in the XYZ coordinates of any given vertex [index], in any given group, with regard to morph targets. Morph targets are stored within Poser cr2 files as a list of vertices that have changed from their original [default] location, and what that new location is. Delta Injection, is a way to store the information in a remote location and place it into play when needed so as to limit system resources afforded to morphs that are not being used. It also provides a very plausible way to update a single morph without need to update an entire figure for the sake of that one morph.

Who & When:

Delta Injection first appeared in Poser-land when  Ron 'DraX' DeFreitas  released his  Musclebound Michael  character for DAZ's  Michael  figure, in November 2001. He made first mention of the hack in September 2001. Until that point, there had been a few "what if..." discussions in the various forums and newsgroups, but nobody actually tried it.

How:

First things first, in order for delta injection to work, the channel you are "injecting" into... must already exist. Think of it more as delta replacement, rather than actual "injection". Even if you are replacing nothing [an empty container] with something of substance.

Included within the 3rd generation Millennium figures, are several channels that are meant for expansion (by both DAZ and the community DAZ serves). These channels exists in each bodypart and begin with either "PBMDC_" or "PBMCC_". The ones labeled "PBMDC_" are reserved for DAZ; so that DAZ doesn't inadvertently overwrite a community members injected morph... While the "PBMCC_" are meant specifically for third party developers, the community. The initial release of  Victoria 3  contained 20 reserved DAZ channels in each bodypart, and 10 for the community. The head and neck included 10 additional channels.  Victoria 3 Service Release 1 (sr1)  changes that by increasing those values to 30 for both DAZ and the community, in each bodypart, and 50 each in the head and neck.

Due the nature of how delta injection works, for any number of morphs built to occupy the same channel... the last one applied in the sequence will be the one that prevails and thus the one that the user will see when the associated dial is adjusted in the figure itself.

Okay... but HOW?
Below you'll see a snippet of code to better illustrate "How". (I'm not putting in the actual values for deltas, because that would be a waste... but it'll give you the right idea.)

----------------snip----------------
{

version
     {
     // To keep from some users getting error messages, this should be number [3.0, 4.0 or 4.01]
     number 4.01
     }
     
// The group with a morph to inject
actor head:1
     {
     channels
          {
          // The internal morph name; the channel to inject into
          targetGeom PBMCC_01
               {
               // The external morph name; the one the user will see within Poser's UI
               name MyMorph
               // The number of indexes in the group; replace "#"
               indexes #
               // The number of indexes that change; replace "#"
               numbDeltas #
               deltas
                    {
                    // The actual list of deltas goes here
                    }
               }
          }
     }
}
----------------snip----------------

Below is another example that includes two groups that share a morph across group boundaries. I've also incorporated  ERC  to slave the neck morph channel to the appropriate channel in the head.

----------------snip----------------
{

version
     {
     // To keep from some users getting error messages, this should be number [3.0, 4.0 or 4.01]
     number 4.01
     }
     
// The group with the morph to inject
actor neck:1
     {
     channels
          {
          // The internal morph name; the channel to inject into and the ERC slave
          targetGeom PBMCC_01
               {
               // The external morph name; the one the user will see within Poser's UI
               name pMyMorph
               interpStyleLocked 0
               // Denotes channel as being controlled by another
               valueOpDeltaAdd
                               // The controlling figure
                              Figure 1
                               // The controlling group
                              head:1
                               // The controlling channel
                              PBMCC_01
               // The control multiplier
               deltaAddDelta 1.000000
               // The number of indexes in the group; replace "#"
               indexes #
               // The number of indexes that change; replace "#"
               numbDeltas #
               deltas
                    {
                    // The actual list of deltas goes here
                    }
               }
          }
     }

// Another group with a morph to inject; the controlling group for ERC
actor head:1
     {
     channels
          {
          // The internal morph name; the channel to inject into
          targetGeom PBMCC_01
               {
               // The external morph name; the one the user will see within Poser's UI
               name MyMorph
               // The number of indexes in the group; replace "#"
               indexes #
               // The number of indexes that change; replace "#"
               numbDeltas #
               deltas
                    {
                    // The actual list of deltas goes here
                    }
               }
          }
     }
}
----------------snip----------------

One thing to note in regard to injecting  ERC  is that while you can inject it, you cannot remove it in the same manner. Also, attempts at replacing injected ERC code from a previous attempt will result in each subsequent attempt becoming additive... meaning the referrences will stack, not replace.

Copyright © 2002 Robert E. Whisenant. All Rights Reserved.  www.rbtwhiz.com