text:
Tableau (lx-tableau.hpp)
- 1 Tableau
- 1.1 (1) SDK: Tableau::Time, etc.
- 1.2 (2) SDK: Tableau::Channels
- 1.3 (3) SDK: LXiTBX_CHANS_T0, etc. defines
- 1.4 (4) SDK: Tableau::Visible
- 1.5 (5) SDK: Tableau::FindShader
- 1.6 (6) SDK: Tableau::InstanceItem
- 1.7 (7) SDK: Tableau::Update, etc.
- 1.8 (8) SDK: LXiTBX_SURF_ADD, etc. defines
- 1.9 (9) SDK: LXiTBX_INST_ADD, etc. defines
- 1.10 (10) SDK: Tableau::AddInstanceItem
- 1.11 (11) SDK: Tableau::AddInstanceableElement
- 1.12 (12) SDK: LXu_TABLEAU define
- 1.13 (13) SDK: CLxUser_Tableau::Time0 method
- 1.14 (14) PY: empty Tableau user class
- 1.15 3D Elements
- 1.15.1 (15) SDK Common: Element methods
- 1.15.2 (16) SDK: Types
- 1.15.3 (17) SDK: LXe_INFINITE_BOUND define
- 1.15.4 (18) SDK Common: Element methods
- 1.15.5 (19) SDK: LXiTBLX_BASEFEATURE, etc. defines
- 1.15.6 (20) SDK: ILxTableauElement interface
- 1.15.7 (21) SDK: empty TableauElement User Class
- 1.15.8 (22) PY: empty TableauElement user class
- 1.15.9 (23) SDK: LXu_TABLEAUELEMENT, etc. defines
- 1.15.10 Surfaces
- 184.108.40.206 (24) SDK: TableauSurface::Sample
- 220.127.116.11 (25) SDK: TableauSurface::Padding
- 220.127.116.11 (26) SDK: TableauSurface::SegmentBox
- 184.108.40.206 (27) SDK: LXeTBLXSURF_ADAPTIVE define
- 22.214.171.124 (28) SDK: empty TableauSurface User Class
- 18.104.22.168 (29) PY: empty TableauSurface user class
- 184.108.40.206 (30) SDK: TriangleSoup::TestBox, etc.
- 18.104.22.168 (31) SDK: LXiTBLX_SEG_POINT, etc. defines
- 188.8.131.52 (32) SDK: TriangleSoup::Vertex, etc.
- 18.104.22.168 (33) SDK: TriangleSoup::Connect
- 188.8.131.52 (34) PY: empty TriangleSoup user class
- 22.214.171.124 (35) SDK: LXiTBLX_CONNECT_QUAD, etc. defines
- 126.96.36.199 (36) SDK: CLxUser_TriangleSoup::Quad method
- 22.214.171.124 (37) SDK: LXu_TABLEAUSURFACE, etc. defines
- 1.15.11 Volumes
- 1.15.12 Lights
- 184.108.40.206 (42) SDK: TableauLight::Sample, etc.
- 184.108.40.206 (43) PY: empty TableauLight user class
- 220.127.116.11 (44) SDK: LightSample::Vertex
- 126.96.36.199 (45) SDK: LXu_TABLEAULIGHT, etc. defines
- 220.127.116.11 (46) PY: empty LightSample user class
- 220.127.116.11 (47) SDK: LXpLightQuality struct
- 18.104.22.168 (48) SDK: LXpLightShadowing struct
- 220.127.116.11 (49) SDK: LXpLightSource struct
- 220.127.116.11 (50) SDK: LXpLightColor struct
- 22.214.171.124 (51) SDK: LXsP_LGT_QUALITY, etc. defines
- 18.104.22.168 (52) SDK: LXs_FX_LIGHTCOLOR, etc. defines
- 188.8.131.52 (53) SDK: LXs_FX_VOLSCATTER, etc. defines
- 1.15.13 Proxies
- 1.15.14 Instances
- 126.96.36.199 (57) SDK: TableauInstance::Properties
- 22.214.171.124 (58) SDK: TableauInstance::GetTransform
- 126.96.36.199 (59) SDK: TableauInstance::GetDissolve
- 188.8.131.52 (60) SDK: TableauInstance::ParticleDescription, etc.
- 220.127.116.11 (61) SDK: LXu_TABLEAUINSTANCE, etc. defines
- 188.8.131.52 (62) SDK: empty TableauInstance User Class
- 188.8.131.52 (63) PY: empty TableauInstance user class
- 1.16 Shaders
- 1.17 Environment
- 1.17.1 (70) SDK: LXpCameraRay struct
- 1.17.2 (71) SDK: LXpEnvInfiniteColor struct
- 1.17.3 (72) SDK: LXpEnvVisibility struct
- 1.17.4 (73) SDK: LXpEnvShape struct
- 1.17.5 (74) SDK: LXpEnvFog struct
- 1.17.6 (75) SDK: LXpGlobalLighting struct
- 1.17.7 (76) SDK: LXpGlobalDisplacement struct
- 1.17.8 (77) SDK: LXpGlobalIndirect struct
- 1.17.9 (78) SDK: LXpGlobalCaustics struct
- 1.17.10 (79) SDK: LXpGlobalRendering struct
- 1.17.11 (80) SDK: LXsP_CAM_RAY, etc. defines
- 1.18 Camera
- 1.19 Filters
- 1.20 Item Interface
- 1.20.1 (90) SDK: LXfTBLX_PREVIEW_UPDATE_NONE, etc. defines
- 1.20.2 (91) SDK: LXiTBXELT_SURFACE, etc. defines
- 1.20.3 (92) SDK: TableauSource::Elements, etc.
- 1.20.4 (93) SDK: LXu_TABLEAUSOURCE define
- 1.20.5 (94) PY: empty TableauSource user class
- 1.20.6 (95) SDK: LXu_INSTANCEABLE, etc. defines
- 1.20.7 (96) SDK: Instanceable::Compare
- 1.20.8 (97) SDK: Instanceable::AddElements
- 1.20.9 (98) SDK: Instanceable::GetSurface
- 1.21 Tableau Service
- 1.22 Nodal Service
- 1.23 Tableau Event Translator
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.
(1) SDK: Tableau::Time, etc.
LXxMETHOD( LxResult, Time) ( LXtObjectID self, float *t0, float *interval); LXxMETHOD( LxResult, AddElement) ( LXtObjectID self, LXtObjectID element, LXtObjectID shader); LXxMETHOD( LxResult, AddInstance) ( LXtObjectID self, LXtObjectID inst, LXtObjectID element, LXtObjectID shader);
Get a ChannelRead object for subframe times: 'type' is 0,1,2 for t0, t1 and frame time.
(2) SDK: Tableau::Channels
LXxMETHOD( LxResult, Channels) ( LXtObjectID self, unsigned type, void **ppvObj);
(3) SDK: LXiTBX_CHANS_T0, etc. defines
#define LXiTBX_CHANS_T0 0 #define LXiTBX_CHANS_T1 1 #define LXiTBX_CHANS_FRAME 2
Returns LXe_TRUE for items that are visible in this tableau.
(4) SDK: Tableau::Visible
LXxMETHOD ( LxResult, Visible) ( LXtObjectID self, LXtObjectID item);
Get a tableau shader given an item and string tags for material tags.
(5) SDK: Tableau::FindShader
LXxMETHOD( LxResult, FindShader) ( LXtObjectID self, LXtObjectID item, LXtObjectID tags, void **ppvObj);
Return a peek of the item currently being instanced.
(6) SDK: Tableau::InstanceItem
LXxMETHOD( LXtObjectID, InstanceItem) ( LXtObjectID self);
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.
(7) SDK: Tableau::Update, etc.
LXxMETHOD( LxResult, Update) ( LXtObjectID self, LXtObjectID visitor, int immediate); LXxMETHOD( LxResult, UpdateAll) ( LXtObjectID self); LXxMETHOD( LxResult, EltNotify) ( LXtObjectID self, LXtObjectID element, int event); LXxMETHOD( LxResult, InstNotify) ( LXtObjectID self, LXtObjectID instance, int event);
EltNotify can have the following events.
(8) SDK: LXiTBX_SURF_ADD, etc. defines
#define LXiTBX_SURF_ADD 0x0 #define LXiTBX_SURF_REMOVE (LXiTBX_SURF_ADD + 1) #define LXiTBX_SURF_GEO (LXiTBX_SURF_REMOVE + 1) #define LXiTBX_SURF_XFRM (LXiTBX_SURF_GEO + 1) #define LXiTBX_SURF_SHADER (LXiTBX_SURF_XFRM + 1) #define LXiTBX_LGT_ADD (LXiTBX_SURF_SHADER + 1) #define LXiTBX_LGT_REMOVE (LXiTBX_LGT_ADD + 1) #define LXiTBX_LGT_DATA (LXiTBX_LGT_REMOVE + 1) #define LXiTBX_LGT_XFRM (LXiTBX_LGT_DATA + 1) #define LXiTBX_LGT_SHADER (LXiTBX_LGT_XFRM + 1) #define LXiTBX_LGT_GEO (LXiTBX_VOL_SHADER + 1) #define LXiTBX_VOL_ADD (LXiTBX_LGT_SHADER + 1) #define LXiTBX_VOL_REMOVE (LXiTBX_VOL_ADD + 1) #define LXiTBX_VOL_DATA (LXiTBX_VOL_REMOVE + 1) #define LXiTBX_VOL_XFRM (LXiTBX_VOL_DATA + 1) #define LXiTBX_VOL_SHADER (LXiTBX_VOL_XFRM + 1)
And InstNotify has a smaller set of events.
(9) SDK: LXiTBX_INST_ADD, etc. defines
#define LXiTBX_INST_ADD 0x0 #define LXiTBX_INST_REMOVE (LXiTBX_INST_ADD + 1) #define LXiTBX_INST_XFRM (LXiTBX_INST_REMOVE + 1)
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.
(10) SDK: Tableau::AddInstanceItem
LXxMETHOD( LxResult, AddInstanceItem) ( LXtObjectID self, LXtObjectID instItem, LXtObjectID fromItem, LXtObjectID inst, LXtObjectID vdesc, const float *vertex);
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.
(11) SDK: Tableau::AddInstanceableElement
LXxMETHOD( LxResult, AddInstanceableElement) ( LXtObjectID self, LXtObjectID elt, LXtObjectID tags);
(12) SDK: LXu_TABLEAU define
#define LXu_TABLEAU "76C4EDD9-5FF9-4342-BB08-EFCD0B344004"
(13) SDK: CLxUser_Tableau::Time0 method
float Time0 (void) { float t0, dt; Time (&t0, &dt); return t0; } float Time1 (void) { float t0, dt; Time (&t0, &dt); return t0 + dt; } bool IsVisible ( ILxUnknownID item) { return (Visible (item) == LXe_TRUE) ? true : false; } bool GetShader ( CLxLoc_TableauShader &shader, ILxUnknownID item, ILxUnknownID tags) { LXtObjectID obj; if (LXx_FAIL (FindShader (item, tags, &obj))) return false; return shader.take (obj); } bool GetChannels ( CLxLoc_ChannelRead &chan, unsigned type) { LXtObjectID obj; if (LXx_FAIL (Channels (type, &obj))) return false; return chan.take (obj); } LxResult VisitorUpdate ( CLxImpl_AbstractVisitor *visitor, int immediate) { CLxInst_OneVisitor<CLxGenericVisitor> gv; gv.loc.vis = visitor; return Update (gv, immediate); }
Empty Tableau Python user class.
(14) PY: empty Tableau user class
3D Elements
Every element should provide some bound on its location in model space. This is given as an axis-aligned bounding box encoded as a six-element vector, where the first triple is the lower corner and second is the upper corner. Elements may also indicate that they have an infinite bound.
Note: this should *not* return an error code unless there is a serious error. A missing element should return LXe_OK with zero for all bounds.
(15) SDK Common: Element methods
LXxMETHOD( LxResult, Bound) ( LXtObjectID self, LXtTableauBox bbox);
(16) SDK: Types
typedef float LXtTableauBox[6];
(17) SDK: LXe_INFINITE_BOUND define
#define LXe_INFINITE_BOUND LXxGOODCODE(LXeSYS_REND,1)
Query for vertex data, like generalized VMaps. All elements can also have a vertex description selected, which should match available features.
(18) SDK Common: Element methods
LXxMETHOD( unsigned int, FeatureCount) ( LXtObjectID self, LXtID4 type); LXxMETHOD( LxResult, FeatureByIndex) ( LXtObjectID self, LXtID4 type, unsigned int index, const char **name); LXxMETHOD( LxResult, SetVertex) ( LXtObjectID self, LXtObjectID vdesc);
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.
(19) SDK: LXiTBLX_BASEFEATURE, etc. defines
#define LXiTBLX_BASEFEATURE LXxID4(' ','v','r','t') #define LXsTBLX_FEATURE_POS "pos" #define LXsTBLX_FEATURE_OBJPOS "opos" #define LXsTBLX_FEATURE_VEL "vel" #define LXsTBLX_FEATURE_NORMAL "norm" #define LXsTBLX_FEATURE_RADIUS "rad" #define LXsTBLX_FEATURE_PARAM_LENGTH "plen" #define LXsTBLX_FEATURE_PARTID "partID" #define LXsTBLX_FEATURE_RADIANCE "radiance" #define LXsTBLX_FEATURE_TENSION "tension" #define LXsTBLX_FEATURE_TORSION "torsion" #define LXiTBLX_DPDU LXxID4('d','p','d','u') #define LXiTBLX_TBASIS LXxID4('T','B','A','S')
(20) SDK: ILxTableauElement interface
''[[#C15|SDK Common: Element methods]]''
(21) SDK: empty TableauElement User Class
Empty TableauElement Python user class.
(22) PY: empty TableauElement user class
(23) SDK: LXu_TABLEAUELEMENT, etc. defines
#define LXu_TABLEAUELEMENT "71D90AD9-3E30-4CE8-9E2B-F70DA281B2DC" #define LXa_TABLEAUELEMENT "tableauElement"
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.
(24) SDK: TableauSurface::Sample
''[[#C15|SDK Common: Element methods]]'' LXxMETHOD( LxResult, Sample) ( LXtObjectID self, const LXtTableauBox bbox, float scale, LXtObjectID trisoup);
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.
(25) SDK: TableauSurface::Padding
LXxMETHOD( LxResult, Padding) ( LXtObjectID self, float *dist);
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.
(26) SDK: TableauSurface::SegmentBox
LXxMETHOD( LxResult, SegmentBox) ( LXtObjectID self, unsigned int segID, LXtTableauBox bbox);
The Bound() method for surfaces (since it cannot return "infinite") may also return a success code indicating that the surface supports adaptive subdivision.
(27) SDK: LXeTBLXSURF_ADAPTIVE define
#define LXeTBLXSURF_ADAPTIVE LXxGOODCODE(LXeSYS_REND,2)
(28) SDK: empty TableauSurface User Class
Empty TableauSurface Python user class.
(29) PY: empty TableauSurface user class
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.
(30) SDK: TriangleSoup::TestBox, etc.
LXxMETHOD( unsigned int, TestBox) ( LXtObjectID self, const LXtTableauBox bbox); LXxMETHOD( LxResult, Segment) ( LXtObjectID self, unsigned int segID, unsigned int type);
(31) SDK: LXiTBLX_SEG_POINT, etc. defines
#define LXiTBLX_SEG_POINT 1 #define LXiTBLX_SEG_LINE 2 #define LXiTBLX_SEG_TRIANGLE 3
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.
(32) SDK: TriangleSoup::Vertex, etc.
LXxMETHOD( LxResult, Vertex) ( LXtObjectID self, const float *vertex, unsigned int *index); LXxMETHOD( LxResult, Polygon) ( LXtObjectID self, unsigned int v0, unsigned int v1, unsigned int v2);
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.
(33) SDK: TriangleSoup::Connect
LXxMETHOD( void, Connect) ( LXtObjectID self, unsigned int type);
Empty TriangleSoup Python user class.
(34) PY: empty TriangleSoup user class
|This indicates that two triangles form a quad. If a quad is given by the points 0, 1, 2, 3, then the calls would be polygon(0,1,2), connect(QUAD), polygon(0,2,3). For clients that understand quads, the last point of the second triangle is the fourth point of the quad.
|These mark the start and end of continuous curves. If the soup has type 2, such that each polygon is really a pair of endpoints, then this can be used to indicate that the lines are really part of a curve. For a curve consisting of the points 0, 1, 2, 3, the calling sequence is connect(BEGIN), polygon(0,1), polygon(1,2), polygon(2,3), polygon(3,4), connect(END).
(35) SDK: LXiTBLX_CONNECT_QUAD, etc. defines
#define LXiTBLX_CONNECT_QUAD 0 #define LXiTBLX_CONNECT_BEGIN 1 #define LXiTBLX_CONNECT_END 2
The user method allows quads to be created with connectivity.
(36) SDK: CLxUser_TriangleSoup::Quad method
LxResult Quad ( unsigned int v0, unsigned int v1, unsigned int v2, unsigned int v3) { LxResult rc; rc = Polygon (v0, v1, v2); if (LXx_FAIL (rc)) return rc; Connect (LXiTBLX_CONNECT_QUAD); return Polygon (v0, v2, v3); }
(37) SDK: LXu_TABLEAUSURFACE, etc. defines
#define LXu_TABLEAUSURFACE "F785D229-6BA5-4C8E-9994-3E502053B83C" #define LXu_TRIANGLESOUP "17536C2D-07BD-49C8-8348-CEBDE4D3A856"
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.
|Returns the volume evaluate flags. We support 3 types that can be implemented simultaneously on the same element:
(38) SDK: LXfTBLX_VOL_VOLUME, etc. defines
#define LXfTBLX_VOL_VOLUME 1 #define LXfTBLX_VOL_CLIPPING 2 #define LXfTBLX_VOL_IMPSURF 4 #define LXfTBLX_VOL_LOCAL_SHADER 5
|After the tableau has fully been populated and the sample vector has been set, but before the first ray is fired, volumes are initialized.
|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.
|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.
|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.
(39) SDK: TableauVolume::Type, etc.
''[[#C15|SDK Common: Element methods]]'' LXxMETHOD( int, Type) ( LXtObjectID self); LXxMETHOD( LxResult, RenderInit) ( LXtObjectID self, LXtObjectID sv); LXxMETHOD( LxResult, RaySample) ( LXtObjectID self, LXtObjectID densitySlice, LXtObjectID shadingSlice, LXtObjectID sv, LXtObjectID raycastObj, LXtObjectID raymarchObj); LXxMETHOD( LxResult, RayCast) ( LXtObjectID self, LXtObjectID densitySlice, LXtObjectID sv, LXtObjectID raycastObj, double *dist, int *localShader); LXxMETHOD( LxResult, Density) ( LXtObjectID self, LXtObjectID densitySlice, LXtObjectID sv, LXtObjectID raycastObj, const LXtVector pos, int worldPos, double *dens);
(40) SDK: LXu_TABLEAUVOLUME, etc. defines
#define LXu_TABLEAUVOLUME "97962302-4B49-4282-B259-F347F1012818" #define LXa_TABLEAUVOLUME "tableauVolume"
Empty TableauVolume Python user class.
(41) PY: empty TableauVolume user class
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.
(42) SDK: TableauLight::Sample, etc.
''[[#C15|SDK Common: Element methods]]'' LXxMETHOD( LxResult, Sample) ( LXtObjectID self, float u, float v, const LXtFVector dir, LXtFVector wPos, LXtFVector oPos, LXtFVector norm, float t); LXxMETHOD( int, Geometry) ( LXtObjectID self, void *gc); LXxMETHOD( LxResult, Emit) ( LXtObjectID self, unsigned int nPhotons, int offset, LXtObjectID slice, LXtSampleVectorID sv); LXxMETHOD( int, ShadowMap) ( LXtObjectID self, void **ppvObj);
Empty TableauLight Python user class.
(43) PY: empty TableauLight user class
(44) SDK: LightSample::Vertex
LXxMETHOD( void, Vertex) ( LXtObjectID self, const float *vertex);
(45) SDK: LXu_TABLEAULIGHT, etc. defines
#define LXu_TABLEAULIGHT "7FE816D1-4A7F-4BE5-9689-4991C03CAEE0" #define LXa_TABLEAULIGHT "tableauLight" #define LXu_LIGHTSAMPLE "43734621-9B93-4174-AC63-E2FE7DDA8794"
Empty LightSample Python user class.
(46) PY: empty LightSample user class
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.
(47) SDK: LXpLightQuality struct
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;
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.
(48) SDK: LXpLightShadowing struct
LXtFVector pos; LXtFVector ray, up; float angle; unsigned int mapRes; void *exclude;
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.
(49) SDK: LXpLightSource struct
LXtFVector wPos, oPos; LXtFVector dir, norm; float len; float nDotWi; int sampleIndex; void *lightSource; void *lightItem;
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.
(50) SDK: LXpLightColor struct
LXtFVector color; LXtFVector shadow; LXtFVector unshad; float diffuse; float specular; float caustics; float subsurface; float brightness; float pdf;
(51) SDK: LXsP_LGT_QUALITY, etc. defines
#define LXsP_LGT_QUALITY "light.quality" #define LXsP_LGT_SHADOWING "light.shadowing" #define LXsP_LGT_SOURCE "light.source" #define LXsP_LGT_COLOR "light.color"
These are the texture effect names that apply to lights.
(52) SDK: LXs_FX_LIGHTCOLOR, etc. defines
#define LXs_FX_LIGHTCOLOR "lightColor" #define LXs_FX_LIGHTSHADOW "lightShadow" #define LXs_FX_LIGHTDIFFUSE "lightDiffuse" #define LXs_FX_LIGHTSPECULAR "lightSpecular" #define LXs_FX_LIGHTCAUSTICS "lightCaustics" #define LXs_FX_LIGHTDISTANCE "lightDistance" #define LXs_FX_LIGHTANGLE "lightAngle"
These are the texture effect names that apply to volumetrics.
(53) SDK: LXs_FX_VOLSCATTER, etc. defines
#define LXs_FX_VOLSCATTER "volScattering" #define LXs_FX_VOLSCATTER_COL "volScatteringColor" #define LXs_FX_VOLABSORB "volAbsorption" #define LXs_FX_VOLABSORB_COL "volAbsorptionColor" #define LXs_FX_VOLDENSITY "volDensity" #define LXs_FX_VOLLEVEL "volLevel" #define LXs_FX_VOLSMPDENSITY "volSampleDensity" #define LXs_FX_VOLAMB_COL "volAmbientColor" #define LXs_FX_VOLLUMI "volLuminosity" #define LXs_FX_VOLLUMI_COL "volLuminosityColor"
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.
(54) SDK: TableauProxy::Sample
''[[#C15|SDK Common: Element methods]]'' LXxMETHOD( LxResult, Sample) ( LXtObjectID self, const LXtTableauBox bbox, LXtObjectID tableau);
(55) SDK: LXu_TABLEAUPROXY, etc. defines
#define LXu_TABLEAUPROXY "FB34BD64-099C-4B30-8EF7-2BB04CA0E92C" #define LXa_TABLEAUPROXY "tableauProxy"
Empty TableauProxy Python user class.
(56) PY: empty TableauProxy user class
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.
(57) SDK: TableauInstance::Properties
LXxMETHOD( LxResult, Properties) ( LXtObjectID self, LXtObjectID vecstack);
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.
(58) SDK: TableauInstance::GetTransform
LXxMETHOD( LxResult, GetTransform) ( LXtObjectID self, unsigned endPoint, LXtVector offset, LXtMatrix xfrm);
The instance may be dissolved independently.
(59) SDK: TableauInstance::GetDissolve
LXxMETHOD( LxResult, GetDissolve) ( LXtObjectID self, double *dissolve);
An instance can define particle features. These are given by a tableau vertex to describe the feature vector, which can then be read.
(60) SDK: TableauInstance::ParticleDescription, etc.
LXxMETHOD( LxResult, ParticleDescription) ( LXtObjectID self, void **ppvObj); LXxMETHOD( LxResult, ParticleArray) ( LXtObjectID self, float *vector);
(61) SDK: LXu_TABLEAUINSTANCE, etc. defines
#define LXu_TABLEAUINSTANCE "77837A98-2BC5-466C-834F-DC937642558B" #define LXa_TABLEAUINSTANCE "tableauInstance2" #define LXiTBLX_ENDPOINT_T0 0 #define LXiTBLX_ENDPOINT_T1 1
(62) SDK: empty TableauInstance User Class
Empty TableauInstance Python user class.
(63) PY: empty TableauInstance user class
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.
(64) SDK: TableauShader::Select, etc.
LXxMETHOD( LxResult, Select) ( LXtObjectID self, LXtObjectID teElt, LXtObjectID tvDesc); LXxMETHOD( LxResult, Slice) ( LXtObjectID self, LXtObjectID vtOutput, LXtObjectID tvDesc, void **ppvObj);
(65) SDK: CLxUser_TableauShader::GetSlice method
bool GetSlice ( CLxLoc_ShaderSlice &slice, ILxUnknownID vtOutput, ILxUnknownID tvDesc) { LXtObjectID obj; if (LXx_FAIL (Slice (vtOutput, tvDesc, &obj))) return false; return slice.take (obj); }
Empty TableauShader Python user class.
(66) PY: empty TableauShader user class
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.
(67) SDK: ShaderSlice::Evaluate
LXxMETHOD( LxResult, Evaluate) ( LXtObjectID self, LXtObjectID vecstack);
(68) SDK: LXu_TABLEAUSHADER, etc. defines
#define LXu_TABLEAUSHADER "A0E3B574-B0AC-4530-A43F-7CC8DA536E25" #define LXa_TABLEAUSHADER "tableauShader" #define LXu_SHADERSLICE "47B885B9-B1D9-4F86-829F-A6AABBD7FFF7"
Empty ShaderSlice Python user class.
(69) PY: empty ShaderSlice user class
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.
(70) SDK: LXpCameraRay struct
LXtFVector dir; LXtFVector origin; float spread;
(71) SDK: LXpEnvInfiniteColor struct
LXtFVector rgb; float intensity;
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.
(72) SDK: LXpEnvVisibility struct
unsigned int camera; unsigned int indirect; unsigned int reflection; unsigned int refraction;
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.
(73) SDK: LXpEnvShape struct
unsigned int sphereVis; float size; float height; unsigned int flatten; LXtVector pos; LXtMatrix xfrmInv;
An environment can also provide fog values indicating color and absorption values.
(74) SDK: LXpEnvFog struct
LXtFVector color; LXtFVector opacity;
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.
(75) SDK: LXpGlobalLighting struct
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;
Displacement settings.
(76) SDK: LXpGlobalDisplacement struct
float rate; float ratio; float jitter; float edgeMin; unsigned int enable; unsigned int smooth; unsigned int useBump;
Indirect illumination and caustics settings.
(77) SDK: LXpGlobalIndirect struct
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;
(78) SDK: LXpGlobalCaustics struct
float multiplier; unsigned int total; unsigned int local; unsigned int walk;
Miscellaneous render settings, specific to our built-in renderer.
(79) SDK: LXpGlobalRendering struct
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;
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.
(80) SDK: LXsP_CAM_RAY, etc. defines
#define LXsP_CAM_RAY "camera.ray" #define LXsP_CAM_RAY_T1 "camera.ray_T1" #define LXsP_ENV_INFINITECOLOR "environment.color" #define LXsP_ENV_VISIBILITY "environment.visibility" #define LXsP_GLO_LIGHTING "global.lighting" #define LXsP_GLO_DISPLACEMENT "global.displacement" #define LXsP_GLO_INDIRECT "global.indirect" #define LXsP_GLO_CAUSTICS "global.caustics" #define LXsP_GLO_RENDERING "global.rendering"
Note that environment shape is intentionally NOT exposed to the SDK, since it's only for SolidWorks.
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.
(81) SDK: LXpCameraResolution struct
unsigned int width; unsigned int height; float pixelAspect; float dpi; // float samples; // float rate; float regX0, regX1, regY0, regY1;
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.
(82) SDK: LXpCameraFrustum struct
LXtFVector eyePos; LXtMatrix xfrm, invXfrm; float focalLength; float focusDist, fStop; float irisRot, irisBias, distort; float ioDist, convDist; float blurLength, blurOffset; float apertureX, apertureY; float offsetX, offsetY; float squeeze; float target; float clipDist; int clipping; int filmFit; int projType; int irisBlades; void *item; int useMask; float overscan;
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.
(83) SDK: LXpCameraPixel struct
float x, y;
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.
(84) SDK: LXpCameraUVBake struct
const char *name;
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.
(85) SDK: LXsP_CAM_RESOLUTION, etc. defines
#define LXsP_CAM_RESOLUTION "camera.resolution" #define LXsP_CAM_FRUSTUM "camera.frustum" #define LXsP_CAM_FRUSTUM_T1 "camera.frustum_T1" #define LXsP_CAM_PIXEL "camera.pixel" #define LXsP_CAM_UVBAKE "camera.uvBake"
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.
(86) SDK: TableauFilter::Order, etc.
LXxMETHOD( const char *, Order) ( LXtObjectID self); LXxMETHOD( LxResult, Select) ( LXtObjectID self, LXtObjectID framebuf); LXxMETHOD( unsigned int, Bound) ( LXtObjectID self, float box[4], float *kernel);
|the filter can process individual pixels, and the Pixel() method is used rather than the region method. If the kernel is also zero then the filter can be used on a single pixel at a time without needing any other region information.
|the filter requires complete strips in order to run. The Region() method will be called with strips scanned from top to bottom of the image. This is typically used by filters which act as image-savers.
|the filter's bounding box and kernel are given as a percentage of the minimum dimenion of the entire frame. This allows for filters that are independent of the size of the rendering.
(87) SDK: LXfTBLX_FILT_PIXEL, etc. defines
#define LXfTBLX_FILT_PIXEL 0x01 #define LXfTBLX_FILT_STRIP 0x02 #define LXfTBLX_FILT_RELATIVE 0x04
The Pixel() and Region() methods are used to do proecessing based on the filter type. Both get the frame buffer and the
(88) SDK: TableauFilter::Pixel, etc.
LXxMETHOD( unsigned int, Pixel) ( LXtObjectID self, LXtObjectID framebuf, const float pos[2]); LXxMETHOD( unsigned int, Region) ( LXtObjectID self, LXtObjectID framebuf, const float box[4]);
(89) SDK: LXu_TABLEAUFILTER, etc. defines
#define LXu_TABLEAUFILTER "FD1326E7-EECF-4EAC-B9AD-B1D64E7503BE" #define LXa_TABLEAUFILTER "tableauFilter"
Item Interface
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.
(90) SDK: LXfTBLX_PREVIEW_UPDATE_NONE, etc. defines
#define LXfTBLX_PREVIEW_UPDATE_NONE 0x00 #define LXfTBLX_PREVIEW_UPDATE_GEOMETRY 0x01 #define LXfTBLX_PREVIEW_UPDATE_SHADING 0x02
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.
|This is called to let the item add elements directly to a tableau.
|This is similar, but is used for adding elements needed to preview this item.
|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.
|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.
|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.
|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.
(91) SDK: LXiTBXELT_SURFACE, etc. defines
#define LXiTBXELT_SURFACE 0 #define LXiTBXELT_VOLUME 1 #define LXiTBXELT_LIGHT 2 #define LXiTBXELT_FILTER 3 #define LXiTBXELT_PROXY 4
(92) SDK: TableauSource::Elements, etc.
LXxMETHOD( LxResult, Elements) ( LXtObjectID self, LXtObjectID tableau); LXxMETHOD( LxResult, Preview) ( LXtObjectID self, LXtObjectID tableau); LXxMETHOD( LxResult, Instance) ( LXtObjectID self, LXtObjectID tableau, LXtObjectID instance); LXxMETHOD( LxResult, SubShader) ( LXtObjectID self, LXtObjectID tableau, void **ppvObj); LXxMETHOD( LxResult, PreviewUpdate) ( LXtObjectID self, int chanIndex, int *update); LXxMETHOD( LxResult, GetCurves) ( LXtObjectID self, LXtObjectID tableau, LXtObjectID tags, void **ppvObj); LXxMETHOD( LxResult, ElementType) ( LXtObjectID self, int type, int *supported);
(93) SDK: LXu_TABLEAUSOURCE define
#define LXu_TABLEAUSOURCE "9CC7F9F4-9540-4EEA-8EE9-710D58EC68F9"
Empty TableauSource Python user class.
(94) PY: empty TableauSource user class
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.
(95) SDK: LXu_INSTANCEABLE, etc. defines
#define LXu_INSTANCEABLE "9CC7F9F4-9540-4EEA-8EE9-710D58EC68F9" #define LXsPKG_INSTANCEABLE_CHANNEL "inst.channel"
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.
(96) SDK: Instanceable::Compare
LXxMETHOD( int, Compare) ( LXtObjectID self, LXtObjectID other);
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.
(97) SDK: Instanceable::AddElements
LXxMETHOD( LxResult, AddElements) ( LXtObjectID self, LXtObjectID tableau, LXtObjectID instT0, LXtObjectID instT1);
Alternately the instanceable object can provide a Surface object which will be added to the tableau.
(98) SDK: Instanceable::GetSurface
LXxMETHOD( LxResult, GetSurface) ( LXtObjectID self, void **ppvObj);
Tableau Service
(99) SDK: TableauService::ScriptQuery, etc.
LXxMETHOD( LxResult, ScriptQuery) ( LXtObjectID self, void **ppvObj); LXxMETHOD( LxResult, AllocVertex) ( LXtObjectID self, void **ppvObj);
(100) SDK: CLxUser_TableauService::NewVertex method
bool NewVertex ( CLxLoc_TableauVertex &vert) { LXtObjectID obj; vert.clear (); if (LXx_FAIL (AllocVertex (&obj))) return false; return vert.take (obj); }
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.
(101) SDK: TableauService::VertexFromFeatures
LXxMETHOD( LxResult, VertexFromFeatures) ( LXtObjectID self, LXtObjectID surfObj, LXtObjectID vertex);
(102) SDK: LXu_TABLEAUSERVICE define
#define LXu_TABLEAUSERVICE "8DF92316-3172-465A-A199-254792D37732"
Empty tableau service Python user class.
(103) PY: empty Service.Tableau user class
Nodal Service
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.
(104) SDK: NodalService::AddSampleChan, etc.
LXxMETHOD( int, AddSampleChan) ( LXtObjectID self, LXtObjectID eval, LXtObjectID item, int chanIndex, int *idxArray, int type); LXxMETHOD( int, AddSampleChanName) ( LXtObjectID self, LXtObjectID eval, LXtObjectID item, const char *chanName, int *idxArray, int type); LXxMETHOD( double, GetFloat) ( LXtObjectID self, LXtObjectID etor, int *idxArray, int index, double orig); LXxMETHOD( int, GetInt) ( LXtObjectID self, LXtObjectID etor, int *idxArray, int index, int orig); LXxMETHOD( void*, GetValue) ( LXtObjectID self, LXtObjectID etor, int *idxArray, int index, void *orig); LXxMETHOD( int, IsDriven) ( LXtObjectID self, LXtObjectID item, int chanIndex); LXxMETHOD( int, IsDrivenName) ( LXtObjectID self, LXtObjectID item, const char *chanName); LXxMETHOD( int, AnyDrivenChans) ( LXtObjectID self, int *chans, int count);
Empty nodal service Python user class.
(105) PY: empty Service.Nodal user class
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.
(106) SDK: LXtSampleIndex struct
unsigned chan; unsigned layer;
(107) SDK: LXfECHAN_LOCATOR, etc. defines
#define LXfECHAN_LOCATOR 0x40000000 #define LXiNODAL_NOT_DRIVEN 0xFFFFFFFF #define LXu_NODALSERVICE "2055F206-1682-11E3-9F05-6ACC6088709B"
Tableau Event Translator
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.
(108) SDK: TableauListener::ChannelChange
LXxMETHOD( void, ChannelChange) ( LXtObjectID self, LXtObjectID tableau, LXtObjectID item, int channel);
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.
(109) SDK: TableauListener::FlushElements
LXxMETHOD( void, FlushElements) ( LXtObjectID self, LXtObjectID tableau);
(110) SDK: TableauListener::TableauDestroy
LXxMETHOD( void, TableauDestroy) ( LXtObjectID self, LXtObjectID tableau);
(111) SDK: LXu_TABLEAULISTENER define
#define LXu_TABLEAULISTENER "848C5B64-4C9F-404E-8E3F-CF725007F74D"


text:
Important Note:
This is an online class through Ed2Go with monthly start dates.
Class InformationCLASS #:INSTRUCTOR:FEES: $115.00DATES:
Clark College Economic and Development carefully recruits and screens our instructors in order to provide the best possible student experience. Selection is based on knowledge of the subject area as well as previous experience teaching or training.
Our local community has a wealth of highly talented individuals to share their experience and knowledge in our continuing education program. Each class is an opportunity to learn from an expert and share the experience with other community members sharing your interest to "Expand Your Potential".
There is no supply list for this class.

subset: commoncrawl


text:
- Dipartimento
- Corsi
- Ricerca
- Servizi
- Vivi padova
- Il bo
Asiago dal 14 al 23 Gennaio 2020
Asiago, 6 - 10 maggio 2019
Web site: http://mavis-ao.org/mavis/2019/05/23/asiago-busy-week.html
Asiago Astrophysical Observatory 9 - 22 September 2018
The school is primarily meant for PhD students in Astronomy, who do not have prior experience in observing with professional 1-2 metre class telescopes. MSc students in the latestages of their thesis work, and young PostDocs who do not have observing experience, can also be concidered.
Web site: http://opticon-schools.nbi.ku.dk/observing-schools/neon-observing-school-2018/
Asiago Astrophysical Observatory 29 July - 4 August 2018
This summer school is arranged in collaboration with the Department of Physics of the University of Oxford. It will consolidate existing collaborations with the Physics and Astronomy Department of the University of Padua and provide opportunities to develop new joint research projects. The school is open to 20 selected graduate students in Physics or Astronomy, coming from any international research institute.
Web site: http://schools.dfa.unipd.it/sbh2018/
Asiago Astrophysical Observatory 18 - 26 June 2018
Goal of the school is to offer graduate students and young researchers an updated, comprehensive view of multi-wavelength astrophysical polarimetry. This is a particularly favourable time for getting together experienced and junior scientists. Polarimetry is entering its golden age thanks to the upcoming space missions (IXPE, XIPE and e-XTP) which, for the first time ever, will systematically perform polarimetry measures in the X-rays. Polarimetry provides an entirely new way to look at the high-energy sky. In particular, it will give key information on highly-magnetic neutron stars (or magnetars), where vacuum birefringence (a Quantum Electrodynamics effect predicted 80 years ago and never measured in the lab) can at last be verified and on the structure and geometry of black hole accretion discs, making it possible to test General Relativity in the strong field limit and obtain an independent measure of the black hole spin. Polarization measurements will test inflation by detecting CMB polarization anisotropies associated with primordial gravitational waves background.
Asiago Astrophysical Observatory 10 - 15 June 2018
This summer school mainly focuses on a deep study of the dynamics of planetary systems from two different points of view. The mathematical approach is based on perturbation theories which were introduced in the mid-20th century by A.N. Kolmogorov, V.I. Arnold and J. Moser. On the other hand, the recent astronomical observations of comets, asteroids and exoplanets from ground and space have largely improved our comprehension of the planetary problem.
Web site: https://events.math.unipd.it/ercschool/
PhD School of Astrophysics Francesco Lucchin
Asiago, 24-28 giugno 2013
Winter School on "Very High Time and Space Resolution Astrophysics" at the Astronomical Observatory of Asiago (Italy), from February 27 to March 7, 2013.


text:
Request a private showing
The Fine Homes Group at Keller Williams Metropolitan is the online destination for searching all homes and land for sale in New Hampshire and the Greater Boston Area and provides users with easy to access information on properties for sale. The Fine Homes Group is a regional real estate team that works with buyers and sellers of exceptional properties.
You can be assured that you will receive the highest level of service and expertise through our network of luxury real estate professionals that will work to exceed your expectations.
The Fine Homes Group wants to be your luxury home resource for life.


text:
Nissan Murano (2009-2014)
FormFit Side Window Visors
In stock
Price includes the cost of shipping to the lower 48 States. If you're in Alaska or Hawaii please click "Contact" for a personalized quote.
- Available for purchase to the US only. No exceptions.
- Made from premium quality 3mm acrylic – durable, scratch resistant, UV stable. Set contains 4 pieces.
- Allows you to drive with your window open while offering protection from the elements. Increased air circulation.
- Each application is precision-fit to your specific vehicle. No cutting or modifications required before installation.
- Installation time in under 15 minutes. Attached via 3M Automotive Grade Adhesive. No direct contact with the window.
- Complement your FormFit Hood Protector with matching Side Window Visors.
Click HERE for a PDF of the installation instructions.


text:
There follows a list of supporters energised - really energised - by the Uefa Super Cup:
Atlético Madrid
So OK, the curtain raiser to the new season of European club football never gets anyone's juices flowing. But a European trophy is a European trophy is a European trophy, an additional line on the old roll of honour, so there are worse ways to spend a Friday evening. Both teams have won this pot once before - Chelsea in 1998, Atlético two years ago - so whoever triumphs tonight will join a relatively short list of multiple Super Cup winners: Milan (5), Barcelona (4), Ajax (3), Liverpool (3), Anderlecht (2), Juventus (2) and Valencia (2). An achievement not to be sniffed at. It is on!
But as if to prove nobody's taking this totally seriously, Premier League benchwarmer Frank Lampard has been recalled to the line-up of the European champions: Cech, Ivanovic, Cahill, Luiz, Cole, Mikel, Lampard, Ramires, Hazard, Mata, Torres.
Subs: Turnbull, Romeu, Oscar, Moses, Meireles, Sturridge, Bertrand.
Meanwhile the Europa League winners name Adrian Lopez in attack: Courtois, Juanfran, Miranda, Godin, Filipe Luis, Mario Suarez, Gabi, Adrian, Koke, Turan, Falcao.
Subs: Sergio Asenjo, Raul Garcia, Rodriguez, Silvio, Cata Diaz, Diego Costa, Emre.
Referee: Damir Skomina (Slovenia)
Kick off: 7.45pm BST, 8.45pm in the local Monaco money.
If the head-to-head record between these two teams is anything to go by, we're in for a cracker. They've only played each other twice, visiting each other in the group stage of the 2009/10 Champions League. Chelsea were the first hosts, and treated their guests most shoddily, skelping them 4-0, two-goal Salomon Kalou the hero (Frank Lampard and a Luis Amaranto Perea own goal the other scoreboard botherers). Chelsea looked like winning the return in Madrid, too, after a late Didier Drogba double blast, but Kun Aguero equalised in injury time, bookending the scoring having also notched the opener. So that's four goals guaranteed, then. Good-o.
Some more good news for Chelsea: They're undefeated against Spanish opposition, home and away, in their last 13 competitive fixtures. That Barcelona, the supposed greatest club side of all time? Pah! Valencia were sent packing in Chelsea's victorious European campaign last season too, 3-0 at Stamford Bridge during the group stage.
Some bad news for Chelsea: Atlético have won their last 12 European matches. Thirteenth time unlucky? We'll see, but they don't mind playing English opposition: the culmination of their 2010 Europa League winning campaign saw them dispatching Liverpool and then Fulham.
And perhaps the most relevant bit: the recent form. Chelsea have, of course, started the season well. They lost the
Community Shield at Villa Park against Manchester City, but did still score twice, although who doesn't against City these days? Then it's been a perfect start to their Premier League campaign: a win at Wigan followed by two more at home to Reading and Newcastle United. Atlético, meanwhile, drew their opening La Liga game at Levante, but sprung into life against Athletic Bilbao with a 4-0 win at the Estadio Vicente Calderón. It is ón!
The teams are out! Chelsea in their all-blue strip with the all-new golden sheen of champions. Atlético are decked out in their famous red and white stripes - although they've had to change their blue shorts to red, the European Cup winners getting first choice. "The bench would suggest that Chelsea really should move for another defender before the day is over, no?" wonders Oliver Pattenden. Do you think they're made of money? Not everyone can throw it about like Manchester City. Speaking of transfers, rumours abound that Michael Essien - signally absent from the Chelsea bench - has been left out because there's a possibility of a loan deal. To, and you'll like this, Arsenal. Best to keep an eye out for that on our rolling Transfer Deadline Day blog. Meanwhile you'll note Daniel Sturridge is on Chelsea's bench, which suggests he won't be going to either Liverpool or Tottenham Hotspur.
They line up, having popped their fancy trophies on bespoke plinths. A pompous and slightly preposterous Uefa song is played - think anthem of despotic regime set to pulsating Europop beat - and then high-fives are exchanged. And then Chelsea kick off!
2 min: Chelsea are knocking this around at the back a lot. Atlético have only touched the ball twice, and that's to throw the ball in and concede possession immediately.
3 min: A first burst of play from Atlético, and they're so close to taking the lead. First Adrian Lopez takes a jog down the inside-left channel and scrapes a poor shot goalwards. It's cleared, but the ball's soon coming back at Chelsea, Filipe Luis being set free into the area down the left. He hacks the ball into the middle for Falcao, who belts a shot past Cech and off the crossbar. Falcao is then upended by Luiz in the breakdown, but that's not a penalty. Although it could have been. Be nice to see that again. Who'd be a referee?
5 min: Filipe Luis bombs down the left again, and lobs a cross to the far post, where Falcao hooks back. Cole cushions a header into Cech's hands. Chelsea are rocking here.
6 min: GOAL! Chelsea 0-1 Atlético Madrid. Chelsea are rocking alright. Chelsea's back line is ripped apart by a simple pass down the middle. Falcao romps after it, picking up possession down the inside-left channel. He takes one step into the area, steadies himself, draws Cech, and dinks an exquisite chip towards the right-hand post. The ball hits the woodwork, and spins into the net, beyond the despairing tootsies of Luiz, who is sliding in at speed. What an amazing finish. Upfield, former charge Fernando Torres looks on in stunned disbelief.
9 min: Chelsea have responded well to that setback, with a couple of charges through Mata and Ramires down the right. Both times the player reaches the byline, but can't thread a cross into the centre. "Falcao's a force of nature," opines Deepu Sebastian Edmond. "For all the Messis and the Ronaldos, this man is going to end up with the most memorable youtube compilation of all time."
12 min: Ramires sweeps the ball wide right for Mata, who curls in a cross towards Torres, on the edge of the area. He chests down for Lampard, whose low drive is deflected, then cushioned, by defensive legs.
13 min: Cutting in from the left, Hazard looks to beat his compatriot Courtois with a rising drive towards the top-right corner. But there's too much juice in the shot, and it flies over the bar. Still, this is much better from the European champions.
16 min: With Mikel lying around in the centre circle like he's down Monte Carlo beach on a towel, Mario Suarez sweeps a ball wide left to the dangerous Adrian Lopez, who bombs all the way to the box down the wing. He cuts inside and looks to have overrun it, but still gets a shot away from a tight-ish angle. Cech parries well. Chelsea want to watch themselves, they're all over the shop down that flank.
18 min: Luiz crosses into the Madrid area from the left. The ball's cleared, but only to Cahill, who has a half-decent dig goalwards. Ramires is in the way, and attempts to flick it on. But he's offside.
19 min: GOAL! Chelsea 0-2 Atlético Madrid. This is such a superlative finish by Falcao. There's a burst up the Atlético inside-right channel. Luiz can't stop the ball flying to Falcao's feet, just outside the area, though he probably should have cut it out. Falcao pauses for the ball to roll out from under his studs, nudges it to the left, taking Cole out of the picture, opens his body, and guides a beautiful effort into the top-left corner. Cech had no chance whatsoever, that was sailing serenely into the net from the nanosecond it left Falcao's boot. This, ladies and gentlemen, is football.
22 min: A pause while Ramieres gets some attention for knee knack. He'll be OK, writes Dr Murray the quack, he's just taken a bit of a belt. Meantime, here's Dave Correia: "For those that didn't know prior to the match, but surely know now, Luiz could never handle Falcao when he played in Portugal and nothing has changed since he went to England."
25 min: The Atlético fans are making one hell of a noise. And who can blame them? Chelsea look punch drunk.
27 min: Luiz wins a challenge with Falcao! Yes, he really does it! A long ball down the right, the striker crashing to the ground, the defender making off with the ball. "Without wishing any ill on him, I can't help but feel Chelsea should be stronger with Mikel lying in the centre circle (16mins) than when he's 'playing'," quips Matt Dony. "Did Man U really get that angry over him going to Chelsea? It seems so hard to believe, now."
29 min: This should have been 3-0. Atlético pour forward, five on three. The ball's slid out right to Gabi, who glides into the area but hits a poor shot straight at Cech. Corner, from which Mario Suarez blasts a header straight at the keeper. Chelsea are second best by some distance here. They're being outplayed in an embarrassing fashion at the moment, with all sorts of gaps opening up at the back.
31 min: A free kick to Atlético down the right. It's lumped into the area. Cech, perhaps mindful that his defenders are running around like a circus troupe, races out to punch clear. It's just as well he did, because there were only red-and-white shirts near that dropping ball. Chelsea are, currently, a shower. "Whoever is controlling Luiz via his Playstation in the crowd is clearly drunk," chirrups
Gary Neville
Ian Copestake.
33 min: This is a bit better from Chelsea, with Mikel attempting to dictate the tempo of play awhile just outside the Madrid area. It's a bonny period of possession, but they can't find a way through a determined back line, with only Ivanovic, bursting down the right, ever threatening to get in behind. Still, baby steps and all, and at least Atlético aren't Luiz-worrying down the other end of the pitch.
35 min: This is a ludicrous double miss by Atlético. Arda Turan breaks clear down the inside right. He's offside, so what follows is a slapstick sort of justice. Turan draws Cech and slides the ball into the six-yard area, where Adrian Lopez waits to tap into an empty net. Instead, he somehow manages to kick the ball into his own back. What an adroit piece of clownsmanship. Still, the ball's hanging invitingly in mid air, waiting for Falcao, rushing in, to head home. The striker's not perfect - he's near it, but not perfect - and nuts the ball against the left-hand upright. Dear me, those were some real komik kutz.
39 min: Adrian Lopez is this close to breaking free down the left, but he's blown up (correctly) for offside. But once again the Chelsea back line are all over the shop. I've not seen Chelsea ripped to shreds like this since the days of
Andre Villas-Boas
Bobby Campbell.
42 min: Atlético have streamed forward three times in the last two minutes. They can't quite make the right pass, so Chelsea get away with it, but they're in an awful mess at the minute.
44 min: GOAL!!! AND A SECOND HAT-TRICK THIS WEEK FOR FALCAO! Chelsea 0-3 Atlético Madrid A corner for Chelsea, won down the left by Mata. So what happens? You know what happens. Atlético clear, then stream upfield, down the right. Arda Turan is allowed to run at the area, and run, and run, and run, and run. He eventually rolls the ball out left to Falcao, who takes one touch and smashes the ball past Cech. In no way can it be argued that this hasn't been coming.
HALF TIME: Chelsea 0-3 Atlético Madrid
Falcao, eh? Bloody hell! The look on poor Fernando Torres' coupon as he departs down the tunnel!
No half-time entertainment tonight, as you'll be too busy keeping track of the late moves on Transfer Deadline Day. But while we're on that subject, here's the latest gossip, courtesy of Paul Gordon: "I know this isn't related directly to the game, but it is Chelsea news. A friend of mine living in Cheshire claims to have just seen Michael Owen charge out of the stables of Manor House standing (STANDING) atop a galloping steed, fully decked out in knighty regalia (chain mail vest and that) chanting 'Chelsea 'till I die'. It seems he's headed towards the M1. According to Google Maps he should be on Fulham Road in three hours 38 minutes (in current traffic). Unless he ditches the horse soon enough he might not make Stamford Bridge before the deadline. Good to see he's showing a little more enthusiasm for the game than usual. Or it might just be a bizarre ritual he performs on his horses once every transfer window to keep them in shape, along with riling up my friend Strange Dave who stalks little Mickey and has been totally incorrect on Michael Owen's movement in every window since August 2005. Still, like a broken clock is right twice a day, a man with severe mental illnesses may be right twice every seven years."
And we're off again, Atlético setting the ball rolling! An English side three down at half time in a European final? We've been here before. So nothing's impossible. Coming on, in the Didi Hamann role, Oscar. The Steve Finnan of the piece? Ramires. Can Chelsea turn this round? It'll be one hell of a task. "Knowing the Chelsea owner's love/lust/obsession with trophies, this performance might cost Di Matteo his job," argues Ian Copestake, in no way trying to start a brouhaha.
47 min: Just like in the opening half, Chelsea pass it around awhile at the back. They're seeing plenty of the ball, but then look how that all panned out. "Do you see Premier League sides counter attacking as Madrid do?" asks Nick Thomas. "I think it is a good lesson for every manager watching tonight."
49 min: It's not really started, this half, but then you could argue that the match is already over, so.
51 min: Koke is very close to breaking clear down the left from a deep position - so deep he's still inside his own half - but nudges the ball out of play. Chelsea, who had been pressing forward, were short at the back there. The ball is shuttled up the other end, where Torres drops a shoulder and tears down the inside-right channel. From the edge of the box, he sends a low shot flying across goal and out of play on the left. Not particularly good, but not egregiously bad either, and Chelsea haven't put together much else tonight, so this goes down as something of an improvement.
52 min: Atlético have an opportunity to break forward again, Arda Turan running with some determination down the left, but most of their men opt to sit back. They're not quite displaying the drive of the opening period, though you can hardly blame them for this. "If Barcelona still wanna pay an alleged £25m for Luiz, I'd get Roman to bung him on his super yacht in Monaco and bomb round the coast quick-smart," suggests the very wise Fraser from Reigate.
54 min: A corner for Atlético down the right, won by Adrian Lopez. Mario Suarez hammers a shot goalwards, but it's deflected out for another corner, which is plucked from the sky by Cech.
56 min: Ivanovic cuts in from the right and threads a pass inside to Hazard, who continues inside before looking for the bottom-right corner. It's a weak effort, though, and easily snaffled by Courtois.
57 min: Cristian Rodriguez comes on for Adrian Lopez.
58 min: Cristian Rodriguez announces himself early doors, pelting down the left wing in acres, then fizzing a cross into the middle for Falcao. With his back to goal, the hat-trick hero takes the ball down brilliantly, and looks to turn through 180 degrees and hammer a shot goalwards, but Luiz is for once relatively near his man, and stubs out the effort at source.
60 min: GOAL!!! Chelsea 0-4 Atlético Madrid This is becoming extremely embarrassing now for the champions of Europe. A free kick to Atlético down the right. The ball's clipped into the area, then allowed to pinball to the feet of Miranda, just to the right of goal. He lifts the ball over Cech, off the skittering Cahill's buttocks, and into the net.
63 min: The travelling Spanish are making a racket in the jaunty style. The English lot look thoroughly miserable, which isn't too surprising. But Chelsea fans should retain some perspective: things could be much worse. You could support Aston Villa, for example, as Mark Taylor explains: "It hurts me everytime I see Falcao score. In January 2009 River Plate offered Falcao to Villa for £7m. Martin O'Neill decided to go with Emile Heskey instead. I've never forgiven Martin for this."
65 min (aka The Schadenfreude Sixty Seconds): Mata and Cole try to combine down the left, but their passes aren't sticking. Absolutely nothing's going right for Chelsea. "Just think if Chelsea spend another £100m they might be able to win the Super Cup next season," deadpans Andrew Stricker.
67 min: Torres gains a yard down the inside-left channel but - and he was doing this a lot against Newcastle at the weekend, suggesting his confidence still isn't totally repaired - instead of powering forward and getting a shot away, he checks back. And passes back. Eventually it's Oscar who takes a shot, from the edge of the box, and it's not bad, troubling the daisies just to the right of goal.
69 min: A free kick sent into the Chelsea area from the left by Koke. The ball flies all the way through to Cech, who is surprised none of the goons in his defence have bothered to head it clear, and is forced to get down at speed and scramble the ball wide right of goal. From the corner, the keeper comes and does the job himself, punching clear. What on earth are Cahill and Luiz up to?
71 min: Arda Turan is released onto yards of grass down the left. He slides a low pass inside to Falcao, who takes a shot but is closed down for once. "Surely there has to be a rule that will allow Atletico to represent Europe in the FIFA World Club Cup in place of Chelsea," suggests Emmanuel Dimike from Lagos, Nigeria. "If there isn't, there should be. That's all!" I love the clipped end to that email, the pay-off delivered with the jaunty confidence of a man who knows he's one hundred percent correct. A gorgeous flourish!
74 min: Hazard, who has been As A Mouse, wins a corner with a determined but not particularly dangerous run down the left. The corner's dealt with easily enough. But Chelsea come back through Lampard, who takes a shot from distance and wins a corner as it balloons off an Atlético bum. And from that set piece...
75min: GOAL!!! Chelsea 1-4 Atlético Madrid The ball's sent in from the right. On the penalty spot, five players go up to contest the ball. None of them win it. It drops into space, allowing Cahill to batter a frustrated shot low and hard, past Chelsea loanee Courtois, who still hasn't got his hands warm on anything. "We're gonna win 5-4," croon the Chelsea faithful. European champions, yet still at one with the English gallows humour.
78 min: Chelsea are passing it around a lot in the Atlético half, but the Spaniards are holding their shape. Despite Cahill's strike, they don't seem to be suffering from panic.
80 min: They might have felt a twinge in the trousers if this had gone in, though: Mata bursts down the inside-right and into the area, but blasts over the bar.
82 min: Both teams make a change. Atlético swap Koke for Raul Garcia, while Chelsea send on Sturridge for Mata.
84 min: Once again, Chelsea are all over the shop at the back. Raul Garcia cascades down the right, no blue shirt within country miles, but his pass inside to Falcao is lazy and cut out by Luiz. "Do you think Atletico will let John Terry join them to collect the cup, or might that explain why he looks so glum sat in the stands?" wonders David Wall.
86 min: It's all got very scrappy. Torres, down the inside left, tries to spin clear, then Lampard tries the same trick. But they can't break through the Spanish back line.
88 min: Falcao is afforded the chance of a standing ovation, replaced by Emre. The entire crowd - including, to their great credit, the Chelsea fans - seize the opportunity to acknowledge one of the great performances in any European final.
89 min: Cole is replaced by Bertrand.
90 min: David Luiz. What an entertainer. Emre zips down the left, in space needless to say, then slides a pass into the middle. Luiz, sliding in, hammers the ball against the right-hand post and away. That is quite spectacular. David Luiz, ladies and gentlemen!
FULL TIME: Chelsea 1-4 Atlético Madrid. And that's that, the end of a rather humiliating evening for the European champions. Still, they're still the European champions. But for the second time in three years, Atlético win the Super Cup! I wonder if John Terry will be rushing onto the pitch to get into all the photographs tonight?


text:
|Board FAQ
|Here you can find answers to questions about how the board works. Use the links below or the search box above to find your way around.
|» Boards
General Finance Personal Loans Debt Mortgages Real Estate Credit Ratings Credit Cards Insurance Banks Investments Pensions
All times are GMT -4. The time now is 01:44 PM.


text:
Must-see TV shows are futuristic classics that shouldn't be missed. Of course, not every must-see is perfect. That's why we've rated them 1-5 on the patented "crunchy goodness" scale.
Title: Torchwood
Date: 2006-present
Vitals: A secret organization in the Doctor Who universe hoards alien artifacts and uses them to "arm the human race against the future." Mostly, though, they shag each other and then argue about it.
Famous names: John Barrowman, Russell T. Davies, Eve Myles, Burn Gorman
Crunchy goodness: 2
Sights you'll never unsee: Carolyn Chikezie as the "cyberwoman," stalking around in a discofied half-naked version of a Cyberman costume from Doctor Who before getting killed. Runner-up: the scene where Ianto, the cyberwoman's bereaved boyfriend, seduces her murderer Captain Jack, using only a stopwatch and some very odd innuendo.
Life lesson: It's okay to shoot your boss and unleash a time-storm on the human race, if there's even a remote chance of bringing back your long-lost girlfriend.
Most painfully dated moment: The swooping cityscape views and hero-on-rooftop shots looked awesome... on Angel. In general, the show often seems to be straining mightily to drag British science fiction into the 1990s... only seven years too late.


text:
"I think he's hot," Republican strategist Mary Matalin said of her husband and fellow political player James Carville on Saturday at the FPA Experience 2012 in San Antonio.
Matalin was describing how the two work and live together despite being on opposite sides of the political aisle.
"We share faith and family, not politics. I'm right, he's very wrong," she added to laughter and applause from the audience.
She related the story of her involvement in the aftermath of then Vice President Dick Cheney's famed hunting accident, in which he accidently shot a companion.
"I saw Hillary Clinton, or H-bomb as she's referred to in our house, on TV calling for a Senate investigation into the shooting," Matalin said. "I got on the phone to James and said no-way was that going to happen, and it didn't, so that's one way we work together."
The reason for the particularly high emotions surrounding this year's election is the "clash of ideas" which routinely happens at "pivot points" throughout history.
"Anyone who makes predictions about the outcome of this year's race is either a fool or a liar," she claimed. "In politics, perception is reality and perception is meant to drive the reality. Obama got a 'dead-cat' bounce after the convention, which was simply the result of the base getting focused finally since they didn't have a primary fight."
Despite some polls showing Obama with a commanding campaign lead, Matalin said the number is closer to three points in favor of the president.
"Obama is not surging, and Romney is not tanking," she concluded.
Carville then took the podium, and bid welcome "to all the democrats in the audience, both of you."
Referring to the recent controversy over the NFL's use of replacement referee, he said everyone was glad to see them go except Congress, who was "happy to have someone around with lower approval ratings."
He then countered Matalin by saying the polls showing Obama with a commanding lead are accurate, pointing to the website RealClearPolitics.com that averages the major polls.
"You have to take the average, just like in investing," he said in a nod to the audience. "You don't take one stock, you have an average of 30 the the Dow Jones Industrial Average or 500 for the S&P."
Likening politics to the football game, he said the four quarters are the nomination to the convention, the convention, the post-convention to the debates and lastly the debates.
"We're about to start the fourth quarter with Obama in the lead by about four points," he explained. "Now if Romney's only down by a little more than a field goal, you don't turn off the TV and say it's over, but something has to change and that will be difficult because so many people have already made up their minds."


text:
Google has started to provide video clips in Google News, a feature it had been widely expected to add to its article search and aggregation site and which Yahoo and AOL already offer in their news sites.
"We're showing related news videos along with our news articles to give you a broader spectrum of info available," a Google staffer announced Tuesday in the Google News blog.
Google News is adding the feature through a collaboration with the company's YouTube video sharing site. The clips will come from channels that video news producers have set up on YouTube. Plus, with the YouTube video-playback technology, Google News users will not have to download any clips and they'll be able to view the videos in any browser, according to Google.
"What we're announcing today is a test feature within Google News. We're beginning with a small group of partners who have news content on YouTube and we're starting with a limited amount of content," said Google spokesman Gabriel Stricker in an interview.
"While we're starting out as a test, we hope going forward to access the thousands of content providers who use YouTube to reach a broad global audience, especially those who focus on news," Stricker added.
For now, Google will feature videos in the U.S., U.K. and Ireland editions of Google News. Video providers include CBS, Reuters, and a number of local Hearst TV stations, the company said.
Last May Google News Product Manager Nathan Stoll said that news video was an area the company would "like to make progress in."
"It's true that lots of publishers have asked us about our plans, whether or not we're planning [to include video] because they'd like to get added traffic to their video content. There's certainly a need out there," Stoll told IDG News Service.
Tuesday's announcement fits within the company's larger universal search initiative, which seeks to integrate links from its different engines within search results.
For example, in its main Google.com Web search engine, Google already collates results from its Images, Video, Maps and News specialty search engines, if warranted by the query.
The news videos will play in their entirety right on the Google News page, a different approach from news articles and photos, for which the site only provides headlines, text snippets and thumbnail images. To access an entire article and view photos in their original size, Google News users have to click on over to the site where they appear.
Google indexes articles and photos from the Web without necessarily obtaining permission from their publishers. Although this practice has been challenged in court as copyright violation in the U.S. and abroad by some news organizations, Google maintains that it is protected by the fair use principle. Many publishers actually encourage Google to index their material in Google News because they find they benefit from the traffic the site sends them.
In the case of the Google News videos, the approach is different because the clips have already been uploaded to YouTube by their owners, granting YouTube permission to stream them.


text:
Weather Concerns Postpone Swimming and Diving Meet
By ODU Athletics
Oct. 26, 2012
NORFOLK, Va – The Old Dominion University men's and women's swimming and diving teams had already boarded their bus, when they received news that the University of Delaware cancelled the meet between the two schools.
ODU was scheduled to square off against the Blue Hens in Newark, Delaware on Saturday, October 27; however, Hurricane Sandy had other ideas. In fact, the University of Delaware announced that classes will be cancelled on Monday, October 29.
There has been no announcement about the possibility of rescheduling this postponed meet at this time.
After starting the season 2-0, the Lady Monarchs will host George Mason, Northeastern, and Towson on Friday, November 2, at the J.C. "Scrap" Chandler Pool in the Old Dominion Student Recreation Center. The four team competition will conclude on Saturday, November 3.
The men's swimming and diving team will also return to action on Friday, November 2, when they will welcome George Mason and Towson for a two day showdown.
Be sure to follow Old Dominion's Swimming and Diving teams on Facebook at: www.facebook.com/ODUSwimDive