Tableau

  • LXsITYPE_LIGHTMATERIAL

  • LXsICHAN_LIGHTMATERIAL_LIGHTCOL

  • LXsICHAN_LIGHTMATERIAL_DIFFUSE

  • LXsICHAN_LIGHTMATERIAL_SPECULAR

  • LXsICHAN_LIGHTMATERIAL_CAUSTICS

  • LXsICHAN_LIGHTMATERIAL_SUBSURF

  • LXsICHAN_LIGHTMATERIAL_SHADCOL

  • LXsICHAN_LIGHTMATERIAL_SCATCOL

  • LXsICHAN_LIGHTMATERIAL_SCATTER

  • LXsICHAN_LIGHTMATERIAL_DENSITY

  • LXsICHAN_LIGHTMATERIAL_ATTENUATE

  • LXsICHAN_LIGHTMATERIAL_SHIFT

  • LXsITYPE_RENDER

  • LXsICHAN_RENDER_AMBCOLOR

  • LXsICHAN_RENDER_AMBRAD

  • LXsICHAN_RENDER_GLOBENABLE

  • LXsICHAN_RENDER_GLOBSCOPE

  • LXsICHAN_RENDER_GLOBLIMIT

  • LXsICHAN_RENDER_GLOBRAYS

  • LXsICHAN_RENDER_GLOBRANGE

  • LXsICHAN_RENDER_GLOBSUBS

  • LXsICHAN_RENDER_GLOBVOLS

  • LXsICHAN_RENDER_GLOBBUMP

  • LXsICHAN_RENDER_GLOBSUPER

  • LXsICHAN_RENDER_GLOBREJECT

  • LXsICHAN_RENDER_GLOBCAUS

  • LXsICHAN_RENDER_IRRCACHE

  • LXsICHAN_RENDER_IRRUSAGE

  • LXsICHAN_RENDER_IRRDIRECT2

  • LXsICHAN_RENDER_IRRRAYS

  • LXsICHAN_RENDER_IRRRAYS2

  • LXsICHAN_RENDER_IRRRATE

  • LXsICHAN_RENDER_IRRRATIO

  • LXsICHAN_RENDER_IRRSMOOTH

  • LXsICHAN_RENDER_IRRRETRACE

  • LXsICHAN_RENDER_IRRVALS

  • LXsICHAN_RENDER_IRRGRADS

  • LXsICHAN_RENDER_IRRSAMPLE

  • LXsICHAN_RENDER_IRRDATA

  • LXsICHAN_RENDER_IRRSTART

  • LXsICHAN_RENDER_IRREND

  • LXsICHAN_RENDER_IRRWALK

  • LXsICHAN_RENDER_IRRLENABLE

  • LXsICHAN_RENDER_IRRLNAME

  • LXsICHAN_RENDER_IRRSENABLE

  • LXsICHAN_RENDER_IRRSNAME

  • LXsICHAN_RENDER_RADCACHE

  • LXsICHAN_RENDER_CAMERA

  • LXsICHAN_RENDER_ENVSAMPLE

  • LXsICHAN_RENDER_ENVRAYS

  • LXsICHAN_RENDER_ENVMIS

  • LXsICHAN_RENDER_CAUSENABLE

  • LXsICHAN_RENDER_CAUSMULT

  • LXsICHAN_RENDER_CAUSTOTAL

  • LXsICHAN_RENDER_CAUSLOCAL

  • LXsICHAN_RENDER_CAUSWALK

  • LXsICHAN_RENDER_RAYSHADOW

  • LXsICHAN_RENDER_DIFFDEPTH

  • LXsICHAN_RENDER_REFLDEPTH

  • LXsICHAN_RENDER_REFRDEPTH

  • LXsICHAN_RENDER_RAYTHRESH

  • LXsICHAN_RENDER_PATHTHRESH

  • LXsICHAN_RENDER_UNBIASED

  • LXsICHAN_RENDER_RAYCLAMP

  • LXsICHAN_RENDER_RAYOFFSET

  • LXsICHAN_RENDER_REFLSMPS

  • LXsICHAN_RENDER_REFRSMPS

  • LXsICHAN_RENDER_SPECSMPS

  • LXsICHAN_RENDER_SUBSSMPS

  • LXsICHAN_RENDER_SMPTHRESH

  • LXsICHAN_RENDER_VARTHRESH

  • LXsICHAN_RENDER_ANIMNOISE

  • LXsICHAN_RENDER_NOISESEED

  • LXsICHAN_RENDER_RAYACCEL

  • LXsICHAN_RENDER_BATCHSIZE

  • LXsICHAN_RENDER_IMPBOOST

  • LXsICHAN_RENDER_DIRECTSMPS

  • LXsICHAN_RENDER_DIRECTMIS

  • LXsICHAN_RENDER_MULTIGEO

  • LXsICHAN_RENDER_PROXYEXP

  • LXsICHAN_RENDER_MERGEFUR

  • LXsICHAN_RENDER_SUBDADAPT

  • LXsICHAN_RENDER_SUBDRATE

  • LXsICHAN_RENDER_DISPENABLE

  • LXsICHAN_RENDER_DISPRATE

  • LXsICHAN_RENDER_DISPRATIO

  • LXsICHAN_RENDER_DISPJITTER

  • LXsICHAN_RENDER_EDGEMIN

  • LXsICHAN_RENDER_DISPSMOOTH

  • LXsICHAN_RENDER_DISPBUMP

  • LXsICHAN_RENDER_SHADE_STACK

  • LXsICHAN_RENDER_BIN_STACK

  • LXsICHAN_RENDER_SPG_STACK

  • LXsICHAN_RENDER_SAMPLEVEC

  • LXsICVAL_RENDER_GLOBSCOPE_ENVIRONMENT

  • LXsICVAL_RENDER_GLOBSCOPE_GEOMETRY

  • LXsICVAL_RENDER_GLOBSCOPE_VOLUMETRICS

  • LXsICVAL_RENDER_GLOBSCOPE_ALL

  • LXsICVAL_RENDER_GLOBSUBS_NONE

  • LXsICVAL_RENDER_GLOBSUBS_GIAFFECTSSS

  • LXsICVAL_RENDER_GLOBSUBS_SSSAFFECTGI

  • LXsICVAL_RENDER_GLOBSUBS_BOTH

  • LXsICVAL_RENDER_GLOBCAUS_NONE

  • LXsICVAL_RENDER_GLOBCAUS_REFLECTION

  • LXsICVAL_RENDER_GLOBCAUS_REFRACTION

  • LXsICVAL_RENDER_GLOBCAUS_BOTH

  • LXsICVAL_RENDER_IRRUSAGE_FIRST

  • LXsICVAL_RENDER_IRRUSAGE_SECOND

  • LXsICVAL_RENDER_IRRUSAGE_BOTH

  • LXsICVAL_RENDER_IRRSAMPLE_JITTER

  • LXsICVAL_RENDER_IRRSAMPLE_POISSON

  • LXsICVAL_RENDER_IRRSAMPLE_CONCENTRIC

  • LXsICVAL_RENDER_IRRDATA_SMALL

  • LXsICVAL_RENDER_IRRDATA_FAST

  • LXsICVAL_RENDER_IRRGRADS_NONE

  • LXsICVAL_RENDER_IRRGRADS_ROTATION

  • LXsICVAL_RENDER_IRRGRADS_TRANSLATION

  • LXsICVAL_RENDER_IRRGRADS_BOTH

  • LXsICVAL_RENDER_IRRSTART_S2

  • LXsICVAL_RENDER_IRRSTART_S4

  • LXsICVAL_RENDER_IRRSTART_S8

  • LXsICVAL_RENDER_IRRSTART_S16

  • LXsICVAL_RENDER_IRRSTART_S32

  • LXsICVAL_RENDER_IRRSTART_S64

  • LXsICVAL_RENDER_ENVMIS_NONE

  • LXsICVAL_RENDER_ENVMIS_DIFFUSE

  • LXsICVAL_RENDER_ENVMIS_REFLECTION

  • LXsICVAL_RENDER_ENVMIS_BOTH

  • LXsICVAL_RENDER_DIRECTMIS_NONE

  • LXsICVAL_RENDER_DIRECTMIS_DIFFUSE

  • LXsICVAL_RENDER_DIRECTMIS_SPECULAR

  • LXsICVAL_RENDER_DIRECTMIS_BOTH

  • LXsITYPE_POLYRENDER

  • LXsICHAN_POLYRENDER_FIRST

  • LXsICHAN_POLYRENDER_LAST

  • LXsICHAN_POLYRENDER_STEP

  • LXsICHAN_POLYRENDER_RESUNIT

  • LXsICHAN_POLYRENDER_DPI

  • LXsICHAN_POLYRENDER_RESX

  • LXsICHAN_POLYRENDER_RESY

  • LXsICHAN_POLYRENDER_PASPECT

  • LXsICHAN_POLYRENDER_REGION

  • LXsICHAN_POLYRENDER_REGX0

  • LXsICHAN_POLYRENDER_REGX1

  • LXsICHAN_POLYRENDER_REGY0

  • LXsICHAN_POLYRENDER_REGY1

  • LXsICHAN_POLYRENDER_RENDTYPE

  • LXsICHAN_POLYRENDER_RAYENGINE

  • LXsICHAN_POLYRENDER_SHDENGINE

  • LXsICHAN_POLYRENDER_SPPMIN

  • LXsICHAN_POLYRENDER_SPPMAX

  • LXsICHAN_POLYRENDER_AA

  • LXsICHAN_POLYRENDER_AAFILTER

  • LXsICHAN_POLYRENDER_AAIMPMIN

  • LXsICHAN_POLYRENDER_COARSERATE

  • LXsICHAN_POLYRENDER_FINERATE

  • LXsICHAN_POLYRENDER_FINETHRESH

  • LXsICHAN_POLYRENDER_BKTREFINE

  • LXsICHAN_POLYRENDER_AREFINE

  • LXsICHAN_POLYRENDER_MERGERAD

  • LXsICHAN_POLYRENDER_FIELD

  • LXsICHAN_POLYRENDER_BUCKETX

  • LXsICHAN_POLYRENDER_BUCKETY

  • LXsICHAN_POLYRENDER_BKTORDER

  • LXsICHAN_POLYRENDER_BKTORDERPT

  • LXsICHAN_POLYRENDER_BKTREVERSE

  • LXsICHAN_POLYRENDER_BKTWRITE

  • LXsICHAN_POLYRENDER_BKTSKIP

  • LXsICHAN_POLYRENDER_FRMPASSES

  • LXsICHAN_POLYRENDER_FRMRANGE

  • LXsICHAN_POLYRENDER_OUTPAT

  • LXsICHAN_POLYRENDER_BAKEU0

  • LXsICHAN_POLYRENDER_BAKEU1

  • LXsICHAN_POLYRENDER_BAKEV0

  • LXsICHAN_POLYRENDER_BAKEV1

  • LXsICHAN_POLYRENDER_BAKEX

  • LXsICHAN_POLYRENDER_BAKEY

  • LXsICHAN_POLYRENDER_BAKEDIR

  • LXsICHAN_POLYRENDER_PROGCONV

  • LXsICHAN_POLYRENDER_PROGTIME

  • LXsICHAN_POLYRENDER_OUTPUTMASK

  • LXsICVAL_RENDER_RESUNIT_PIXELS

  • LXsICVAL_RENDER_RESUNIT_INCHES

  • LXsICVAL_RENDER_RESUNIT_CM

  • LXsICVAL_RENDER_RENDTYPE_AUTOMATIC

  • LXsICVAL_RENDER_RENDTYPE_SCANLINE

  • LXsICVAL_RENDER_RENDTYPE_RAYTRACE

  • LXsICVAL_RENDER_RENDTYPE_PATHTRACE

  • LXsICVAL_RENDER_RAYENGINE_SSE

  • LXsICVAL_RENDER_RAYENGINE_EMBREE

  • LXsICVAL_RENDER_RAYENGINE_OPTIX_ASYNC

  • LXsICVAL_RENDER_SHDENGINE_BASE

  • LXsICVAL_RENDER_SHDENGINE_CPU

  • LXsICVAL_RENDER_SHDENGINE_CUDA

  • LXsICVAL_RENDER_AA_S1

  • LXsICVAL_RENDER_AA_S2

  • LXsICVAL_RENDER_AA_S4

  • LXsICVAL_RENDER_AA_S8

  • LXsICVAL_RENDER_AA_S16

  • LXsICVAL_RENDER_AA_S32

  • LXsICVAL_RENDER_AA_S64

  • LXsICVAL_RENDER_AA_S128

  • LXsICVAL_RENDER_AA_S256

  • LXsICVAL_RENDER_AA_S512

  • LXsICVAL_RENDER_AA_S1024

  • LXsICVAL_RENDER_AA_S2048

  • LXsICVAL_RENDER_AA_S4096

  • LXsICVAL_RENDER_AAFILTER_BOX

  • LXsICVAL_RENDER_AAFILTER_TRIANGLE

  • LXsICVAL_RENDER_AAFILTER_GAUSSIAN

  • LXsICVAL_RENDER_AAFILTER_CATMULL

  • LXsICVAL_RENDER_AAFILTER_MITCHELL

  • LXsICVAL_RENDER_FIELD_OFF

  • LXsICVAL_RENDER_FIELD_UPPER

  • LXsICVAL_RENDER_FIELD_LOWER

  • LXsICVAL_RENDER_BKTORDER_ROWS

  • LXsICVAL_RENDER_BKTORDER_COLUMNS

  • LXsICVAL_RENDER_BKTORDER_SPIRAL

  • LXsICVAL_RENDER_BKTORDER_HILBERT

  • LXsICVAL_RENDER_BKTORDER_RANDOM

  • LXsICVAL_RENDER_BAKE_RGBA

  • LXsICVAL_RENDER_BAKE_RGB

  • LXsICVAL_RENDER_BAKE_RED_ONLY

  • LXsICVAL_RENDER_BAKE_GREEN_ONLY

  • LXsICVAL_RENDER_BAKE_BLUE_ONLY

  • LXsICVAL_RENDER_BAKE_ALPHA_ONLY

  • LXsICVAL_RENDER_BAKE_SWIZZLING

  • LXi_BAKE_OUTPUT_FILT_PASS

  • LXi_BAKE_OUTPUT_FILT_RGB

  • LXi_BAKE_OUTPUT_FILT_R

  • LXi_BAKE_OUTPUT_FILT_G

  • LXi_BAKE_OUTPUT_FILT_B

  • LXi_BAKE_OUTPUT_FILT_A

  • LXi_BAKE_SWIZZLING_RGBA

  • LXi_BAKE_SWIZZLING_RGB

  • LXi_BAKE_SWIZZLING_R

  • LXi_BAKE_SWIZZLING_G

  • LXi_BAKE_SWIZZLING_B

  • LXi_BAKE_SWIZZLING_A

  • LXi_BAKE_SWIZZLING_PASS

