public FieldInfo( ParticleFieldType type, int numElements, int offset, object defaultValue ) { m_Type = type; m_NumElements = numElements; m_Size = ParticleFieldTypeSize( type ) * numElements; m_Offset = offset; m_DefaultValues = new object[ numElements ]; if ( defaultValue is Array ) { object[] src = ( object[] )defaultValue; for ( int i = 0; i < numElements; ++i ) { m_DefaultValues[ i ] = src[ i ]; } } else { m_DefaultValues = new object[ numElements ]; for ( int i = 0; i < numElements; ++i ) { m_DefaultValues[ i ] = defaultValue; } } }
/// <summary> /// Adds a field to the particle definition /// </summary> public void AddField( string name, ParticleFieldType type, int numElements, object defaultValue ) { FieldInfo field; if ( m_Fields.TryGetValue( name, out field ) ) { if ( type != field.Type ) { throw new ArgumentException( string.Format( "Field \"{0}\" was already defined using type {1}, not type {2}", name, field.Type, type ), "type" ); } if ( field.NumElements != numElements ) { throw new ArgumentException( string.Format( "Field \"{0}\" was already defined with {1} elements of type {2}, not {3}", name, field.NumElements, type, numElements ), "numElements" ); } return; } m_BuildBuffer = true; field = new FieldInfo( type, numElements, m_Stride, defaultValue ); m_Fields.Add( name, field ); m_Stride += field.Size; }
private static int ParticleFieldTypeSize( ParticleFieldType type ) { switch ( type ) { case ParticleFieldType.Int32 : return sizeof( int ); case ParticleFieldType.Float32 : return sizeof( float ); } throw new NotSupportedException( "Unsupported field type " + type ); }