SendProp SendPropQuaternion( const char *pVarName, int offset, int sizeofVar, int nBits, // Number of bits to use when encoding. int flags, float fLowValue, // For floating point, low and high values. float fHighValue, // High value. If HIGH_DEFAULT, it's (1<<nBits). SendVarProxyFn varProxy ) { SendProp ret; if(varProxy == SendProxy_QuaternionToQuaternion) { Assert(sizeofVar == sizeof(Quaternion)); } if ( nBits == 32 ) flags |= SPROP_NOSCALE; ret.m_Type = DPT_Quaternion; ret.m_pVarName = pVarName; ret.SetOffset( offset ); ret.m_nBits = nBits; ret.SetFlags( flags ); ret.m_fLowValue = fLowValue; ret.m_fHighValue = fHighValue; ret.m_fHighLowMul = AssignRangeMultiplier( ret.m_nBits, ret.m_fHighValue - ret.m_fLowValue ); ret.SetProxyFn( varProxy ); if( ret.GetFlags() & (SPROP_COORD | SPROP_NOSCALE | SPROP_NORMAL | SPROP_COORD_MP | SPROP_COORD_MP_LOWPRECISION | SPROP_COORD_MP_INTEGRAL) ) ret.m_nBits = 0; return ret; }
SendProp SendPropFloat( const char *pVarName, // Variable name. int offset, // Offset into container structure. int sizeofVar, int nBits, // Number of bits to use when encoding. int flags, float fLowValue, // For floating point, low and high values. float fHighValue, // High value. If HIGH_DEFAULT, it's (1<<nBits). SendVarProxyFn varProxy ) { SendProp ret; if ( varProxy == SendProxy_FloatToFloat ) { Assert( sizeofVar == 0 || sizeofVar == 4 ); } if ( nBits <= 0 || nBits == 32 ) { flags |= SPROP_NOSCALE; fLowValue = 0.f; fHighValue = 0.f; } else { if(fHighValue == HIGH_DEFAULT) fHighValue = (1 << nBits); if (flags & SPROP_ROUNDDOWN) fHighValue = fHighValue - ((fHighValue - fLowValue) / (1 << nBits)); else if (flags & SPROP_ROUNDUP) fLowValue = fLowValue + ((fHighValue - fLowValue) / (1 << nBits)); } ret.m_Type = DPT_Float; ret.m_pVarName = pVarName; ret.SetOffset( offset ); ret.m_nBits = nBits; ret.SetFlags( flags ); ret.m_fLowValue = fLowValue; ret.m_fHighValue = fHighValue; ret.m_fHighLowMul = AssignRangeMultiplier( ret.m_nBits, ret.m_fHighValue - ret.m_fLowValue ); ret.SetProxyFn( varProxy ); if( ret.GetFlags() & (SPROP_COORD | SPROP_NOSCALE | SPROP_NORMAL | SPROP_COORD_MP | SPROP_COORD_MP_LOWPRECISION | SPROP_COORD_MP_INTEGRAL ) ) ret.m_nBits = 0; return ret; }
SendProp SendPropString( char *pVarName, int offset, int bufferLen, int flags, SendVarProxyFn varProxy) { SendProp ret; Assert( bufferLen <= DT_MAX_STRING_BUFFERSIZE ); // You can only have strings with 8-bits worth of length. ret.m_Type = DPT_String; ret.m_pVarName = pVarName; ret.SetOffset( offset ); ret.SetFlags( flags ); ret.SetProxyFn( varProxy ); return ret; }
SendProp InternalSendPropArray( const int elementCount, const int elementStride, char *pName, ArrayLengthSendProxyFn arrayLengthFn ) { SendProp ret; ret.m_Type = DPT_Array; ret.m_nElements = elementCount; ret.m_ElementStride = elementStride; ret.m_pVarName = pName; ret.SetProxyFn( SendProxy_Empty ); ret.m_pArrayProp = NULL; // This gets set in SendTable_InitTable. It always points at the property that precedes // this one in the datatable's list. ret.SetArrayLengthProxy( arrayLengthFn ); return ret; }
SendProp SendPropInt( char *pVarName, int offset, int sizeofVar, int nBits, int flags, SendVarProxyFn varProxy ) { SendProp ret; if ( !varProxy ) { if ( sizeofVar == 1 ) { varProxy = SendProxy_Int8ToInt32; } else if ( sizeofVar == 2 ) { varProxy = SendProxy_Int16ToInt32; } else if ( sizeofVar == 4 ) { varProxy = SendProxy_Int32ToInt32; } else { Assert(!"SendPropInt var has invalid size"); varProxy = SendProxy_Int8ToInt32; // safest one... } } // Figure out # of bits if the want us to. if ( nBits <= 0 ) { Assert( sizeofVar == 1 || sizeofVar == 2 || sizeofVar == 4 ); nBits = sizeofVar * 8; } ret.m_Type = DPT_Int; ret.m_pVarName = pVarName; ret.SetOffset( offset ); ret.m_nBits = nBits; ret.SetFlags( flags ); // Use UInt proxies if they want unsigned data. This isn't necessary to encode // the values correctly, but it lets us check the ranges of the data to make sure // they're valid. ret.SetProxyFn( varProxy ); if( ret.GetFlags() & SPROP_UNSIGNED ) { if( varProxy == SendProxy_Int8ToInt32 ) ret.SetProxyFn( SendProxy_UInt8ToInt32 ); else if( varProxy == SendProxy_Int16ToInt32 ) ret.SetProxyFn( SendProxy_UInt16ToInt32 ); else if( varProxy == SendProxy_Int32ToInt32 ) ret.SetProxyFn( SendProxy_UInt32ToInt32 ); } return ret; }