ILxTableauSurface1

class ILxTableauSurface1

Public Functions

LxResult Bound(LXtObjectID self, LXtTableauBox bbox)

For 901 the TableauSurface interface adds the SegmentBox() method.

unsigned int FeatureCount(LXtObjectID self, LXtID4 type)
LxResult FeatureByIndex(LXtObjectID self, LXtID4 type, unsigned int index, const char **name)
LxResult SetVertex(LXtObjectID self, LXtObjectID vdesc)
LxResult Sample(LXtObjectID self, const LXtTableauBox bbox, float scale, LXtObjectID trisoup)
LxResult Padding(LXtObjectID self, float *dist)
  • LXi_ENVMATERIAL_ENVTYPE_CONSTANT

  • LXi_ENVMATERIAL_ENVTYPE_GRAD2

  • LXi_ENVMATERIAL_ENVTYPE_GRAD4

  • LXi_ENVMATERIAL_ENVTYPE_OVERCAST

  • LXi_ENVMATERIAL_ENVTYPE_PHYSICAL

  • LXi_ENVMATERIAL_ENVTYPE_CLEAR


LXsITYPE_BAKE

A bake item represents a rendering process, and it presents the user-editable attributes of the baking as channels for the user. There can be different kinds of bake items, such as render output baking, texture baking, etc.

  • LXsICHAN_BAKE_UVNAME

  • LXsICHAN_BAKE_MORPHNAME

  • LXsICHAN_BAKE_DISTANCE

  • LXsICHAN_BAKE_BAKEFROM

  • LXsICHAN_BAKE_HIDDEN_TGT

  • LXsICHAN_BAKE_HIDDEN_SRC

  • LXsICHAN_BAKE_HIDDEN_OUT

  • LXsICHAN_BAKE_RGBAFROM

  • LXsICHAN_BAKE_RGBATO

  • LXsICHAN_BAKE_SAVE_OUTPUT_FILE

  • LXsICHAN_BAKE_USE_NORMAL_PRESET

  • LXsICHAN_BAKERO_WIDTH

  • LXsICHAN_BAKERO_HEIGHT

  • LXsICHAN_BAKERO_OUTPUT_PATTERN

  • LXsICHAN_BAKERO_OUTPUT_LOCATION

  • LXsICHAN_BAKERO_OUTPUT_FORMAT

  • LXsICHAN_BAKERO_USE_UDIM

  • LXsICHAN_BAKERO_START_UDIM

  • LXsICHAN_BAKERO_END_UDIM

  • LXsITYPE_BAKE_RENDER_OUTPUTS

  • LXsITYPE_BAKE_TEX_LAYERS


