Handles the TKE_PolyPolyline opcode. More...
#include <BPolyPoly.h>
Public Types | |
enum | Suboptions { TKPP_COMPRESSED = 0x0001, TKPP_HAS_EXPLICIT_PRIMITIVE_COUNT = 0x0002, TKPP_ONE_PRIMITIVE_ONLY = 0x0004, TKPP_GLOBAL_QUANTIZATION = 0x0008, TKPP_ZERO_X = 0x0100, TKPP_SAME_X = 0x0200, TKPP_PER_PRIMITIVE_X = 0x0300, TKPP_ZERO_Y = 0x0400, TKPP_SAME_Y = 0x0800, TKPP_PER_PRIMITIVE_Y = 0x0C00, TKPP_ZERO_Z = 0x1000, TKPP_SAME_Z = 0x2000, TKPP_PER_PRIMITIVE_Z = 0x3000, TKPP_EXPANDED = 0x8000 } |
Public Member Functions | |
TK_Status | Clone (BStreamFileToolkit &tk, BBaseOpcodeHandler **handler) const |
TK_Status | Execute (BStreamFileToolkit &tk) |
TK_Status | Read (BStreamFileToolkit &tk) |
TK_Status | ReadAscii (BStreamFileToolkit &tk) |
void | Reset () |
TK_Status | SetDPoints (int point_count, double const points[]=0) |
TK_Status | SetLengths (int primitive_count, int const lengths[]=0) |
TK_Status | SetPoints (int point_count, float const points[]=0) |
TK_PolyPolypoint (unsigned char opcode) | |
TK_Status | Write (BStreamFileToolkit &tk) |
TK_Status | WriteAscii (BStreamFileToolkit &tk) |
Protected Member Functions | |
TK_Status | analyze_dimensionality (BStreamFileToolkit &tk) |
TK_Status | compute_line_extend_points (BStreamFileToolkit &tk) |
TK_Status | compute_trivial_points (BStreamFileToolkit &tk) |
TK_Status | expand_lengths (BStreamFileToolkit &tk) |
TK_Status | figure_num_floats (BStreamFileToolkit &tk) |
TK_Status | mangle (BStreamFileToolkit &tk) |
TK_Status | process_line_extend_points (BStreamFileToolkit &tk) |
TK_Status | process_trivial_points (BStreamFileToolkit &tk) |
TK_Status | read_compressed_points (BStreamFileToolkit &tk) |
TK_Status | read_trivial_leftovers (BStreamFileToolkit &tk) |
TK_Status | unmangle (BStreamFileToolkit &tk) |
TK_Status | validate_primitive_count (BStreamFileToolkit &tk) |
TK_Status | write_compressed_points (BStreamFileToolkit &tk) |
TK_Status | write_trivial_leftovers (BStreamFileToolkit &tk) |
Protected Attributes | |
float | m_bbox [6] |
A bounding box around the unrestricted dimensions. If the data is 2d, only the first 4 values are used, and it becomes a bounding rectangle. | |
int | m_bits_per_sample |
the number of bits per sample. Should be tk.GetNumVertexBits()/3 | |
unsigned char | m_compression_scheme |
If the TKPP_COMPRESSED bit is set in m_subop, this variable tracks the specific compression algorithm used. | |
float | m_dbbox [6] |
A bounding box around the unrestricted dimensions. If the data is 2d, only the first 4 values are used, and it becomes a bounding rectangle. | |
double * | m_dpoints |
The points array. | |
float | m_dtemprange [2] |
1d bounds of the stragglers | |
int * | m_lengths |
The length of each primitive. | |
int | m_lengths_allocated |
The number of array elements that we have allocated for primitive lengths. | |
int | m_point_count |
The number of points. | |
float * | m_points |
The points array. | |
int | m_points_allocated |
The number of points for which we have allocated space (to save time, we only reallocate the points array if it needs to be expanded, not on every call to Reset()). | |
int | m_points_num_dimensions |
The number of unrestricted dimensions in the points array that must be completely specified. | |
int | m_points_num_floats |
The number of independent floating point values required to specify the points array (equals m_point_count*3 for 3d data, but less for 2d) | |
int | m_primitive_count |
The number of primitives. Omitted from read/write (it can be deduced from the lengths array) unless TKPP_HAS_EXPLICIT_PRIMITIVE_COUNT bit is set. | |
int | m_progress |
tracks progress during special situations | |
unsigned short | m_subop |
Suboptions. Among other things, it specifies all 2d restrictions that can be made on the points. Be careful when testing for the 2d bits, because some have multiple bits set. For this reason, you should use the form if((m_subop & mask) == value) instead of if(m_subop & bit) | |
int | m_substage |
tracks progress during helper functions | |
int | m_templen |
the length of all stragglers left behind (e.g. an array of floats of length m_primitive_count if TKPP_PER_PRIMITIVE_X subop bit is set) | |
float | m_temprange [2] |
1d bounds of the stragglers | |
unsigned char * | m_workspace |
Raw data after packing. | |
int | m_workspace_allocated |
The amount of workspace area allocated. | |
int | m_workspace_used |
The amount of workspace area used. |
Handles the TKE_PolyPolyline opcode.
TK_Polypoint provides support for writing/reading the TKE_PolyPolyline opcode objects to/from an HSF file.
TKE_PolyPolyline is an alternative to TKE_Polyline and TKE_Line. It is a more compressed way of handling large numbers of polylines and lines. The idea is that by grouping primitives together, better compression algorithms can be run for them. This class utilizes some of the same compression schemes that are implemented in TK_Shell.
This class is especially optimal for dealing with 2d data. With all of the 12 combinations ("zero", "constant", "per-primitive" or "unrestricted" along any of the 3 standard axes X, Y and/or Z), we leverage the restrictions that we can make to compress as deeply as possible. There is no provision for point data that is "mostly" 2d, however, so such data will be encoded as 3d. For this reason, performance will improve if all 2d lines and polylines can be put in a segment or segments that are separate from any 3d line data.
The HOOPS/3dGS scene-graph supports 'polyline' and 'polygon' primitives which are both defined by a point count and points array.
a few control values, and a lot of bits to indicate degenerate dimensions (which can be either omitted completely or only partially specified).
TK_PolyPolypoint::TK_PolyPolypoint | ( | unsigned char | opcode | ) |
constructor
TK_Status TK_PolyPolypoint::analyze_dimensionality | ( | BStreamFileToolkit & | tk | ) | [protected] |
Efficiently searches the points array for any restrictions that can be made on the points in order to aid compression
tk | the toolkit |
TK_Status TK_PolyPolypoint::Clone | ( | BStreamFileToolkit & | tk, |
BBaseOpcodeHandler ** | handler | ||
) | const [virtual] |
Copies the opcode handler
tk | A reference to the BStreamFileToolkit object. |
handler | A pointer to the opcode handler object. Passed by reference. |
Reimplemented from BBaseOpcodeHandler.
Reimplemented in HTK_PolyPolypoint.
TK_Status TK_PolyPolypoint::compute_line_extend_points | ( | BStreamFileToolkit & | tk | ) | [protected] |
compresses the m_points into m_workspace, an array of unsigned char's according to the CS_LINE_EXTEND compression scheme. CS_LINE_EXTEND is currently unused because of poor performance.
tk | the toolkit |
TK_Status TK_PolyPolypoint::compute_trivial_points | ( | BStreamFileToolkit & | tk | ) | [protected] |
compresses the m_points into m_workspace, an array of unsigned char's according to the CS_TRIVIAL compression scheme
tk | the toolkit |
TK_Status TK_PolyPolypoint::Execute | ( | BStreamFileToolkit & | tk | ) | [virtual] |
Processes the binary data that has been read for the current object, which involves passing the data to application-specific data structures.
tk | A reference to the BStreamFileToolkit object. |
Reimplemented from BBaseOpcodeHandler.
Reimplemented in HTK_PolyPolypoint.
TK_Status TK_PolyPolypoint::expand_lengths | ( | BStreamFileToolkit & | tk | ) | [protected] |
A small helper to reallocate the lengths array in the event that we run out of space.
tk | the toolkit |
TK_Status TK_PolyPolypoint::figure_num_floats | ( | BStreamFileToolkit & | tk | ) | [protected] |
Calculates the number of independent floating point values needed to encode the points array
tk | the toolkit |
TK_Status TK_PolyPolypoint::mangle | ( | BStreamFileToolkit & | tk | ) | [protected] |
Reorganizes the values in m_points so that unrestricted dimensions appear first, followed by whatever floats are needed to encode the restricted dimensions. Intended for use during the write phase.,
tk | the toolkit |
TK_Status TK_PolyPolypoint::process_line_extend_points | ( | BStreamFileToolkit & | tk | ) | [protected] |
uncompresses m_workspace back into m_points according to CS_LINE_EXTEND. CS_LINE_EXTEND is currently unused because of poor performance.
tk | the toolkit |
TK_Status TK_PolyPolypoint::process_trivial_points | ( | BStreamFileToolkit & | tk | ) | [protected] |
uncompresses m_workspace back into m_points according to CS_TRIVIAL
tk | the toolkit |
TK_Status TK_PolyPolypoint::Read | ( | BStreamFileToolkit & | tk | ) | [virtual] |
Reads data from the toolkit buffer, decodes/decompresses it, and maps it to the opcode handlers data members. User-defined classes which need to write out custom data should utilize one of the available GetData() methods.
tk | A reference to the BStreamFileToolkit object. |
Implements BBaseOpcodeHandler.
TK_Status TK_PolyPolypoint::read_compressed_points | ( | BStreamFileToolkit & | tk | ) | [protected] |
reads the m_workspace, which will later be decompressed into m_points according to whatever m_compression_scheme was specified
tk | the toolkit |
TK_Status TK_PolyPolypoint::read_trivial_leftovers | ( | BStreamFileToolkit & | tk | ) | [protected] |
read the "leftovers" (see (see TK_PolyPolypoint::write_trivial_leftovers)
tk | the toolkit |
void TK_PolyPolypoint::Reset | ( | ) | [virtual] |
Resets the current opcode handler. This is called by the toolkit when it is done processing an opcode. This method reinitializes any opcode handler variables and frees up temporary data.
Reimplemented from BBaseOpcodeHandler.
Reimplemented in HTK_PolyPolypoint.
Referenced by HTK_PolyPolypoint::Reset().
TK_Status TK_PolyPolypoint::SetDPoints | ( | int | point_count, |
double const | points[] = 0 |
||
) |
Sets the double-precision point array. Allocates a buffer which will hold 'point_count' double triplets, and if specified, copies the 'points' into the buffer
point_count | the aggregate total number of points in this instance of the opcode. |
points | if provided, the actual double-precision floating-point values of the vertices. |
TK_Status TK_PolyPolypoint::SetLengths | ( | int | primitive_count, |
int const | lengths[] = 0 |
||
) |
Sets the lengths array. Allocates a buffer which will hold 'primitive_count' integers, and if specified, copies the 'lengths' into the buffer.
primitive_count | the number of polylines that this instance of the opcode handler contains. |
lengths | if provided, an array with point_count values to provide the length (number of vertices) of each polyline. If not provided, all lengths are initialized to zero (just assume that they will be set at some other time. |
TK_Status TK_PolyPolypoint::SetPoints | ( | int | point_count, |
float const | points[] = 0 |
||
) |
Sets the point array. Allocates a buffer which will hold 'point_count' float triplets, and if specified, copies the 'points' into the buffer
point_count | the aggregate total number of points in this instance of the opcode. |
points | if provided, the actual floating-point values of the vertices. |
TK_Status TK_PolyPolypoint::unmangle | ( | BStreamFileToolkit & | tk | ) | [protected] |
Undoes during the read phase everything that mangle() does at write time.
tk | the toolkit |
TK_Status TK_PolyPolypoint::validate_primitive_count | ( | BStreamFileToolkit & | tk | ) | [protected] |
Computes the primitive count if such has not been done already
tk | the toolkit |
TK_Status TK_PolyPolypoint::Write | ( | BStreamFileToolkit & | tk | ) | [virtual] |
Encodes/compresses data and writes data to the toolkit buffer. User-defined classes which need to write out custom data should utilize one of the available PutData() methods, and first write out the opcode associated with the group of binary data followed by the data itself.
tk | A reference to the BStreamFileToolkit object. |
Implements BBaseOpcodeHandler.
TK_Status TK_PolyPolypoint::write_compressed_points | ( | BStreamFileToolkit & | tk | ) | [protected] |
writes the points array according to whatever compression scheme was put into m_workspace
tk | the toolkit |
TK_Status TK_PolyPolypoint::write_trivial_leftovers | ( | BStreamFileToolkit & | tk | ) | [protected] |
if m_points can be rearranged into 2d (see TK_PolyPolypoint::mangle), there will be a 1d array (possibly of 0 or 1 length) of "leftovers". write it.
tk | the toolkit |