#include <xsi_miuserdata_defs.h>
Particle shape structure.
The data pointed to by each data tag is a flat list of particle attributes for each particle in the cloud. The size of each attribute entry is dependent upon the parameter type in xsimrAttributeData::type.
                xsimrPointCloudData *findParticleData( miState *state )
                {
                        if( state->instance == miNULLTAG )
                                return( NULL );
                        // Get the item tag and the item�s userdata block tag.
                        miTag       object_tag;
                        mi_query(miQ_INST_ITEM, NULL, state->instance, (void *)&object_tag);
                        if( object_tag == miNULLTAG )
                                return ( NULL );
                        miTag       data_tag;
                        mi_query(miQ_OBJ_DATA, NULL, object_tag, (void *)&data_tag );
                        while( data_tag )
                        {
                                miUint      label = 0;
                                mi_query( miQ_DATA_LABEL, NULL, data_tag, &label );
                                if( label == XSIMR_POINTCLOUDDATA_LABEL )
                                {
                                        xsimrPointCloudData     *data_ptr = NULL;
                                        mi_query( miQ_DATA_PARAM, NULL, data_tag, (void *)&data_ptr );
                                        if( data_ptr->version != XSIMR_POINTCLOUDDATA_VERSION )
                                        {
                                                mi_error( "Unsupported point cloud data version (%d.%d)", data_ptr->version >> 16, data_ptr->version & 0xFFFF );
                                                return( NULL );
                                        }
                                        return( data_ptr );
                                }
                                mi_query(miQ_DATA_NEXT, NULL, data_tag, &data_tag);
                        }
                        return( NULL );
                }
                static void *findAttribute
                (
                        xsimrPointCloudData *data_ptr,
                        const char      *name_wanted,
                        xsimrAttributeType type_wanted,
                        miBoolean       *is_constant
                        )
                {
                        for( int i = 0; i < data_ptr->n_data; i++ )
                        {
                                xsimrAttributeData  *attrib_ptr = &data_ptr->attributes[ data_ptr->i_data + i ];
                                const char*      attrib_name = (const char *)mi_db_access( attrib_ptr->name );
                                mi_db_unpin( attrib_ptr->name );
                                if( _stricmp( attrib_name, name_wanted ) == 0 &&
                                        attrib_ptr->type == type_wanted )
                                {
                                        void    *attrib_data_ptr;
                                        *is_constant = attrib_ptr->constant;
                                        mi_query( miQ_DATA_PARAM, NULL, attrib_ptr->data, &attrib_data_ptr );
                                        return( data_ptr );
                                }
                        }
                        return( NULL );
                }
                // Get position vector and "size" attribute from cloud
                void get_my_data
                (
                        miState         *state,
                        miVector        **pos_ptr,
                        miScalar        **radius_ptr,
                        miBoolean       *radius_const
                        )
                {
                        xsimrPointCloudData *data_ptr;
                        data_ptr = findParticleData( state );
                        if( !data_ptr )
                                return;
                        // Get the position vector.
                        mi_query( miQ_DATA_PARAM, NULL, data_ptr->positions, (void *)pos_ptr );
                        findAttribute( data_ptr, "Radius", xsimrATTRIBUTE_SCALAR, radius_const );
                }
| Public Attributes | |
| xsimrParticleShapeType | type | 
| miInteger | instance_id | 
The particle shape type.
| miInteger instance_id | 
If the shape type is xsimrSHAPE_INSTANCE, then this index into the instance list on the pointcloud geometry shader's parameter structure