LXsGRAPH_BAKE_SURF

The Bake items use 2 different graphs to connect to the surface items and outputs items that are included in the bake.

  • LXsGRAPH_BAKE_OUTPUT

  • LXsGRAPH_BAKE_SOURCE

  • LXsGRAPH_BAKE_TEX_LAYER

ILxTableau

class ILxTableau

Public Functions

LxResult Time(LXtObjectID self, float *t0, float *interval)

A Tableau is a snapshot of the 3D scene, partially frozen in time and suitable for rendering. It consists of a collection of various types of elements such as surfaces, volumes, lights, and filters which all contribute to the final rendered appearance. A tableau is created by traversing the item database. Tableaus have a start time and duration interval, and method for adding new elements or instances of existing elements. This interface is provided mainly so clients can add elements to populate the tableau, so this does not give full access.

LxResult AddElement(LXtObjectID self, LXtObjectID element, LXtObjectID shader)
LxResult AddInstance(LXtObjectID self, LXtObjectID inst, LXtObjectID element, LXtObjectID shader)
LxResult Channels(LXtObjectID self, unsigned type, void **ppvObj)

Get a ChannelRead object for subframe times: ‘type’ is 0,1,2 for t0, t1 and frame time.

LxResult Visible(LXtObjectID self, LXtObjectID item)

Returns LXe_TRUE for items that are visible in this tableau.

LxResult FindShader(LXtObjectID self, LXtObjectID item, LXtObjectID tags, void **ppvObj)

Get a tableau shader given an item and string tags for material tags.

LXtObjectID InstanceItem(LXtObjectID self)

Return a peek of the item currently being instanced.

LxResult Update(LXtObjectID self, LXtObjectID visitor, int immediate)

These events are used for incremental updates to the tableau. Update takes in a visitor, which acts as a callback to update the tableau data. When the tableau is “safe”, such as when the render is stopped, it will perform the update. The “immediate” argument is whether or not the tableau contains dangerous / invalid data, in which case any tableau clients need to stop / abort immediately The tableau will add-ref and release the visitor when it’s done, so the client doesn’t need to keep a reference around. UpdateAll tells the tableau that it needs to be completely invalidated and rebuilt. EltNotify notifies clients of the tableau (like the render caches) that a tableau element has changed. It takes in the element object (which the tableau source should have retained) and the event indicating what’s changed. InstNotify is effectively the same.

LxResult UpdateAll(LXtObjectID self)
LxResult EltNotify(LXtObjectID self, LXtObjectID element, int event)
LxResult InstNotify(LXtObjectID self, LXtObjectID instance, int event)
LxResult AddInstanceItem(LXtObjectID self, LXtObjectID instItem, LXtObjectID fromItem, LXtObjectID inst, LXtObjectID vdesc, const float *vertex)

This allows clients to add instance of other items, not just their own elements. This takes the item to be instanced (inst), the item doing the instacing (from), the TableauInstance object giving the transforms for the item. The final arguments give a TableauVertex for particle features and an array of those features, and can both be null if there are no particle features for the instance.

LxResult AddInstanceableElement(LXtObjectID self, LXtObjectID elt, LXtObjectID tags)

Items that provide an instanceable object channel call this method to define the elements that make up the item. The element is the TableauElement to be added and the tags are the string tags to be used for getting shaders for this element. Both objects are often the same.

