#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