The Translate module does not inherently expand the data, merely applies an XFORM 'directive' which is used by the renderer.
Thus, if you have object A and need a copy B translated over by [10, 0, 0], take two wires from A's output, 1 to Collect, the other to Translate([10,0,0]) then to Collect and you have two 'copies' of A, one offset. However, the memory use did not double since B = A(translated) = A x XFORM object, thus both copies of A are handled by pointers internally. A x XFORM is concatenated at render time.

There are a few downstream operations that cannot deal with XFORM objects (as I remember), so this doesn't always solve the problem. Generally, reserve transformation operations to near the end of the dataflow (Translate, Scale, Rotate, Transform).

You will take a render hit of course: sooner or later, all those duplicated/triplicated/n-cated objects need to be rendered at their actual locations. For example, I am working with 3 copies of fluid glyphs, where the center set is the imported data, and due to periodic boundaries, we can translate one copy up by 'box-height' and one down by 'box-height' to observe smooth boundary crossing behavior. Memory is not consumed by the 2 Translates, but sure as heck is when I glyph all 3 copies. I had to employ Slabs and/or Sample to reduce the data set to the 'interesting area' or a sampled subset of the entire area to make it fit into the 1.4Gb I have available for DX on this ol' Mac. We start with 30x50x90=135000 objects, glyph, triplicate, render (well, very slowly). By Slab(x), Slab(y), then Glyph, triplicate, render, we get the result we need in a more reasonable time.

The flip side (often useful) is to know that Inquire("apply transform") forces concatenation of the XFORM, thus expanding memory use but losing the sometimes pesky XFORM earlier in the dataflow.


On Thursday, Feb 24, 2005, at 03:40 America/New_York, Arne Klaveness wrote:

Hello :)

I have a 3-D dataset which is repeating itelf (charge density of a monoclinic cell).

I see some solutions, but I'm unsure of how to implement them in dx, and how easily they are implemented..
Brute: multiply the data and displace the positions by a vector (the position of the last data - the position of the initial data)
Memory friendly: Force all positions to point to the equivalent positions that contain data.
Memory friendly2: Force all positions to point to the equivalent data.

Is some of this already implemented somewhere?

Thankful for all help :)
Arne

p.s. Are there any plans to make opendx compatible with Mono? (.Net)

*****************************************************************
Arne Klaveness
Department of Chemistry, University of Oslo
PO Box 1033 Blindern
N-0315 OSLO, NORWAY

Email: [EMAIL PROTECTED]
Mobile: +47 480 09 490
*****************************************************************

_______________________________
Chris Pelkie
Scientific Visualization Producer
622 Rhodes Hall, Cornell Theory Center
Ithaca, NY 14853 (607) 254-8794

Reply via email to