float Time0(void)

User Class Only:

float Time1(void)
bool IsVisible(ILxUnknownID item)
bool GetShader(CLxLoc_TableauShader &shader, ILxUnknownID item, ILxUnknownID tags)
bool GetChannels(CLxLoc_ChannelRead &chan, unsigned type)
LxResult VisitorUpdate(CLxImpl_AbstractVisitor *visitor, int immediate)
  • LXiTBX_CHANS_T0

  • LXiTBX_CHANS_T1

  • LXiTBX_CHANS_FRAME


LXiTBX_SURF_ADD

EltNotify can have the following events.

  • LXiTBX_SURF_REMOVE

  • LXiTBX_SURF_GEO

  • LXiTBX_SURF_XFRM

  • LXiTBX_SURF_SHADER

  • LXiTBX_LGT_ADD

  • LXiTBX_LGT_REMOVE

  • LXiTBX_LGT_DATA

  • LXiTBX_LGT_XFRM

  • LXiTBX_LGT_SHADER

  • LXiTBX_LGT_GEO

  • LXiTBX_VOL_ADD

  • LXiTBX_VOL_REMOVE

  • LXiTBX_VOL_DATA

  • LXiTBX_VOL_XFRM

  • LXiTBX_VOL_SHADER


LXiTBX_INST_ADD

And InstNotify has a smaller set of events.

  • LXiTBX_INST_REMOVE

  • LXiTBX_INST_XFRM

typedef float LXtTableauBox[6]
  • LXe_INFINITE_BOUND


LXiTBLX_BASEFEATURE

This feature type and set of names define the most basic set of features that most elements support. Velocity is in object space. Normals exist only for surface samples, and radius is meaningful only for line samples.

  • LXsTBLX_FEATURE_POS

  • LXsTBLX_FEATURE_OBJPOS

  • LXsTBLX_FEATURE_VEL

  • LXsTBLX_FEATURE_NORMAL

  • LXsTBLX_FEATURE_RADIUS

  • LXsTBLX_FEATURE_PARAM_LENGTH

  • LXsTBLX_FEATURE_PARTID

  • LXsTBLX_FEATURE_RADIANCE

  • LXsTBLX_FEATURE_TENSION

  • LXsTBLX_FEATURE_TORSION

  • LXiTBLX_DPDU

  • LXiTBLX_TBASIS

ILxTableauElement

class ILxTableauElement

Public Functions

LxResult Bound(LXtObjectID self, LXtTableauBox bbox)

We have an element interface, but all the other elements have the same functions at the start as well.

unsigned int FeatureCount(LXtObjectID self, LXtID4 type)
LxResult FeatureByIndex(LXtObjectID self, LXtID4 type, unsigned int index, const char **name)
LxResult SetVertex(LXtObjectID self, LXtObjectID vdesc)

ILxTableauSurface

class ILxTableauSurface

Public Functions

LxResult Bound(LXtObjectID self, LXtTableauBox bbox)

2D surface elements are 3D elements that interact with the renderer as a pool of triangles. The Sample() method is called with a bounding box that intersects the surface element, a feature scale, and an interface to collect triangles. The scale parameter gives an approximate edge length scale that is used to determine surface dicing. The vertex vector description should already have been set for this element.

unsigned int FeatureCount(LXtObjectID self, LXtID4 type)
LxResult FeatureByIndex(LXtObjectID self, LXtID4 type, unsigned int index, const char **name)
LxResult SetVertex(LXtObjectID self, LXtObjectID vdesc)
LxResult Sample(LXtObjectID self, const LXtTableauBox bbox, float scale, LXtObjectID trisoup)
LxResult Padding(LXtObjectID self, float *dist)

Surface elements can also provide a padding distance that will be added to the bounding box. In general this will be zero but certain surfaces need to add an extra padding. For example surfaces modeling hair may need to set the padding distance as the maximum length of hair guides.

LxResult SegmentBox(LXtObjectID self, unsigned int segID, LXtTableauBox bbox)

The bounding boxes of individual segments can be read. The client need to get the segment IDs by sampling the surface, but once given they can be passed to this function. If it return any error (incluing not-impl) the client should assume that no box is available.


LXeTBLXSURF_ADAPTIVE

The Bound() method for surfaces (since it cannot return “infinite”) may also return a success code indicating that the surface supports adaptive subdivision.

ILxTriangleSoup

class ILxTriangleSoup

Public Functions

unsigned int TestBox(LXtObjectID self, const LXtTableauBox bbox)

A triangle “soup” consists of unconnected triangles grouped into segments. The idea of a soup is that although triangles may border on each other and share normals at those borders, there is no connectivity information in the data structure. What we have is just a big batch of triangles and it’s up to the renderer to assure that any transformations it applies will maintain continuity. While this places definite limitations on the renderer, it also makes it much easier to deal with gigantic meshes since they can be processed in arbitrarily small units. The triangle soup interface is passed to the surface object from the renderer, and the surface has the job of generating all the triangles that intersect the bounding box. The triangles are grouped into segments by the surface, each with a unique ID code. Before sending a segment the surface calls the Segment() method with the ID, and the renderer can return LXe_TRUE or LXe_FALSE. If false the segment is skipped, which allows the renderer to cache segments and only update them as needed. Each segment can contain either points, lines, or triangles.

LxResult Segment(LXtObjectID self, unsigned int segID, unsigned int type)
LxResult Vertex(LXtObjectID self, const float *vertex, unsigned int *index)

Within each segment the surface calls Vertex() and Polygon() any number of times in any combination. Each call to Vertex() takes the vector of floats which define the vertex, and the vertices in the fragment are numbered starting from zero, incrementing by one each call. The Polygon() function knits vertices together into a part of the visible surface. For points and lines the Polygon() function ignores the last one or two vertex indices.

LxResult Polygon(LXtObjectID self, unsigned int v0, unsigned int v1, unsigned int v2)
void Connect(LXtObjectID self, unsigned int type)

Connect allows the source to give hints about the connectivity of the elements in the soup. This is completely optional and there is no possibility of an error return.

LxResult Quad(unsigned int v0, unsigned int v1, unsigned int v2, unsigned int v3)

User Class Only: The user method allows quads to be created with connectivity.

  • LXiTBLX_SEG_POINT

  • LXiTBLX_SEG_LINE

  • LXiTBLX_SEG_TRIANGLE

  • LXiTBLX_CONNECT_QUAD

  • LXiTBLX_CONNECT_BEGIN

  • LXiTBLX_CONNECT_END


LXfTBLX_VOL_VOLUME

Volume elements are 3D elements with a depth and internal structure. They need to be evaluated over the entire volume rather than just at the 2D surface.

  • Type Returns the volume evaluate flags. We support 3 types that can be implemented simultaneously on the same element:

  • LXfTBLX_VOL_CLIPPING

  • LXfTBLX_VOL_IMPSURF

  • LXfTBLX_VOL_LOCAL_SHADER

ILxTableauVolume

class ILxTableauVolume

Public Functions

