// static
bool LLVolumeMessage::constrainVolumeParams(LLVolumeParams& params)
{
	U32 bad = 0;

	// This is called immediately after an unpack. feed the raw data
	// through the checked setters to constraint it to a valid set of
	// volume params.
	bad |= params.setType(params.getProfileParams().getCurveType(),
						 params.getPathParams().getCurveType()) ? 0 : 1;
	bad |= params.setBeginAndEndS(params.getProfileParams().getBegin(),
								  params.getProfileParams().getEnd()) ? 0 : 2;
	bad |= params.setBeginAndEndT(params.getPathParams().getBegin(),
								  params.getPathParams().getEnd()) ? 0 : 4;
	bad |= params.setHollow(params.getProfileParams().getHollow()) ? 0 : 8;
	bad |= params.setTwistBegin(params.getPathParams().getTwistBegin()) ? 0 : 0x10;
	bad |= params.setTwistEnd(params.getPathParams().getTwistEnd()) ? 0 : 0x20;
	bad |= params.setRatio(params.getPathParams().getScaleX(),
						   params.getPathParams().getScaleY()) ? 0 : 0x40;
	bad |= params.setShear(params.getPathParams().getShearX(),
						   params.getPathParams().getShearY()) ? 0 : 0x80;
	bad |= params.setTaper(params.getPathParams().getTaperX(),
						   params.getPathParams().getTaperY()) ? 0 : 0x100;
	bad |= params.setRevolutions(params.getPathParams().getRevolutions()) ? 0 : 0x200;
	bad |= params.setRadiusOffset(params.getPathParams().getRadiusOffset()) ? 0 : 0x400;
	bad |= params.setSkew(params.getPathParams().getSkew()) ? 0 : 0x800;
	if(bad)
	{
		LL_WARNS() << "LLVolumeMessage::constrainVolumeParams() - "
				<< "forced to constrain incoming volume params: "
				<< llformat("0x%04x",bad) << LL_ENDL;
	}
	return bad ? false : true;
}
	void llprimitive_object_t::test<6>()
	{
		set_test_name("Test setVolume creation of new NOT-unique volume.");
		LLPrimitive primitive;
		LLVolumeParams params;
		
		// Make sure volume starts off null
		ensure(primitive.getVolume() == NULL);
		
		// Make sure we have no texture entries before setting the volume
		ensure_equals(primitive.getNumTEs(), 0);
		
		// Test that GEOMETRY has not been flagged as changed.
		ensure(!primitive.isChanged(LLXform::GEOMETRY));
		
		// Make sure setVolume returns true
		ensure(primitive.setVolume(params, 0, false) == TRUE);
		
		LLVolume* new_volume = primitive.getVolume();
		
		// make sure new volume was actually created
		ensure(new_volume != NULL);
		
		// Make sure that now that we've set the volume we have texture entries
		ensure_not_equals(primitive.getNumTEs(), 0);
		
		// Make sure that the number of texture entries equals the number of faces in the volume (should be 6)
		ensure_equals(new_volume->getNumFaces(), 6);
		ensure_equals(primitive.getNumTEs(), new_volume->getNumFaces());
		
		// Test that GEOMETRY has been flagged as changed.
		ensure(primitive.isChanged(LLXform::GEOMETRY));
		
		// Run it twice to make sure it doesn't create a different one if params are the same
		ensure(primitive.setVolume(params, 0, false) == FALSE);
		ensure(new_volume == primitive.getVolume());
		
		// Change the param definition and try setting it again.
		params.setRevolutions(4);
		ensure(primitive.setVolume(params, 0, false) == TRUE); 
		
		// Ensure that we now have a different volume
		ensure(new_volume != primitive.getVolume());
	}