\&
.sp 1
.ce 3
\s+1\fBChapter 11\fP\s-1

\s+1\fBPHIGS Workstation Picking\fP\s-1
.sp 2
.nr H1 11
.nr H2 0
.nr H3 0
.nr H4 0
.nr H5 0
.na
.LP
.XS
Chapter 11: PHIGS Workstation Picking
.XE
.LP
.IN "PHIGS workstation"
.IN "workstation" "PHIGS"
.IN "workstation" "picking"
The PHIGS workstation resource encapsulates the PEX functionality to support
the PHIGS concept of a workstation.  The following functionality encapsulates
the picking support for the PHIGS workstation.  There are two parts to the
PHIGS workstation picking.  A pick device is actually a part of the PHIGS
workstation resource, but the support for inquiring and setting the pick
device attributes is documented here.  A pick measure is a separate resource
that works with the PHIGS workstation resource to perform the actual pick
operation.
.NH 2
Workstation Pick Devices
.XS
\*(SN Workstation Pick Devices
.XE
.IN "workstation" "pick device"
.LP
Each PHIGS workstation resource maintains a list of pick device descriptors.
Each entry in the list maintains state values for a particular type of pick
device, such as a mouse or a tablet.  Together, the entries in the pick device
descriptor list maintain state values for all the pick devices that are
supported by the workstation resource.  This list of values can be set or
inquired for each of the supported pick devices.
.LP
Two of the pick device descriptor attributes are name set resources.  If a
name set is created, bound to a pick device descriptor, and the freed, the
contents of the name set will remain, since it is still being referenced by
the pick device descriptor.  However, when a pick device descriptor is
inquired, the value
.PN PEXAlreadyFreed
will be returned for the name set identifier, since it no longer has a valid
resource identifier by which it can be referenced.
.LP
The pick device descriptor attributes, in order, are:
.ID
pick status
pick path
pick path order
pick inclusion
pick exclusion
pick data record
prompt and echo type
echo volume
echo switch
.DE
.LP
The pick status attribute contains the initial pick status that will be bound
to a pick measure resource.
.LP
The pick path attribute contains the initial pick path that will be bound to a
pick measure resource.
.LP
The pick path order attribute specifies the order in which elements of the
picked path are to be written into the pick measure resource.  If the order is
.PN PEXTopFirst ,
elements of the pick measure's picked path attribute will be listed in the
order they would have been encountered during a traversal.  If the order is
.PN PEXBottomFirst ,
elements of the pick measure's picked path attribute will be listed in the
order opposite from the order they would have been encountered during a
traversal.
.LP
The pick inclusion attribute specifies the resource identifier of the name set
that is to be used as the pick inclusion filter during pick operations.
.LP
The pick exclusion attribute specifies the resource identifier of the name set
that is to be used as the pick exclusion filter during pick operations.
.LP
The pick data record attribute contains a pick-device-dependent data record used
to initialize a pick measure resource when it is created.
.LP
The prompt and echo type attribute contains a value that specifies the
prompt and echo type to be used during pick operations.  The supported types
are inquirable via
.PN PEXGetEnumTypeInfo .
.LP
The echo volume attribute specifies where prompting and echoing is to occur.
The default is that the echo volume will be defined to be the size of the
drawable bound to the workstation resource at the time it was created.
.LP
The echo switch attribute specifies the initial echo state for a pick measure.
.bp
.XS
Function Descriptions
.XE
.SH
PEXFreePDAttributes - Free Storage Returned by PEXGetPickDevice
.XS
	PEXFreePDAttributes
.XE
.IN "PEXFreePDAttributes" "" "@DEF@"
.SH
Synopsis
.RS
.FD 0
void PEXFreePDAttributes\^(\^PEXPDAttributes *\fIvalues\fP\^)
.FN
.RE
.SH
Arguments
.RS
.IP \fIvalues\fP 1i
A pointer to the pick device attribute values.
.RE
.SH
Returns
.RS
.LP
None
.RE
.SH
Description
.RS
.LP
This function deallocates memory returned by
.PN PEXGetPickDevice .
.RE
.SH
Errors
.RS
.IP None 1i
.RE
.SH
See Also
.RS
.LP
.PN PEXGetPickDevice
.RE
.bp
.SH
PEXGetPickDevice - Get Pick Device Attributes
.XS
	PEXGetPickDevice
.XE
.IN "PEXGetPickDevice" "" "@DEF@"
.SH
Synopsis
.RS
.FD 0
PEXPDAttributes *PEXGetPickDevice\^(\^Display *\fIdisplay\fP\^, PEXWorkstation \fIworkstation\fP\^, int \fIpick_device_type\fP\^, unsigned long \fIvalue_mask\fP\^)
.FN
.RE
.SH
Arguments
.RS
.IP \fIdisplay\fP 1i
A pointer to a display structure returned by a successful \fBXOpenDisplay\fP call.
.IP \fIworkstation\fP 1i
The resource identifier of the workstation.
.IP \fIpick_device_type\fP 1i
The pick device type
.Pn ( PEXPickDeviceDCHitBox
or
.PN PEXPickDeviceNPCHitVolume ).
.IP \fIvalue_mask\fP 1i
A mask indicating which attributes to return.
.RE
.SH
Returns
.RS
.LP
A pointer to the pick device attribute values; a null pointer if unsuccessful.
.RE
.SH
Description
.RS
.LP
This function returns the attribute values of a pick descriptor for the PHIGS
workstation resource specified.  The descriptor returned will be the
currently-defined descriptor for the pick device of the type specified.
Supported pick device types are inquirable via
.PN PEXGetEnumTypeInfo .
The value mask indicates which attributes are to be returned.
The value mask is constructed by or'ing together the following constants:
.ID
.PN PEXPDPickStatus
.PN PEXPDPickPath
.PN PEXPDPickPathOrder
.PN PEXPDPickIncl
.PN PEXPDPickExcl
.PN PEXPDPickDataRec
.PN PEXPDPromptEchoType
.PN PEXPDEchoVolume
.PN PEXPDEchoSwitch
.DE
.LP
PEXlib allocates memory for the return value.
.PN PEXFreePDAttributes
should be called to deallocate the memory.
.RE
.SH
Data Structures
.ID
.Co
typedef XID             PEXWorkstation;
.sp
typedef struct {
    unsigned short      status;
    PEXPickPath         path;
    int                 path_order;
    PEXNameSet          inclusion;
    PEXNameSet          exclusion;
    PEXPickRecord       pick_record;
    PEXEnumTypeIndex    prompt_echo_type;
    PEXViewport         echo_volume;
    int                 echo_switch;
} PEXPDAttributes;
.sp
typedef struct {
    unsigned long       count;                  /* number of elements */
    PEXPickElementRef   *elements;
} PEXPickPath;
.sp
typedef struct {
    PEXStructure        sid;
    unsigned long       offset;
    unsigned long       pick_id;
} PEXPickElementRef;
.sp
typedef XID             PEXStructure;
.sp
typedef XID             PEXNameSet;
.sp
typedef union {
    PEXPDNPCHitVolume       volume;
    PEXPDDCHitBox           box;
    PEXPickDataRecord       data;
} PEXPickRecord;
.sp
typedef PEXNPCSubVolume PEXPDNPCHitVolume;
.sp
typedef struct {
    PEXCoord            min;
    PEXCoord            max;
} PEXNPCSubVolume;
.sp
typedef struct {
    float               x;
    float               y;
    float               z;
} PEXCoord;
.sp
typedef struct {
    PEXDeviceCoord2D    position;
    float               distance;
} PEXPDDCHitBox;
.sp
typedef struct {
    short               x;
    short               y;
} PEXDeviceCoord2D;
.sp
typedef struct {
    unsigned short      length;                 /* number of bytes in record */
    char                *record;
} PEXPickDataRecord;
.sp
typedef short           PEXEnumTypeIndex;
.sp
typedef struct {
    PEXDeviceCoord      min;
    PEXDeviceCoord      max;
    PEXSwitch           use_drawable;
    unsigned char       reserved[3];
} PEXViewport;
.sp
typedef struct {
    short               x;
    short               y;
    float               z;
} PEXDeviceCoord;
.sp
typedef unsigned char   PEXSwitch;
.ft P
.DE
.SH
Errors
.RS
.IP \fIBadPEXWorkstation\fP 1i
The specified workstation resource identifier is invalid.
.IP \fIBadValue\fP 1i
The specified pick device type is invalid, or an invalid bit set in the value
mask.
.RE
.SH
See Also
.RS
.LP
.PN PEXChangePickDevice ,
.PN PEXGetEnumTypeInfo
.RE
.bp
.SH
PEXChangePickDevice - Change Pick Device Attributes
.XS
	PEXChangePickDevice
.XE
.IN "PEXChangePickDevice" "" "@DEF@"
.SH
Synopsis
.RS
.FD 0
void PEXChangePickDevice\^(\^Display *\fIdisplay\fP\^, PEXWorkstation \fIworkstation\fP\^, int \fIpick_device_type\fP\^, unsigned long \fIvalue_mask\fP\^, PEXPDAttributes *\fIvalues\fP\^)
.FN
.RE
.SH
Arguments
.RS
.IP \fIdisplay\fP 1i
A pointer to a display structure returned by a successful \fBXOpenDisplay\fP call.
.IP \fIworkstation\fP 1i
The resource identifier of the workstation.
.IP \fIpick_device_type\fP 1i
The pick device type
.Pn ( PEXPickDeviceDCHitBox
or
.PN PEXPickDeviceNPCHitVolume ).
.IP \fIvalue_mask\fP 1i
A mask indicating which attributes to return.
.IP \fIvalues\fP 1i
A pointer to the pick device attribute values.
.RE
.SH
Returns
.RS
.LP
None
.RE
.SH
Description
.RS
.LP
This function will modify the attributes of a pick descriptor for the PHIGS
workstation resource specified.  The descriptor to be modified will be the
currently-defined descriptor for the pick device of the type specified.
Supported pick device types are inquirable via
.PN PEXGetEnumTypeInfo .
The value mask indicates which attributes are to be changed.
The value mask is constructed by or'ing together the following constants:
.ID
.PN PEXPDPickStatus
.PN PEXPDPickPath
.PN PEXPDPickPathOrder
.PN PEXPDPickIncl
.PN PEXPDPickExcl
.PN PEXPDPickDataRec
.PN PEXPDPromptEchoType
.PN PEXPDEchoVolume
.PN PEXPDEchoSwitch
.DE
.RE
.SH
Data Structures
.ID
.Co
typedef XID             PEXWorkstation;
.sp
typedef struct {
    unsigned short      status;
    PEXPickPath         path;
    int                 path_order;
    PEXNameSet          inclusion;
    PEXNameSet          exclusion;
    PEXPickRecord       pick_record;
    PEXEnumTypeIndex    prompt_echo_type;
    PEXViewport         echo_volume;
    int                 echo_switch;
} PEXPDAttributes;
.sp
typedef struct {
    unsigned long       count;                  /* number of elements */
    PEXPickElementRef   *elements;
} PEXPickPath;
.sp
typedef struct {
    PEXStructure        sid;
    unsigned long       offset;
    unsigned long       pick_id;
} PEXPickElementRef;
.sp
typedef XID             PEXStructure;
.sp
typedef XID             PEXNameSet;
.sp
typedef union {
    PEXPDNPCHitVolume       volume;
    PEXPDDCHitBox           box;
    PEXPickDataRecord       data;
} PEXPickRecord;
.sp
typedef PEXNPCSubVolume PEXPDNPCHitVolume;
.sp
typedef struct {
    PEXCoord            min;
    PEXCoord            max;
} PEXNPCSubVolume;
.sp
typedef struct {
    float               x;
    float               y;
    float               z;
} PEXCoord;
.sp
typedef struct {
    PEXDeviceCoord2D    position;
    float               distance;
} PEXPDDCHitBox;
.sp
typedef struct {
    short               x;
    short               y;
} PEXDeviceCoord2D;
.sp
typedef struct {
    unsigned short      length;                 /* number of bytes in record */
    char                *record;
} PEXPickDataRecord;
.sp
typedef short           PEXEnumTypeIndex;
.sp
typedef struct {
    PEXDeviceCoord      min;
    PEXDeviceCoord      max;
    PEXSwitch           use_drawable;
    unsigned char       reserved[3];
} PEXViewport;
.sp
typedef struct {
    short               x;
    short               y;
    float               z;
} PEXDeviceCoord;
.sp
typedef unsigned char   PEXSwitch;
.ft P
.DE
.SH
Errors
.RS
.IP \fIBadPEXNameSet\fP 1i
The specified name set resource identifier is invalid.
.IP \fIBadPEXPath\fP 1i
The specified path is invalid.
.IP \fIBadPEXWorkstation\fP 1i
The specified workstation resource identifier is invalid.
.IP \fIBadValue\fP 1i
The specified pick device type is invalid, a specified value is invalid, or
an invalid bit set in the value mask.
.RE
.SH
See Also
.RS
.LP
.PN PEXGetPickDevice ,
.PN PEXGetEnumTypeInfo
.RE
.bp
.NH 2
Workstation Pick Measures
.XS
\*(SN Workstation Pick Measures
.XE
.IN "workstation" "pick measure"
.LP
A pick measure resource must be created to actually perform a pick operation
using a PHIGS workstation.  A pick device type is specified at the time a
pick measure resource is created in order to provide the parameters for the
pick operation.  The pick measure accepts input in the form of input records
which are defined for each type of pick device.  When the pick measure is
passed a valid input record, its attributes will be updated.  Operation on
a pick measure are potentially lengthy since a great number of structure
elements may have to be processed in order to produce the pick results.
.LP
The pick measure resource attributes are:
.ID
status
pick path
.DE
.LP
The pick status attribute contains the result of the last update operation
that was performed.  It is set to
.PN PEXPick
if a primitive was successfully picked, and
.PN PEXNoPick
if the pick operation was unsuccessful.
.LP
The pick path attribute contains the path of the structure element that
was picked as a result of the last update operation.
.bp
.SH
PEXCreatePickMeasure - Create Pick Measure
.XS
	PEXCreatePickMeasure
.XE
.IN "PEXCreatePickMeasure" "" "@DEF@"
.SH
Synopsis
.RS
.FD 0
PEXPickMeasure PEXCreatePickMeasure\^(\^Display *\fIdisplay\fP\^, PEXWorkstation \fIworkstation\fP\^, int \fIpick_device_type\fP\^)
.FN
.RE
.SH
Arguments
.RS
.IP \fIdisplay\fP 1i
A pointer to a display structure returned by a successful \fBXOpenDisplay\fP call.
.IP \fIworkstation\fP 1i
The resource identifier of the workstation.
.IP \fIpick_device_type\fP 1i
The pick device type
.Pn ( PEXPickDeviceDCHitBox
or
.PN PEXPickDeviceNPCHitVolume ).
.RE
.SH
Returns
.RS
.LP
The resource identifier of the newly-created pick measure.
.RE
.SH
Description
.RS
.LP
This function creates a pick measure resource of the type specified.  The
pick measure is initialized with the values contained in the appropriate
pick device descriptor stored in the specified workstation.  The supported
pick device types are inquirable via
.PN PEXGetEnumTypeInfo .
.RE
.SH
Data Structures
.ID
.Co
typedef XID             PEXWorkstation;
typedef XID             PEXPickMeasure;
.ft P
.DE
.SH
Errors
.RS
.IP \fIBadAlloc\fP 1i
The server failed to allocate the resource.
.IP \fIBadPEXWorkstation\fP 1i
The specified workstation resource identifier is invalid.
.IP \fIBadValue\fP 1i
The specified pick device type is invalid.
.RE
.SH
See Also
.RS
.LP
.PN PEXFreePickMeasure ,
.PN PEXGetEnumTypeInfo
.RE
.bp
.SH
PEXFreePickMeasure - Free Pick Measure
.XS
	PEXFreePickMeasure
.XE
.IN "PEXFreePickMeasure" "" "@DEF@"
.SH
Synopsis
.RS
.FD 0
void PEXFreePickMeasure\^(\^Display *\fIdisplay\fP\^, PEXPickMeasure \fIpick_measure\fP\^)
.FN
.RE
.SH
Arguments
.RS
.IP \fIdisplay\fP 1i
A pointer to a display structure returned by a successful \fBXOpenDisplay\fP call.
.IP \fIpick_measure\fP 1i
The resource identifier of the pick measure.
.RE
.SH
Returns
.RS
.LP
None
.RE
.SH
Description
.RS
.LP
This function deletes the pick measure resource and frees memory
associated with it.
.RE
.SH
Errors
.RS
.IP \fIBadPEXPickMeasure\fP 1i
The specified pick measure resource identifier is invalid.
.RE
.SH
See Also
.RS
.LP
.PN PEXCreatePickMeasure
.RE
.bp
.SH
PEXFreePMAttributes - Free Storage Returned by PEXGetPickMeasure
.XS
	PEXFreePMAttributes
.XE
.IN "PEXFreePMAttributes" "" "@DEF@"
.SH
Synopsis
.RS
.FD 0
void PEXFreePMAttributes\^(\^PEXPMAttributes *\fIvalues\fP\^)
.FN
.RE
.SH
Arguments
.RS
.IP \fIvalues\fP 1i
A pointer to the pick measure attribute values.
.RE
.SH
Returns
.RS
.LP
None
.RE
.SH
Description
.RS
.LP
This function deallocates memory returned by
.PN PEXGetPickMeasure .
.RE
.SH
Errors
.RS
.IP None 1i
.RE
.SH
See Also
.RS
.LP
.PN PEXGetPickMeasure
.RE
.bp
.SH
PEXGetPickMeasure - Get Pick Measure Attributes
.XS
	PEXGetPickMeasure
.XE
.IN "PEXGetPickMeasure" "" "@DEF@"
.SH
Synopsis
.RS
.FD 0
PEXPMAttributes *PEXGetPickMeasure\^(\^Display *\fIdisplay\fP\^, PEXPickMeasure \fIpick_measure\fP\^, unsigned long \fIvalue_mask\fP\^)
.FN
.RE
.SH
Arguments
.RS
.IP \fIdisplay\fP 1i
A pointer to a display structure returned by a successful \fBXOpenDisplay\fP call.
.IP \fIpick_measure\fP 1i
The resource identifier of the pick measure.
.IP \fIvalue_mask\fP 1i
A mask indicating which attributes to return.
.RE
.SH
Returns
.RS
.LP
A pointer to the pick measure attribute values; a null pointer if unsuccessful.
.RE
.SH
Description
.RS
.LP
This function returns the specified pick measure attribute values.
The value mask indicates which attributes are to be returned.
The value mask is constructed by or'ing together the following constants:
.ID
.PN PEXPMStatus
.PN PEXPMPath
.DE
.LP
PEXlib allocates memory for the return value.
.PN PEXFreePMAttributes
should be called to deallocate the memory.
.RE
.SH
Data Structures
.ID
.Co
typedef XID             PEXPickMeasure;
.sp
typedef struct {
    unsigned short      status;
    PEXPickPath         pick_path;
} PEXPMAttributes;
.sp
typedef struct {
    unsigned long       count;                  /* number of elements */
    PEXPickElementRef   *elements;
} PEXPickPath;
.sp
typedef struct {
    PEXStructure        sid;
    unsigned long       offset;
    unsigned long       pick_id;
} PEXPickElementRef;
.sp
typedef XID             PEXStructure;
.ft P
.DE
.SH
Errors
.RS
.IP \fIBadPEXPickMeasure\fP 1i
The specified pick measure resource identifier is invalid.
.IP \fIBadValue\fP 1i
An invalid bit is set in the value mask.
.RE
.SH
See Also
.RS
.LP
.PN PEXCreatePickMeasure
.RE
.bp
.SH
PEXUpdatePickMeasure - Update Pick Measure
.XS
	PEXUpdatePickMeasure
.XE
.IN "PEXUpdatePickMeasure" "" "@DEF@"
.SH
Synopsis
.RS
.FD 0
void PEXUpdatePickMeasure\^(\^Display *\fIdisplay\fP\^, PEXPickMeasure \fIpick_measure\fP\^, int \fIpick_device_type\fP\^, PEXPickRecord *\fIpick_record\fP\^)
.FN
.RE
.SH
Arguments
.RS
.IP \fIdisplay\fP 1i
A pointer to a display structure returned by a successful \fBXOpenDisplay\fP call.
.IP \fIpick_measure\fP 1i
The resource identifier of the pick measure.
.IP \fIpick_device_type\fP 1i
The pick device type
.Pn ( PEXPickDeviceDCHitBox
or
.PN PEXPickDeviceNPCHitVolume ).
.IP \fIpick_record\fP 1i
A pointer to the pick data record.
.RE
.SH
Returns
.RS
.LP
None
.RE
.SH
Description
.RS
.LP
This function updates the specified pick measure resource.
If the update causes a primitive to be picked, the pick measure's pick status
will be set to
.PN PEXPick
and the pick path attribute will be set to the path of the picked
primitive.  If no primitive was picked, the pick status will be set to
.PN PEXNoPick .
.LP
The pick path can be used for echoing when the pick measure is created.
However, it is not used as a start path from which to start picking.
.LP
The input record is a pointer to data used to update the pick measure and
depends on the pick device type specified when the pick measure was
created.
If the pick device type is
.PN PEXPickDeviceDCHitBox ,
the input record should point to a data structure of type
.PN PEXPDDCHitBox .
If the pick device type is
.PN PEXPickDeviceNPCHitVolume ,
the input record should point to a data structure of type
.PN PEXPDNPCHitVolume .
.RE
.SH
Data Structures
.ID
.Co
typedef XID             PEXPickMeasure;
.sp
typedef union {
    PEXPDNPCHitVolume       volume;
    PEXPDDCHitBox           box;
    PEXPickDataRecord       data;
} PEXPickRecord;
.sp
typedef PEXNPCSubVolume PEXPDNPCHitVolume;
.sp
typedef struct {
    PEXCoord            min;
    PEXCoord            max;
} PEXNPCSubVolume;
.sp
typedef struct {
    float               x;
    float               y;
    float               z;
} PEXCoord;
.sp
typedef struct {
    PEXDeviceCoord2D    position;
    float               distance;
} PEXPDDCHitBox;
.sp
typedef struct {
    short               x;
    short               y;
} PEXDeviceCoord2D;
.sp
typedef struct {
    unsigned short      length;                 /* number of bytes in record */
    char                *record;
} PEXPickDataRecord;
.ft P
.DE
.SH
Errors
.RS
.IP \fIBadPEXPath\fP 1i
The specified path is invalid.
.IP \fIBadPEXPickMeasure\fP 1i
The specified pick measure resource identifier is invalid.
.RE
.SH
See Also
.RS
.LP
.PN PEXFreePickMeasure
.RE
.bp