LxResult Bound(LXtObjectID self, LXtTableauBox bbox)

  • RenderInit After the tableau has fully been populated and the sample vector has been set, but before the first ray is fired, volumes are initialized.

  • RaySample Volumes are sampled with ray marching: during ray tracing volumes are intersected by rays and are evaluated to contribute to the ray. ‘densitySlice’ is the volume density shader slice ‘shadingSlice’ is the volume sample shader slice ‘sv’ is the sample vector.

  • RayCast Implicit surfaces need to be raycasted, these are volumes that can be evaluated as a surface usually by tracing the isosurface of the volume density field. This method returns the hit distance. It should also set the normal, position and facet packets.

  • Density Returns the density at the given position, if ‘worldPos’ is true it means that the position is in world space. The density is zero outside the volume so this can also be used to find out if we are inside or outside said volume.

unsigned int FeatureCount(LXtObjectID self, LXtID4 type)
LxResult FeatureByIndex(LXtObjectID self, LXtID4 type, unsigned int index, const char **name)
LxResult SetVertex(LXtObjectID self, LXtObjectID vdesc)
int Type(LXtObjectID self)
LxResult RenderInit(LXtObjectID self, LXtObjectID sv)
LxResult RaySample(LXtObjectID self, LXtObjectID densitySlice, LXtObjectID shadingSlice, LXtObjectID sv, LXtObjectID raycastObj, LXtObjectID raymarchObj)
LxResult RayCast(LXtObjectID self, LXtObjectID densitySlice, LXtObjectID sv, LXtObjectID raycastObj, double *dist, int *localShader)
LxResult Density(LXtObjectID self, LXtObjectID densitySlice, LXtObjectID sv, LXtObjectID raycastObj, const LXtVector pos, int worldPos, double *dens)

ILxTableauLight

class ILxTableauLight

Public Functions

LxResult Bound(LXtObjectID self, LXtTableauBox bbox)

Lights are 3D elements, where the bound (if any) represents the effective coverage area for anything illuminated by the light. The light source can be sampled at any desired quality level, which is simply the number of samples over the emissive volume defined by the light. ‘Emit’ traces photons from a light. ‘ShadowMap’ returns the map and true if the light uses a shadow map.

unsigned int FeatureCount(LXtObjectID self, LXtID4 type)
LxResult FeatureByIndex(LXtObjectID self, LXtID4 type, unsigned int index, const char **name)
LxResult SetVertex(LXtObjectID self, LXtObjectID vdesc)
LxResult Sample(LXtObjectID self, float u, float v, const LXtFVector dir, LXtFVector wPos, LXtFVector oPos, LXtFVector norm, float t)
int Geometry(LXtObjectID self, void *gc)
LxResult Emit(LXtObjectID self, unsigned int nPhotons, int offset, LXtObjectID slice, LXtSampleVectorID sv)
int ShadowMap(LXtObjectID self, void **ppvObj)

ILxLightSample

class ILxLightSample

Public Functions

void Vertex(LXtObjectID self, const float *vertex)

LXpLightQuality

struct st_LXpLightQuality

The shader computes the light intensity and other parameters based on the sample and the ray. Sample source position is in homogeneous coordinates so it can include distant sources. Quality and shadowing are determined reading packets from the shader. These are fixed for a given light, so they can be evaluated once and should not depend on any other inputs. The quality is given by a requested number of samples for the light, as well as approximate information about falloff. For local lights, ‘center’ and ‘radius’ define a region in which the light’s sample points reside. For directional lights, ‘radius’ is half the spread in radians. ‘dir’ is the direction the light is pointing. ‘power’ is the radiant flux of the light in watts and is used for allocating emitted photons. ‘infinite’ should be one for directional lights, zero otherwise. ‘indirect’ should be one for portal lights, zero otherwise. ‘item’ is for light linking and points to the cinema light item that corresponds to this element.

Public Members

LXtFVector center
LXtFVector dir
float radius
float cosine
float intensity
float power
float importance
unsigned int infinite
unsigned int indirect
unsigned int fallType
unsigned int shadType
unsigned int samples
unsigned int linkMode
void *linkGroup
void *item
char *lpeLabel

LXpLightShadowing

struct st_LXpLightShadowing

Lights that want to use a shadow map can compute this packet. It indicates the center, direction, orientation, spread angle and resolution of the requested shadow map. ‘exclude’ is for self shadowing. Some items do their own self shadowing and don’t want to be included in the shadow computation.

Public Members

LXtFVector pos
LXtFVector ray
LXtFVector up
float angle
unsigned int mapRes
void *exclude

LXpLightSource

struct st_LXpLightSource

The light color and brightness for locations in space is computed using another shader slice. This packet is initialized with the world and object position and the ray for the light sample being shaded.

Public Members

LXtFVector wPos
LXtFVector oPos
LXtFVector dir
LXtFVector norm
float len
float nDotWi
int sampleIndex
void *lightSource
void *lightItem

LXpLightColor

struct st_LXpLightColor

The colors at the given sample location are computed by the light and returned in this packet. Brightness takes into account falloff and light shape, and the colors are not pre-multiplied by the attenuation. ‘unshad’ is not set by the light shader itself but is used in computing shadow alpha. ‘pdf’ is used for multiple importance sampling.

Public Members

LXtFVector color
LXtFVector shadow
LXtFVector unshad
float diffuse
float specular
float caustics
float subsurface
float brightness
float pdf
  • LXsP_LGT_QUALITY

  • LXsP_LGT_SHADOWING

  • LXsP_LGT_SOURCE

  • LXsP_LGT_COLOR


LXs_FX_LIGHTCOLOR

These are the texture effect names that apply to lights.

  • LXs_FX_LIGHTSHADOW

  • LXs_FX_LIGHTDIFFUSE

  • LXs_FX_LIGHTSPECULAR

  • LXs_FX_LIGHTCAUSTICS

  • LXs_FX_LIGHTDISTANCE

  • LXs_FX_LIGHTANGLE


LXs_FX_VOLSCATTER

These are the texture effect names that apply to volumetrics.

  • LXs_FX_VOLSCATTER_COL

  • LXs_FX_VOLABSORB

  • LXs_FX_VOLABSORB_COL

  • LXs_FX_VOLDENSITY

  • LXs_FX_VOLLEVEL

  • LXs_FX_VOLSMPDENSITY

  • LXs_FX_VOLAMB_COL

  • LXs_FX_VOLLUMI

  • LXs_FX_VOLLUMI_COL

ILxTableauProxy

class ILxTableauProxy

Public Functions

LxResult Bound(LXtObjectID self, LXtTableauBox bbox)

A proxy is sampled to add elements to the tableau. The proxy object needs to keep track of which sub-elements have been added to the tableau so they are only added once.

unsigned int FeatureCount(LXtObjectID self, LXtID4 type)
LxResult FeatureByIndex(LXtObjectID self, LXtID4 type, unsigned int index, const char **name)
LxResult SetVertex(LXtObjectID self, LXtObjectID vdesc)
LxResult Sample(LXtObjectID self, const LXtTableauBox bbox, LXtObjectID tableau)

