Ejemplo n.º 1
0
/** Create or adjust "rot" parameter for a component
 * Assumed that name either equals "rotx", "roty" or "rotz" otherwise this
 * method will not add/modify "rot" parameter
 * @param comp :: Component
 * @param name :: Parameter name
 * @param deg :: Parameter value in degrees
 * @param pDescription :: a pointer (may be NULL) to a string, containing
 * parameter's
 * description. If provided, the contents of the string is copied to the
 * parameter's
 * memory
*/
void ParameterMap::addRotationParam(const IComponent *comp,
                                    const std::string &name, const double deg,
                                    const std::string *const pDescription) {
  Parameter_sptr paramRotX = get(comp, rotx());
  Parameter_sptr paramRotY = get(comp, roty());
  Parameter_sptr paramRotZ = get(comp, rotz());
  double rotX, rotY, rotZ;

  if (paramRotX)
    rotX = paramRotX->value<double>();
  else
    rotX = 0.0;

  if (paramRotY)
    rotY = paramRotY->value<double>();
  else
    rotY = 0.0;

  if (paramRotZ)
    rotZ = paramRotZ->value<double>();
  else
    rotZ = 0.0;

  // adjust rotation
  Quat quat;
  if (name.compare(rotx()) == 0) {
    addDouble(comp, rotx(), deg);
    quat = Quat(deg, V3D(1, 0, 0)) * Quat(rotY, V3D(0, 1, 0)) *
           Quat(rotZ, V3D(0, 0, 1));
  } else if (name.compare(roty()) == 0) {
    addDouble(comp, roty(), deg);
    quat = Quat(rotX, V3D(1, 0, 0)) * Quat(deg, V3D(0, 1, 0)) *
           Quat(rotZ, V3D(0, 0, 1));
  } else if (name.compare(rotz()) == 0) {
    addDouble(comp, rotz(), deg);
    quat = Quat(rotX, V3D(1, 0, 0)) * Quat(rotY, V3D(0, 1, 0)) *
           Quat(deg, V3D(0, 0, 1));
  } else {
    g_log.warning()
        << "addRotationParam() called with unrecognized coordinate symbol: "
        << name;
    return;
  }

  // clear the position cache
  clearPositionSensitiveCaches();

  // finally add or update "pos" parameter
  addQuat(comp, rot(), quat, pDescription);
}
Ejemplo n.º 2
0
void LLSDMessageBuilder::copyFromMessageData(const LLMsgData& data)
{
	// copy the blocks
	// counting variables used to encode multiple block info
	S32 block_count = 0;
    char* block_name = NULL;

	// loop through msg blocks to loop through variables, totalling up size
	// data and filling the new (send) message
	LLMsgData::msg_blk_data_map_t::const_iterator iter = 
		data.mMemberBlocks.begin();
	LLMsgData::msg_blk_data_map_t::const_iterator end = 
		data.mMemberBlocks.end();
	for(; iter != end; ++iter)
	{
		const LLMsgBlkData* mbci = iter->second;
		if(!mbci) continue;

		// do we need to encode a block code?
		if (block_count == 0)
		{
			block_count = mbci->mBlockNumber;
			block_name = (char*)mbci->mName;
		}

		// counting down mutliple blocks
		block_count--;

		nextBlock(block_name);

		// now loop through the variables
		LLMsgBlkData::msg_var_data_map_t::const_iterator dit = mbci->mMemberVarData.begin();
		LLMsgBlkData::msg_var_data_map_t::const_iterator dend = mbci->mMemberVarData.end();
		
		for(; dit != dend; ++dit)
		{
			const LLMsgVarData& mvci = *dit;
			const char* varname = mvci.getName();

			switch(mvci.getType())
			{
			case MVT_FIXED:
				addBinaryData(varname, mvci.getData(), mvci.getSize());
				break;

			case MVT_VARIABLE:
				{
					const char end = ((const char*)mvci.getData())[mvci.getSize()-1]; // Ensure null terminated
					if (mvci.getDataSize() == 1 && end == 0) 
					{
						addString(varname, (const char*)mvci.getData());
					}
					else
					{
						addBinaryData(varname, mvci.getData(), mvci.getSize());
					}
					break;
				}

			case MVT_U8:
				addU8(varname, *(U8*)mvci.getData());
				break;

			case MVT_U16:
				addU16(varname, *(U16*)mvci.getData());
				break;

			case MVT_U32:
				addU32(varname, *(U32*)mvci.getData());
				break;

			case MVT_U64:
				addU64(varname, *(U64*)mvci.getData());
				break;

			case MVT_S8:
				addS8(varname, *(S8*)mvci.getData());
				break;

			case MVT_S16:
				addS16(varname, *(S16*)mvci.getData());
				break;

			case MVT_S32:
				addS32(varname, *(S32*)mvci.getData());
				break;

			// S64 not supported in LLSD so we just truncate it
			case MVT_S64:
				addS32(varname, *(S64*)mvci.getData());
				break;

			case MVT_F32:
				addF32(varname, *(F32*)mvci.getData());
				break;

			case MVT_F64:
				addF64(varname, *(F64*)mvci.getData());
				break;

			case MVT_LLVector3:
				addVector3(varname, *(LLVector3*)mvci.getData());
				break;

			case MVT_LLVector3d:
				addVector3d(varname, *(LLVector3d*)mvci.getData());
				break;

			case MVT_LLVector4:
				addVector4(varname, *(LLVector4*)mvci.getData());
				break;

			case MVT_LLQuaternion:
				{
					LLVector3 v = *(LLVector3*)mvci.getData();
					LLQuaternion q;
					q.unpackFromVector3(v);
					addQuat(varname, q);
					break;
				}

			case MVT_LLUUID:
				addUUID(varname, *(LLUUID*)mvci.getData());
				break;	

			case MVT_BOOL:
				addBOOL(varname, *(BOOL*)mvci.getData());
				break;

			case MVT_IP_ADDR:
				addIPAddr(varname, *(U32*)mvci.getData());
				break;

			case MVT_IP_PORT:
				addIPPort(varname, *(U16*)mvci.getData());
				break;

			case MVT_U16Vec3:
				//treated as an array of 6 bytes
				addBinaryData(varname, mvci.getData(), 6);
				break;

			case MVT_U16Quat:
				//treated as an array of 8 bytes
				addBinaryData(varname, mvci.getData(), 8);
				break;

			case MVT_S16Array:
				addBinaryData(varname, mvci.getData(), mvci.getSize());
				break;

			default:
				llwarns << "Unknown type in conversion of message to LLSD" << llendl;
				break;
			}
		}
	}
}
Ejemplo n.º 3
0
    /** Create or adjust "rot" parameter for a component
     * Assumed that name either equals "rotx", "roty" or "rotz" otherwise this 
     * method will not add/modify "rot" parameter
     * @param comp :: Component
     * @param name :: Parameter name
     * @param deg :: Parameter value in degrees
    */
    void ParameterMap::addRotationParam(const IComponent* comp,const std::string& name, const double deg)
    {
      Parameter_sptr param = get(comp,"rot");
      Quat quat;

      Parameter_sptr paramRotX = get(comp,"rotx");
      Parameter_sptr paramRotY = get(comp,"roty");
      Parameter_sptr paramRotZ = get(comp,"rotz");
      double rotX, rotY, rotZ;

      if ( paramRotX )
        rotX = paramRotX->value<double>();
      else
        rotX = 0.0;

      if ( paramRotY )
        rotY = paramRotY->value<double>();
      else
        rotY = 0.0;

      if ( paramRotZ )
        rotZ = paramRotZ->value<double>();
      else
        rotZ = 0.0;
        

      // adjust rotation

      if ( name.compare("rotx")==0 )
      {
        if (paramRotX)
          paramRotX->set(deg);
        else
          addDouble(comp, "rotx", deg);

        quat = Quat(deg,V3D(1,0,0))*Quat(rotY,V3D(0,1,0))*Quat(rotZ,V3D(0,0,1));
      }
      else if ( name.compare("roty")==0 )
      {
        if (paramRotY)
          paramRotY->set(deg);
        else
          addDouble(comp, "roty", deg);

        quat = Quat(rotX,V3D(1,0,0))*Quat(deg,V3D(0,1,0))*Quat(rotZ,V3D(0,0,1));
      }
      else if ( name.compare("rotz")==0 )
      {
        if (paramRotZ)
          paramRotZ->set(deg);
        else
          addDouble(comp, "rotz", deg);

        quat = Quat(rotX,V3D(1,0,0))*Quat(rotY,V3D(0,1,0))*Quat(deg,V3D(0,0,1));
      }
      else
      {
        g_log.warning() << "addRotationParam() called with unrecognised coordinate symbol: " << name;
        return;
      }

      //clear the position cache
      clearCache();

      // finally add or update "pos" parameter
      if (param)
        param->set(quat);
      else
        addQuat(comp, "rot", quat);
    }