bump sg libraries to v2.0.2 and adjust to the latest changes
This commit is contained in:
@@ -68,14 +68,14 @@ float FSGAnatomy::GetThumbJointLimit(const bool bRightHanded, const int32 Joint,
|
|||||||
return SGCoreImpl_FSGAnatomyImpl_GetThumbJointLimit(bRightHanded, Joint, Movement, bMax);
|
return SGCoreImpl_FSGAnatomyImpl_GetThumbJointLimit(bRightHanded, Joint, Movement, bMax);
|
||||||
}
|
}
|
||||||
|
|
||||||
float FSGAnatomy::NormalizeFingerFlex(const float FlexionInRadians)
|
float FSGAnatomy::NormalizeFingerFlexion(const float FlexionInRadians)
|
||||||
{
|
{
|
||||||
return SGCoreImpl_FSGAnatomyImpl_NormalizeFingerFlex(FlexionInRadians);
|
return SGCoreImpl_FSGAnatomyImpl_NormalizeFingerFlexion(FlexionInRadians);
|
||||||
}
|
}
|
||||||
|
|
||||||
float FSGAnatomy::NormalizeThumbFlex(float FlexionInRadians)
|
float FSGAnatomy::NormalizeThumbFlexion(const float FlexionInRadians)
|
||||||
{
|
{
|
||||||
return SGCoreImpl_FSGAnatomyImpl_NormalizeThumbFlex(FlexionInRadians);
|
return SGCoreImpl_FSGAnatomyImpl_NormalizeThumbFlexion(FlexionInRadians);
|
||||||
}
|
}
|
||||||
|
|
||||||
TArray<TArray<FVector>> FSGAnatomy::GetDefaultHandAngles(const bool bRightHanded)
|
TArray<TArray<FVector>> FSGAnatomy::GetDefaultHandAngles(const bool bRightHanded)
|
||||||
@@ -85,21 +85,21 @@ TArray<TArray<FVector>> FSGAnatomy::GetDefaultHandAngles(const bool bRightHanded
|
|||||||
return MoveTemp(OutAnglesContainer.Array);
|
return MoveTemp(OutAnglesContainer.Array);
|
||||||
}
|
}
|
||||||
|
|
||||||
TArray<TArray<FVector>> FSGAnatomy::GetFlatHandAngles(bool bRightHanded)
|
TArray<TArray<FVector>> FSGAnatomy::GetFlatHandAngles(const bool bRightHanded)
|
||||||
{
|
{
|
||||||
FSGIC_TArray_TArray_FVector OutAnglesContainer;
|
FSGIC_TArray_TArray_FVector OutAnglesContainer;
|
||||||
SGCoreImpl_FSGAnatomyImpl_GetFlatHandAngles(&OutAnglesContainer, bRightHanded);
|
SGCoreImpl_FSGAnatomyImpl_GetFlatHandAngles(&OutAnglesContainer, bRightHanded);
|
||||||
return MoveTemp(OutAnglesContainer.Array);
|
return MoveTemp(OutAnglesContainer.Array);
|
||||||
}
|
}
|
||||||
|
|
||||||
TArray<TArray<FVector>> FSGAnatomy::GetThumbsUpHandAngles(bool bRightHanded)
|
TArray<TArray<FVector>> FSGAnatomy::GetThumbsUpHandAngles(const bool bRightHanded)
|
||||||
{
|
{
|
||||||
FSGIC_TArray_TArray_FVector OutAnglesContainer;
|
FSGIC_TArray_TArray_FVector OutAnglesContainer;
|
||||||
SGCoreImpl_FSGAnatomyImpl_GetThumbsUpHandAngles(&OutAnglesContainer, bRightHanded);
|
SGCoreImpl_FSGAnatomyImpl_GetThumbsUpHandAngles(&OutAnglesContainer, bRightHanded);
|
||||||
return MoveTemp(OutAnglesContainer.Array);
|
return MoveTemp(OutAnglesContainer.Array);
|
||||||
}
|
}
|
||||||
|
|
||||||
TArray<TArray<FVector>> FSGAnatomy::GetFistHandAngles(bool bRightHanded)
|
TArray<TArray<FVector>> FSGAnatomy::GetFistHandAngles(const bool bRightHanded)
|
||||||
{
|
{
|
||||||
FSGIC_TArray_TArray_FVector OutAnglesContainer;
|
FSGIC_TArray_TArray_FVector OutAnglesContainer;
|
||||||
SGCoreImpl_FSGAnatomyImpl_GetFistHandAngles(&OutAnglesContainer, bRightHanded);
|
SGCoreImpl_FSGAnatomyImpl_GetFistHandAngles(&OutAnglesContainer, bRightHanded);
|
||||||
|
|||||||
@@ -224,10 +224,10 @@ TArray<FVector> USGBasicHandModel::GetBaseJointPositions()
|
|||||||
return MoveTemp(OutPositionsContainer.Array);
|
return MoveTemp(OutPositionsContainer.Array);
|
||||||
}
|
}
|
||||||
|
|
||||||
TArray<FVector> USGBasicHandModel::GetBaseJointRotations()
|
TArray<FVector> USGBasicHandModel::GetBaseJointAngles()
|
||||||
{
|
{
|
||||||
FSGIC_TArray_FVector OutRotationsContainer;
|
FSGIC_TArray_FVector OutRotationsContainer;
|
||||||
SGCoreImpl_FSGBasicHandModelImpl_GetBaseJointRotations(&OutRotationsContainer);
|
SGCoreImpl_FSGBasicHandModelImpl_GetBaseJointAngles(&OutRotationsContainer);
|
||||||
return MoveTemp(OutRotationsContainer.Array);
|
return MoveTemp(OutRotationsContainer.Array);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -59,9 +59,9 @@ public:
|
|||||||
|
|
||||||
static float GetThumbJointLimit(bool bRightHanded, int32 Joint, int32 Movement, bool bMax);
|
static float GetThumbJointLimit(bool bRightHanded, int32 Joint, int32 Movement, bool bMax);
|
||||||
|
|
||||||
static float NormalizeFingerFlex(float FlexionInRadians);
|
static float NormalizeFingerFlexion(float FlexionInRadians);
|
||||||
|
|
||||||
static float NormalizeThumbFlex(float FlexionInRadians);
|
static float NormalizeThumbFlexion(float FlexionInRadians);
|
||||||
|
|
||||||
static TArray<TArray<FVector>> GetDefaultHandAngles(bool bRightHanded);
|
static TArray<TArray<FVector>> GetDefaultHandAngles(bool bRightHanded);
|
||||||
|
|
||||||
|
|||||||
@@ -102,7 +102,7 @@ public:
|
|||||||
|
|
||||||
static TArray<FVector> GetBaseJointPositions();
|
static TArray<FVector> GetBaseJointPositions();
|
||||||
|
|
||||||
static TArray<FVector> GetBaseJointRotations();
|
static TArray<FVector> GetBaseJointAngles();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct FImpl;
|
struct FImpl;
|
||||||
|
|||||||
@@ -72,14 +72,14 @@ float FSGAnatomyImpl::GetThumbJointLimit(
|
|||||||
return FAnatomyType::GetThumbJointLimit(bRightHanded, Joint, Movement, bMax);
|
return FAnatomyType::GetThumbJointLimit(bRightHanded, Joint, Movement, bMax);
|
||||||
}
|
}
|
||||||
|
|
||||||
float FSGAnatomyImpl::NormalizeFingerFlex(const float FlexionInRadians)
|
float FSGAnatomyImpl::NormalizeFingerFlexion(const float FlexionInRadians)
|
||||||
{
|
{
|
||||||
return FAnatomyType::NormalizeFingerFlex(FlexionInRadians);
|
return FAnatomyType::NormalizeFingerFlexion(FlexionInRadians);
|
||||||
}
|
}
|
||||||
|
|
||||||
float FSGAnatomyImpl::NormalizeThumbFlex(const float FlexionInRadians)
|
float FSGAnatomyImpl::NormalizeThumbFlexion(const float FlexionInRadians)
|
||||||
{
|
{
|
||||||
return FAnatomyType::NormalizeThumbFlex(FlexionInRadians);
|
return FAnatomyType::NormalizeThumbFlexion(FlexionInRadians);
|
||||||
}
|
}
|
||||||
|
|
||||||
TArray<TArray<FVector>> FSGAnatomyImpl::GetDefaultHandAngles(const bool bRightHanded)
|
TArray<TArray<FVector>> FSGAnatomyImpl::GetDefaultHandAngles(const bool bRightHanded)
|
||||||
|
|||||||
@@ -108,13 +108,13 @@ const TArray<FVector>& FSGBasicHandModelImpl::GetBaseJointPositions()
|
|||||||
return BaseJointPositions;
|
return BaseJointPositions;
|
||||||
}
|
}
|
||||||
|
|
||||||
const TArray<FVector>& FSGBasicHandModelImpl::GetBaseJointRotations()
|
const TArray<FVector>& FSGBasicHandModelImpl::GetBaseJointAngles()
|
||||||
{
|
{
|
||||||
static const TArray<FVector> BaseJointRotations{
|
static const TArray<FVector> BaseJointAngles{
|
||||||
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>(
|
FSGArrayUtils::FromStdVector<FSGVect3DImpl::FVect3DType, FVector, FSGVect3DImpl, &FSGVect3DImpl::ToFVector>(
|
||||||
FBasicHandModelType::GetBaseJointRotations())
|
FBasicHandModelType::GetBaseJointAngles())
|
||||||
};
|
};
|
||||||
return BaseJointRotations;
|
return BaseJointAngles;
|
||||||
}
|
}
|
||||||
|
|
||||||
FSGBasicHandModelImpl::FSGBasicHandModelImpl()
|
FSGBasicHandModelImpl::FSGBasicHandModelImpl()
|
||||||
|
|||||||
@@ -169,16 +169,16 @@ float SGCoreImpl_FSGAnatomyImpl_GetThumbJointLimit(
|
|||||||
return FSGAnatomyImpl::GetThumbJointLimit(bRightHanded, Joint, Movement, bMax);
|
return FSGAnatomyImpl::GetThumbJointLimit(bRightHanded, Joint, Movement, bMax);
|
||||||
}
|
}
|
||||||
|
|
||||||
float SGCoreImpl_FSGAnatomyImpl_NormalizeFingerFlex(
|
float SGCoreImpl_FSGAnatomyImpl_NormalizeFingerFlexion(
|
||||||
const float FlexionInRadians)
|
const float FlexionInRadians)
|
||||||
{
|
{
|
||||||
return FSGAnatomyImpl::NormalizeFingerFlex(FlexionInRadians);
|
return FSGAnatomyImpl::NormalizeFingerFlexion(FlexionInRadians);
|
||||||
}
|
}
|
||||||
|
|
||||||
float SGCoreImpl_FSGAnatomyImpl_NormalizeThumbFlex(
|
float SGCoreImpl_FSGAnatomyImpl_NormalizeThumbFlexion(
|
||||||
const float FlexionInRadians)
|
const float FlexionInRadians)
|
||||||
{
|
{
|
||||||
return FSGAnatomyImpl::NormalizeThumbFlex(FlexionInRadians);
|
return FSGAnatomyImpl::NormalizeThumbFlexion(FlexionInRadians);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SGCoreImpl_FSGAnatomyImpl_GetDefaultHandAngles(
|
void SGCoreImpl_FSGAnatomyImpl_GetDefaultHandAngles(
|
||||||
@@ -246,10 +246,10 @@ void SGCoreImpl_FSGBasicHandModelImpl_GetBaseJointPositions(
|
|||||||
StaticCast<FSGIC_TArray_FVector*>(OutPositions)->Array = FSGBasicHandModelImpl::GetBaseJointPositions();
|
StaticCast<FSGIC_TArray_FVector*>(OutPositions)->Array = FSGBasicHandModelImpl::GetBaseJointPositions();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SGCoreImpl_FSGBasicHandModelImpl_GetBaseJointRotations(
|
void SGCoreImpl_FSGBasicHandModelImpl_GetBaseJointAngles(
|
||||||
void* OutRotations)
|
void* OutRotations)
|
||||||
{
|
{
|
||||||
StaticCast<FSGIC_TArray_FVector*>(OutRotations)->Array = FSGBasicHandModelImpl::GetBaseJointRotations();
|
StaticCast<FSGIC_TArray_FVector*>(OutRotations)->Array = FSGBasicHandModelImpl::GetBaseJointAngles();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SGCoreImpl_FSGBasicHandModelImpl_ctor(
|
void SGCoreImpl_FSGBasicHandModelImpl_ctor(
|
||||||
|
|||||||
@@ -64,9 +64,9 @@ public:
|
|||||||
|
|
||||||
static float GetThumbJointLimit(bool bRightHanded, int32 Joint, int32 Movement, bool bMax);
|
static float GetThumbJointLimit(bool bRightHanded, int32 Joint, int32 Movement, bool bMax);
|
||||||
|
|
||||||
static float NormalizeFingerFlex(float FlexionInRadians);
|
static float NormalizeFingerFlexion(float FlexionInRadians);
|
||||||
|
|
||||||
static float NormalizeThumbFlex(float FlexionInRadians);
|
static float NormalizeThumbFlexion(float FlexionInRadians);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static TArray<TArray<FVector>> GetDefaultHandAngles(bool bRightHanded);
|
static TArray<TArray<FVector>> GetDefaultHandAngles(bool bRightHanded);
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ public:
|
|||||||
|
|
||||||
static const TArray<FVector>& GetBaseJointPositions();
|
static const TArray<FVector>& GetBaseJointPositions();
|
||||||
|
|
||||||
static const TArray<FVector>& GetBaseJointRotations();
|
static const TArray<FVector>& GetBaseJointAngles();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct FImpl;
|
struct FImpl;
|
||||||
|
|||||||
@@ -88,10 +88,10 @@ SENSEGLOVECOREIMPL_PUBLIC_API float SGCoreImpl_FSGAnatomyImpl_GetThumbJointLimit
|
|||||||
int32 Movement,
|
int32 Movement,
|
||||||
bool bMax);
|
bool bMax);
|
||||||
|
|
||||||
SENSEGLOVECOREIMPL_PUBLIC_API float SGCoreImpl_FSGAnatomyImpl_NormalizeFingerFlex(
|
SENSEGLOVECOREIMPL_PUBLIC_API float SGCoreImpl_FSGAnatomyImpl_NormalizeFingerFlexion(
|
||||||
float FlexionInRadians);
|
float FlexionInRadians);
|
||||||
|
|
||||||
SENSEGLOVECOREIMPL_PUBLIC_API float SGCoreImpl_FSGAnatomyImpl_NormalizeThumbFlex(
|
SENSEGLOVECOREIMPL_PUBLIC_API float SGCoreImpl_FSGAnatomyImpl_NormalizeThumbFlexion(
|
||||||
float FlexionInRadians);
|
float FlexionInRadians);
|
||||||
|
|
||||||
SENSEGLOVECOREIMPL_PUBLIC_API void SGCoreImpl_FSGAnatomyImpl_GetDefaultHandAngles(
|
SENSEGLOVECOREIMPL_PUBLIC_API void SGCoreImpl_FSGAnatomyImpl_GetDefaultHandAngles(
|
||||||
@@ -128,7 +128,7 @@ SENSEGLOVECOREIMPL_PUBLIC_API void SGCoreImpl_FSGBasicHandModelImpl_GetBaseFinge
|
|||||||
SENSEGLOVECOREIMPL_PUBLIC_API void SGCoreImpl_FSGBasicHandModelImpl_GetBaseJointPositions(
|
SENSEGLOVECOREIMPL_PUBLIC_API void SGCoreImpl_FSGBasicHandModelImpl_GetBaseJointPositions(
|
||||||
void* OutPositions);
|
void* OutPositions);
|
||||||
|
|
||||||
SENSEGLOVECOREIMPL_PUBLIC_API void SGCoreImpl_FSGBasicHandModelImpl_GetBaseJointRotations(
|
SENSEGLOVECOREIMPL_PUBLIC_API void SGCoreImpl_FSGBasicHandModelImpl_GetBaseJointAngles(
|
||||||
void* OutRotations);
|
void* OutRotations);
|
||||||
|
|
||||||
SENSEGLOVECOREIMPL_PUBLIC_API void SGCoreImpl_FSGBasicHandModelImpl_ctor(
|
SENSEGLOVECOREIMPL_PUBLIC_API void SGCoreImpl_FSGBasicHandModelImpl_ctor(
|
||||||
|
|||||||
@@ -70,14 +70,14 @@ float USGAnatomyKismetLibrary::GetThumbJointLimit(const bool bRightHanded, const
|
|||||||
return FSGAnatomy::GetThumbJointLimit(bRightHanded, Joint, Movement, bMax);
|
return FSGAnatomy::GetThumbJointLimit(bRightHanded, Joint, Movement, bMax);
|
||||||
}
|
}
|
||||||
|
|
||||||
float USGAnatomyKismetLibrary::NormalizeFingerFlex(const float FlexionInRadians)
|
float USGAnatomyKismetLibrary::NormalizeFingerFlexion(const float FlexionInRadians)
|
||||||
{
|
{
|
||||||
return FSGAnatomy::NormalizeFingerFlex(FlexionInRadians);
|
return FSGAnatomy::NormalizeFingerFlexion(FlexionInRadians);
|
||||||
}
|
}
|
||||||
|
|
||||||
float USGAnatomyKismetLibrary::NormalizeThumbFlex(const float FlexionInRadians)
|
float USGAnatomyKismetLibrary::NormalizeThumbFlexion(const float FlexionInRadians)
|
||||||
{
|
{
|
||||||
return FSGAnatomy::NormalizeThumbFlex(FlexionInRadians);
|
return FSGAnatomy::NormalizeThumbFlexion(FlexionInRadians);
|
||||||
}
|
}
|
||||||
|
|
||||||
TArray<FSGVectorArray> USGAnatomyKismetLibrary::GetDefaultHandAngles(const bool bRightHanded)
|
TArray<FSGVectorArray> USGAnatomyKismetLibrary::GetDefaultHandAngles(const bool bRightHanded)
|
||||||
|
|||||||
@@ -89,9 +89,9 @@ TArray<FVector> USGBasicHandModelKismetLibrary::GetBaseJointPositions()
|
|||||||
return USGBasicHandModel::GetBaseJointPositions();
|
return USGBasicHandModel::GetBaseJointPositions();
|
||||||
}
|
}
|
||||||
|
|
||||||
TArray<FVector> USGBasicHandModelKismetLibrary::GetBaseJointRotations()
|
TArray<FVector> USGBasicHandModelKismetLibrary::GetBaseJointAngles()
|
||||||
{
|
{
|
||||||
return USGBasicHandModel::GetBaseJointRotations();
|
return USGBasicHandModel::GetBaseJointAngles();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool USGBasicHandModelKismetLibrary::IsRight(const USGBasicHandModel* BasicHandModel)
|
bool USGBasicHandModelKismetLibrary::IsRight(const USGBasicHandModel* BasicHandModel)
|
||||||
|
|||||||
@@ -68,10 +68,10 @@ public:
|
|||||||
static float GetThumbJointLimit(bool bRightHanded, int32 Joint, int32 Movement, bool bMax);
|
static float GetThumbJointLimit(bool bRightHanded, int32 Joint, int32 Movement, bool bMax);
|
||||||
|
|
||||||
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Kinematics | Anatomy")
|
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Kinematics | Anatomy")
|
||||||
static float NormalizeFingerFlex(float FlexionInRadians);
|
static float NormalizeFingerFlexion(float FlexionInRadians);
|
||||||
|
|
||||||
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Kinematics | Anatomy")
|
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Kinematics | Anatomy")
|
||||||
static float NormalizeThumbFlex(float FlexionInRadians);
|
static float NormalizeThumbFlexion(float FlexionInRadians);
|
||||||
|
|
||||||
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Kinematics | Anatomy")
|
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Kinematics | Anatomy")
|
||||||
static TArray<FSGVectorArray> GetDefaultHandAngles(bool bRightHanded);
|
static TArray<FSGVectorArray> GetDefaultHandAngles(bool bRightHanded);
|
||||||
|
|||||||
@@ -91,7 +91,7 @@ public:
|
|||||||
static TArray<FVector> GetBaseJointPositions();
|
static TArray<FVector> GetBaseJointPositions();
|
||||||
|
|
||||||
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Kinematics | Basic Hand Model")
|
UFUNCTION(BlueprintCallable, Category="SenseGlove | Core | Kinematics | Basic Hand Model")
|
||||||
static TArray<FVector> GetBaseJointRotations();
|
static TArray<FVector> GetBaseJointAngles();
|
||||||
|
|
||||||
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Kinematics | Basic Hand Model")
|
UFUNCTION(BlueprintPure, Category="SenseGlove | Core | Kinematics | Basic Hand Model")
|
||||||
static bool IsRight(const USGBasicHandModel* BasicHandModel);
|
static bool IsRight(const USGBasicHandModel* BasicHandModel);
|
||||||
|
|||||||
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user