ILxTableauInstance

class ILxTableauInstance

Public Functions

LxResult Properties(LXtObjectID self, LXtObjectID vecstack)

An instance is a copy of another element, with variations. It most likely has a different position and orientation, and it may have differences in shading or shading parameters. These differences are encoded in the instance interface. Any normal element may also present this interface, if it wants to have these attributes as well. Instances can set packets in the sample vector for global parameters of the element to be used by its shader.

LxResult GetTransform(LXtObjectID self, unsigned endPoint, LXtVector offset, LXtMatrix xfrm)

The transformation of an instance (or any element) can be read with this method. The endpoint can specify either the start or end of the tableau time interval.

LxResult GetDissolve(LXtObjectID self, double *dissolve)

The instance may be dissolved independently.

LxResult ParticleDescription(LXtObjectID self, void **ppvObj)

An instance can define particle features. These are given by a tableau vertex to describe the feature vector, which can then be read.

LxResult ParticleArray(LXtObjectID self, float *vector)
  • LXiTBLX_ENDPOINT_T0

  • LXiTBLX_ENDPOINT_T1

ILxTableauShader

class ILxTableauShader

Public Functions

LxResult Select(LXtObjectID self, LXtObjectID teElt, LXtObjectID tvDesc)

All 3D elements have shaders, which are used by the renderer to compute desired sample vector packets from a set of input packets. Shaders are polymorphic with an ILxVectorType interface, so it’s easy to determine what they take as input and output. To perform computations we need to “slice” the shader, which basically selects a set of desired output packets. The output packets are determined by the vector type, and the vertex description provides information about vertex packets to use during computation.

LxResult Slice(LXtObjectID self, LXtObjectID vtOutput, LXtObjectID tvDesc, void **ppvObj)
bool GetSlice(CLxLoc_ShaderSlice &slice, ILxUnknownID vtOutput, ILxUnknownID tvDesc)

User Class Only:

ILxShaderSlice

class ILxShaderSlice

Public Functions

LxResult Evaluate(LXtObjectID self, LXtObjectID vecstack)

The result of a successful slice is a shader slice interface. This is also polymorphic with an ILxVectorType to select its inputs. The Evaluate() method computes the output packets for a sample vector.

LXpCameraRay

struct st_LXpCameraRay

The environment in the tableau is given as a list of shaders. The primary function of an environment is to read the direction of the camera ray and output the color at infinity. Origin is also provided, although for environment shaders this can be ignored since the background is assumed to be at infinity. Spread is the angular size of the sampling cone, in radians.

Public Members

LXtFVector dir
LXtFVector origin
float spread

LXpEnvInfiniteColor

struct st_LXpEnvInfiniteColor

Public Members

LXtFVector rgb
float intensity

LXpEnvVisibility

struct st_LXpEnvVisibility

An environment can also provide flags to determine where it is visible. Typically only one environment would be visible in a specific context. If there are multiple environments visible to the camera, for example, it’s undetermined what the render camera will see. Environments can also be restricted to match particular light path expressions with a label.

Public Members

unsigned int camera
unsigned int indirect
unsigned int reflection
unsigned int refraction
char *lpeLabel

LXpEnvShape

struct st_LXpEnvShape

In PhotoView, sometimes we render the environment as if it were an actual sphere in the background of everything. This packet is used for that feature.

Public Members

unsigned int sphereVis
float size
float height
unsigned int flatten
LXtVector pos
LXtMatrix xfrmInv

LXpEnvFog

struct st_LXpEnvFog

An environment can also provide fog values indicating color and absorption values.

Public Members

LXtFVector color
LXtFVector opacity

LXpGlobalLighting

struct st_LXpGlobalLighting

The environment shaders can also provide global render settings. Each of these packets should occur in only one shader, or else the result is undetermined. The global lighting packet sets ambient illumination and some basic raytracing settings.

Public Members

LXtFVector ambientColor
float ambientIntensity
float rayThresh
float rayClamp
float rayOffset
unsigned int shadDepth
unsigned int reflDepth
unsigned int refrDepth
unsigned int unbiased
unsigned int specSmps
unsigned int animNoise
unsigned int rayAccel
unsigned int batchSize
unsigned int impBoost
unsigned int directSmps
unsigned int directMIS
unsigned int reflSmps
unsigned int refrSmps
unsigned int subsSmps
unsigned int noiseSeed
float smpThresh
float varThresh
float pathThresh

LXpGlobalDisplacement

struct st_LXpGlobalDisplacement

Displacement settings.

Public Members

float rate
float ratio
float jitter
float edgeMin
unsigned int enable
unsigned int smooth
unsigned int useBump

LXpGlobalIndirect

struct st_LXpGlobalIndirect

Indirect illumination and caustics settings.

Public Members

float range
float irrRays2
float irrRate
float irrRatio
float irrSmooth
float irrRetrace
unsigned int enable
unsigned int scope
unsigned int limit
unsigned int rays
unsigned int subs
unsigned int vols
unsigned int bump
unsigned int super
unsigned int reject
unsigned int caus
unsigned int giBack
unsigned int irrCache
unsigned int irrDirect2
unsigned int irrRays
unsigned int irrVals
unsigned int irrGrads
unsigned int irrSample
unsigned int irrData
unsigned int irrStart
unsigned int irrEnd
unsigned int irrWalk
unsigned int irrLEnable
unsigned int irrSEnable
unsigned int radCache
unsigned int envSample
unsigned int envRays
unsigned int envMIS
char *irrLName
char *irrSName

LXpGlobalCaustics

struct st_LXpGlobalCaustics

Public Members

float multiplier
unsigned int total
unsigned int local
unsigned int walk

LXpGlobalRendering

struct st_LXpGlobalRendering

Miscellaneous render settings, specific to our built-in renderer.

Public Members

float subdRate
float coarseRate
float fineRate
float fineThresh
float aaImpMin
unsigned int multiGeo
unsigned int mergeFur
unsigned int subdAdapt
unsigned int renderType
unsigned int aa
unsigned int aaFilter
unsigned int motionBlur
unsigned int field
unsigned int frmPasses
unsigned int dof
unsigned int stereo
unsigned int stereoEye
unsigned int stereoComp
unsigned int upAxis
unsigned int bucketX
unsigned int bucketY
unsigned int bktOrder
unsigned int bktReverse
unsigned int bktWrite
unsigned int bktSkip
unsigned int bktRefine
unsigned int aRefine
unsigned int mergeRad
unsigned int bakeDir
unsigned int outputMasking
unsigned int proxyExp
unsigned int rayEngine
unsigned int sppMin
unsigned int sppMax
unsigned int shdEngine

LXsP_CAM_RAY

There are actually two camera ray packets. The default one contains the camera ray at time t0, the start interval for the tableau. The second ray packet contains the ray at time T1, the end of the interval. Good environment shaders will interpolate colors along an arc between the two rays to account for motion blurring of the environment as the camera rotates.

  • LXsP_CAM_RAY_T1

  • LXsP_ENV_INFINITECOLOR

  • LXsP_ENV_VISIBILITY

  • LXsP_GLO_LIGHTING

  • LXsP_GLO_DISPLACEMENT

  • LXsP_GLO_INDIRECT

  • LXsP_GLO_CAUSTICS

  • LXsP_GLO_RENDERING

LXpCameraResolution

struct st_LXpCameraResolution

The environment shader also provides packets to describe the camera used for rendering. Some are required and some are optional, and which ones are present determines the type of camera to use for the rendering. This required packet defines the frame buffer size in pixels and the per-pixel sampling. Sampling quality is given by a floating point number of samples per pixel, and a shading rate. These may be interpreted in any manner appropriate to the renderer.

Public Members

unsigned int width
unsigned int height
float pixelAspect
float dpi
float regX0
float regX1
float regY0
float regY1

LXpCameraFrustum

struct st_LXpCameraFrustum

Orthographic cameras are specified by a set of parameters which define the view frustum, lens and aperture. Eye position and transform are the location and orientation of the camera in world coordinates. Focal length, focus distance and f-Stop define the camera’s zoom and depth of field. Iris blades, rotation, and bias affect the depth of field “bokeh” shape. Distort is a barrel or pin-cushion value and is 1.0 for a flat projection. Interocular distance is the distance between the eyes for stereo rendering. The remaining parameters define the projection from 3D to 2D, ala Maya.

Public Members

LXtFVector eyePos
LXtMatrix xfrm
LXtMatrix invXfrm
float focalLength
float focusDist
float fStop
float irisRot
float irisBias
float distort
float ioDist
float convDist
float blurLength
float blurOffset
float apertureX
float apertureY
float offsetX
float offsetY
float squeeze
float target
float clipDist
int clipping
int filmFit
int projType
int irisBlades
void *item
int useMask
float overscan
float filmRoll

LXpCameraPixel

struct st_LXpCameraPixel

In addition to simple distortion, raytrace camera distortions can be computed procedurally for each pixel. If the environment has a slice that reads the camera pixel packet and writes the LXpCameraRay packet, then the slice will be evaluated before raytracing. The slice reads the buffer XY, and optionally the ray direction packet (which is initialized based on the frustum if any), and writes an updated ray direction.

Public Members

float x
float y

LXpCameraUVBake

struct st_LXpCameraUVBake

A camera intended to perform UV baking is specified by providing one of these packets instead of a frustum. The packet contains the name of the feature which is the source of the UV coordinates. Any element that doesn’t support this UV feature name is not rendered.

Public Members

const char *name

LXsP_CAM_RESOLUTION

The frustum may be a source of motion blur, so the renderer will query for one at time T0 and another at time T1. If the T1 frustum is missing, the camera is assumed to be non-moving.

  • LXsP_CAM_FRUSTUM

  • LXsP_CAM_FRUSTUM_T1

  • LXsP_CAM_PIXEL

  • LXsP_CAM_UVBAKE

ILxTableauFilter

class ILxTableauFilter

Public Functions

const char *Order(LXtObjectID self)

Filters are fundamentally 2D elements, and operate in the image space over the frame buffer. The bound method for a filter returns a 2D bounding box and a kernel radius, plus some flags.

LxResult Select(LXtObjectID self, LXtObjectID framebuf)
unsigned int Bound(LXtObjectID self, float box[4], float *kernel)
unsigned int Pixel(LXtObjectID self, LXtObjectID framebuf, const float pos[2])

The Pixel() and Region() methods are used to do proecessing based on the filter type. Both get the frame buffer and the

unsigned int Region(LXtObjectID self, LXtObjectID framebuf, const float box[4])
  • LXfTBLX_FILT_PIXEL

  • LXfTBLX_FILT_STRIP

  • LXfTBLX_FILT_RELATIVE


LXfTBLX_PREVIEW_UPDATE_NONE

A channel change can have no affect on the preview, or it may be necessary to update the geometry or the shading. The item can decide how individual channels should update the preview by returning the appropriate combination of the following values when the PreviewUpdate function is called.

  • LXfTBLX_PREVIEW_UPDATE_GEOMETRY

  • LXfTBLX_PREVIEW_UPDATE_SHADING


LXiTBXELT_SURFACE

Any item can potentially participate in rendering by adding elements to the tableau. Any item (or package) which presents the following interface will get called upon when it’s time to create a tableau from a cinema.

  • Elements This is called to let the item add elements directly to a tableau.

  • Preview This is similar, but is used for adding elements needed to preview this item.

  • Instance This will be called by other items which want instances of this item. The item should add elements to instance itself given the tableua instance object as reference.

  • SubShader Elements such as lights can affect their own shading. If that’s the case, this method will be called to allow the item to create a shader to be used as a part of the shader for this item.

  • GetCurves Elements may be able to provide curves which can be used as hair guides. The string tag interface selects a subset of curves, and the object returned is a tableau surface element which can be sampled.

  • ElementType If implemented, ElementType allows the tableau source to specify what types of elements it can add to the tableau. It is queried with one of the following types, and puts 1 into *supported if it will add elements of that type, 0 if it won’t, or -1 if it doesn’t know.

  • LXiTBXELT_VOLUME

  • LXiTBXELT_LIGHT

  • LXiTBXELT_FILTER

  • LXiTBXELT_PROXY

ILxTableauSource

class ILxTableauSource

Public Functions

LxResult Elements(LXtObjectID self, LXtObjectID tableau)
LxResult Preview(LXtObjectID self, LXtObjectID tableau)
LxResult Instance(LXtObjectID self, LXtObjectID tableau, LXtObjectID instance)
LxResult SubShader(LXtObjectID self, LXtObjectID tableau, void **ppvObj)
LxResult PreviewUpdate(LXtObjectID self, int chanIndex, int *update)
LxResult GetCurves(LXtObjectID self, LXtObjectID tableau, LXtObjectID tags, void **ppvObj)
LxResult ElementType(LXtObjectID self, int type, int *supported)
  • LXsPKG_INSTANCEABLE_CHANNEL

ILxInstanceable

class ILxInstanceable

The cleanest way for items to provide elements that can be instanced is to implement an Instanceable object. This is stored in an OBJREF channel on the item, given by a server tag on the package. The item type will implement a modifier for computing the instanceable object from the state of the item’s channels.

Public Functions

int Compare(LXtObjectID self, LXtObjectID other)

Compare this instanceable to another of the same type and return a value on a comparison metric. The value is the same sense as strcmp(), with zero for identical objects, and positive and negative values indicating relatve order.

LxResult AddElements(LXtObjectID self, LXtObjectID tableau, LXtObjectID instT0, LXtObjectID instT1)

When the elements are needed such as when the item itself is to be rendered or instanced the AddElements() method is called. The T0 and T1 instanceable objects are from the shutter open and close times, and can be read to compute state that changes while the shutter is open. The object itself is computed at the frame time. The method should call AddInstanceableElement() for all elements in the item.

LxResult GetSurface(LXtObjectID self, void **ppvObj)

Alternately the instanceable object can provide a Surface object which will be added to the tableau.

ILxTableauService

class ILxTableauService

Public Functions

LxResult ScriptQuery(LXtObjectID self, void **ppvObj)
LxResult AllocVertex(LXtObjectID self, void **ppvObj)
LxResult VertexFromFeatures(LXtObjectID self, LXtObjectID surfObj, LXtObjectID vertex)

This utility method will populate a vertex description with all the known features of the tableau surface object. It puts the four required features at the front as normal.

bool NewVertex(CLxLoc_TableauVertex &vert)

User Class Only:

ILxNodalService

class ILxNodalService

Public Functions

int AddSampleChan(LXtObjectID self, LXtObjectID eval, LXtObjectID item, int chanIndex, int *idxArray, int type)

The nodal service is used to establish and evaluate channels as part of the Nodal Shading system. The service is used by textures & shaders in two ways: as part of the Shader Tree, their inputs can be evaluated on a per-sample basis, and their outputs can also be requested as part of the Nodal Modifier system. The Nodal Service will transparently handle both of these cases. AddSampleChan & AddSampleChanName are used to add a channel of an item to the nodal evaluation system. When processed as part of the Shader Tree, the evaluator index will be stored in the ‘idxArray’ passed, and when processed as a nodal modifier, the evaluator index will be stored internally within the nodal evaluator (and ‘idxArray’ may be NULL). Additionally, within the Shader Tree, if the channel is not actually driven on a per-sample basis for the current pass, the evaluator index is stored as LXiNODAL_NOT_DRIVEN. This value speeds up the evaluations by letting the Get* methods know that the value does not have to be read from the evaluator. When adding channels for texture locators, LXfECHAN_LOCATOR should be ORed with the LXfECHAN_READ and/or LXfECHAN_WRITE flags. GetFloat, GetInt & GetValue are used to get the current sample values from a nodal evaluator. ‘index’ is the index of channel in the item. For evaluations in Shader Tree, the values will be read from the evaluator using the ‘idxArray’ passed, unless the stored index is LXiNODAL_NOT_DRIVEN, in which case the ‘orig’ value will be returned. When evaluated as a nodal modifier, the internal index array will be used. IsDriven & IsDrivenName are used to determine if a channel is driven per-sample, and therefore needs to be read at every sample. If not, the value can be read once per layer. AnyDrivenChans is used for optimization of the evaluation. It is passed a contiguous array of evaluator indexes, and will return LXe_TRUE for the first sample-driven channel, and LXe_FALSE if none are found.

int AddSampleChanName(LXtObjectID self, LXtObjectID eval, LXtObjectID item, const char *chanName, int *idxArray, int type)
double GetFloat(LXtObjectID self, LXtObjectID etor, int *idxArray, int index, double orig)
int GetInt(LXtObjectID self, LXtObjectID etor, int *idxArray, int index, int orig)
void *GetValue(LXtObjectID self, LXtObjectID etor, int *idxArray, int index, void *orig)
int IsDriven(LXtObjectID self, LXtObjectID item, int chanIndex)
int IsDrivenName(LXtObjectID self, LXtObjectID item, const char *chanName)
int AnyDrivenChans(LXtObjectID self, int *chans, int count)

LXtSampleIndex

struct st_LXtSampleIndex

This structure can be used to simplify conversion from the older value textures. It contains 3 indexes, the channel index inthe item, the evaluator index for the per-layer data, and the evaluator index for the per-sample data.

Public Members

unsigned chan
unsigned layer
  • LXfECHAN_LOCATOR

  • LXiNODAL_NOT_DRIVEN

ILxTableauListener

class ILxTableauListener

Public Functions

void ChannelChange(LXtObjectID self, LXtObjectID tableau, LXtObjectID item, int channel)

In order for plugins to listen to events, we provide the following event translator interface. A tableau channel change event is a general event such that a plugin can listen for any channel changes through the tableau. This is useful for plugins which generate tableau elements, as it gets events on both animation and general modification events, so it’s simple to then fire a tableau update event.

void FlushElements(LXtObjectID self, LXtObjectID tableau)

The only two other events are when a tableau indicates that every element in the tableau is being flushed, and when the tableau is warning clients that it is being destroyed.

void TableauDestroy(LXtObjectID self, LXtObjectID tableau)

ILxTableauSource1

class ILxTableauSource1

Public Functions

LxResult Elements(LXtObjectID self, LXtObjectID tableau)

The TableauSource1 interface is the legacy interface, without the ElementType function.

LxResult Preview(LXtObjectID self, LXtObjectID tableau)
LxResult Instance(LXtObjectID self, LXtObjectID tableau, LXtObjectID instance)
LxResult SubShader(LXtObjectID self, LXtObjectID tableau, void **ppvObj)
LxResult PreviewUpdate(LXtObjectID self, int chanIndex, int *update)
LxResult GetCurves(LXtObjectID self, LXtObjectID tableau, LXtObjectID tags, void **ppvObj)

ILxTableauInstance1

class ILxTableauInstance1

Public Functions

LxResult Properties(LXtObjectID self, LXtObjectID vecstack)
LxResult GetTransform(LXtObjectID self, unsigned endPoint, LXtVector offset, LXtMatrix xfrm)
  • LXsITYPE_ENVMATERIAL

  • LXsICHAN_ENVMATERIAL_TYPE

  • LXsICHAN_ENVMATERIAL_ZENCOLOR

  • LXsICHAN_ENVMATERIAL_SKYCOLOR

  • LXsICHAN_ENVMATERIAL_GNDCOLOR

  • LXsICHAN_ENVMATERIAL_NADCOLOR

  • LXsICHAN_ENVMATERIAL_SKYEXP

  • LXsICHAN_ENVMATERIAL_GNDEXP

  • LXsICHAN_ENVMATERIAL_HAZE

  • LXsICHAN_ENVMATERIAL_NORMALIZE

  • LXsICHAN_ENVMATERIAL_DISC

  • LXsICHAN_ENVMATERIAL_CLMPGAMMA

  • LXsICHAN_ENVMATERIAL_FOG_TYPE

  • LXsICHAN_ENVMATERIAL_FOG_START

  • LXsICHAN_ENVMATERIAL_FOG_END

  • LXsICHAN_ENVMATERIAL_FOG_DENSITY

  • LXsICHAN_ENVMATERIAL_FOG_HEIGHT

  • LXsICHAN_ENVMATERIAL_FOG_FALLOFF

  • LXsICHAN_ENVMATERIAL_ALBEDOCOLOR

  • LXsICHAN_ENVMATERIAL_DISCCOLOR

  • LXsICHAN_ENVMATERIAL_INSCATTER

  • LXsICVAL_ENVMATERIAL_ENVTYPE_CONSTANT

  • LXsICVAL_ENVMATERIAL_ENVTYPE_GRAD2

  • LXsICVAL_ENVMATERIAL_ENVTYPE_GRAD4

  • LXsICVAL_ENVMATERIAL_ENVTYPE_OVERCAST