added COLLADA Physics export. import will follow soon.
Note that the exporter/importer doesn't handle GIMPACT and btStaticPlaneShape yet.
This commit is contained in:
@@ -28,7 +28,7 @@ LDFLAGS =-Wl,-Bsymbolic -shared
|
|||||||
|
|
||||||
BULLET_INCLUDE=-I$(BULLET)/src -I$(BULLET)/Extras/GIMPACT/include
|
BULLET_INCLUDE=-I$(BULLET)/src -I$(BULLET)/Extras/GIMPACT/include
|
||||||
BULLET_LIB=-L$(BULLET)/out/linux/optimize/libs -L$(BULLET)/src \
|
BULLET_LIB=-L$(BULLET)/out/linux/optimize/libs -L$(BULLET)/src \
|
||||||
-lGIMPACT -lGIMPACTUtils -lbulletdynamics \
|
-lBulletColladaConverter -lcolladadom -llibxml -lGIMPACT -lGIMPACTUtils -lbulletdynamics \
|
||||||
-lbulletmath -lbulletcollision -lbulletopenglsupport
|
-lbulletmath -lbulletcollision -lbulletopenglsupport
|
||||||
|
|
||||||
GL_LIB=-lGL -lGLU
|
GL_LIB=-lGL -lGLU
|
||||||
@@ -36,7 +36,7 @@ GL_LIB=-lGL -lGLU
|
|||||||
MAYA_INCLUDE=-I$(MAYA)/include
|
MAYA_INCLUDE=-I$(MAYA)/include
|
||||||
MAYA_LIB=-L$(MAYA)/lib -lOpenMaya -lFoundation -lOpenMayaUI -lOpenMayaFX
|
MAYA_LIB=-L$(MAYA)/lib -lOpenMaya -lFoundation -lOpenMayaUI -lOpenMayaFX
|
||||||
|
|
||||||
SOURCES = pluginMain.cpp rigidBodyNode.cpp rigidBodyArrayNode.cpp collisionShapeNode.cpp \
|
SOURCES = pluginMain.cpp colladaExport.cpp rigidBodyNode.cpp rigidBodyArrayNode.cpp collisionShapeNode.cpp \
|
||||||
solver.cpp bt_solver.cpp dSolverNode.cpp dSolverCmd.cpp dRigidBodyCmd.cpp dRigidBodyArrayCmd.cpp \
|
solver.cpp bt_solver.cpp dSolverNode.cpp dSolverCmd.cpp dRigidBodyCmd.cpp dRigidBodyArrayCmd.cpp \
|
||||||
pdbIO.cpp drawUtils.cpp
|
pdbIO.cpp drawUtils.cpp
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ LDFLAGS =-bundle -ldl -shared
|
|||||||
|
|
||||||
BULLET_INCLUDE=-I$(BULLET)/src -I$(BULLET)/Extras/GIMPACT/include
|
BULLET_INCLUDE=-I$(BULLET)/src -I$(BULLET)/Extras/GIMPACT/include
|
||||||
BULLET_LIB=-L$(BULLET)/out/macosxx86/optimize/libs -L$(BULLET)/src \
|
BULLET_LIB=-L$(BULLET)/out/macosxx86/optimize/libs -L$(BULLET)/src \
|
||||||
-lGIMPACT -lGIMPACTUtils -lbulletdynamics \
|
-lBulletColladaConverter -lcolladadom -llibxml -lGIMPACT -lGIMPACTUtils -lbulletdynamics \
|
||||||
-lbulletmath -lbulletcollision -lbulletopenglsupport
|
-lbulletmath -lbulletcollision -lbulletopenglsupport
|
||||||
|
|
||||||
GL_LIB=-framework OpenGL
|
GL_LIB=-framework OpenGL
|
||||||
@@ -38,7 +38,7 @@ GL_LIB=-framework OpenGL
|
|||||||
MAYA_INCLUDE=-I$(MAYA)/include
|
MAYA_INCLUDE=-I$(MAYA)/include
|
||||||
MAYA_LIB=-L/Applications/Autodesk/maya2008/Maya.app/Contents/MacOS -lOpenMaya -lFoundation -Wl,-executable_path,/Applications/Autodesk/maya2008/Maya.app/Contents/MacOS -lOpenMayaUI -lOpenMayaFX -lOpenMaya -lFoundation
|
MAYA_LIB=-L/Applications/Autodesk/maya2008/Maya.app/Contents/MacOS -lOpenMaya -lFoundation -Wl,-executable_path,/Applications/Autodesk/maya2008/Maya.app/Contents/MacOS -lOpenMayaUI -lOpenMayaFX -lOpenMaya -lFoundation
|
||||||
|
|
||||||
SOURCES = pluginMain.cpp rigidBodyNode.cpp rigidBodyArrayNode.cpp collisionShapeNode.cpp \
|
SOURCES = pluginMain.cpp colladaExport.cpp rigidBodyNode.cpp rigidBodyArrayNode.cpp collisionShapeNode.cpp \
|
||||||
solver.cpp bt_solver.cpp dSolverNode.cpp dSolverCmd.cpp dRigidBodyCmd.cpp dRigidBodyArrayCmd.cpp \
|
solver.cpp bt_solver.cpp dSolverNode.cpp dSolverCmd.cpp dRigidBodyCmd.cpp dRigidBodyArrayCmd.cpp \
|
||||||
pdbIO.cpp drawUtils.cpp
|
pdbIO.cpp drawUtils.cpp
|
||||||
|
|
||||||
|
|||||||
@@ -23,14 +23,31 @@ Written by: Nicola Candussi <nicola@fluidinteractive.com>
|
|||||||
//bt_solver.cpp
|
//bt_solver.cpp
|
||||||
|
|
||||||
#include "bt_solver.h"
|
#include "bt_solver.h"
|
||||||
|
#include "../BulletColladaConverter/ColladaConverter.h"
|
||||||
|
|
||||||
|
btVector3 minWorld(-10000,-10000,-10000);
|
||||||
|
btVector3 maxWorld(10000,10000,10000);
|
||||||
|
int maxNumObj=32768;
|
||||||
|
|
||||||
|
|
||||||
btVector3 worldAabbMin(-10000, -10000, -10000);
|
void bt_solver_t::export_collada_file(const char* fileName)
|
||||||
btVector3 worldAabbMax(10000, 10000, 10000);
|
{
|
||||||
int maxProxies = 32000;
|
ColladaConverter tmpConverter(m_dynamicsWorld.get());
|
||||||
|
tmpConverter.save(fileName);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void bt_solver_t::import_collada_file(const char* filename)
|
||||||
|
{
|
||||||
|
//todo: need to create actual bodies etc
|
||||||
|
ColladaConverter tmpConverter(m_dynamicsWorld.get());
|
||||||
|
tmpConverter.load(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bt_solver_t::bt_solver_t():
|
bt_solver_t::bt_solver_t():
|
||||||
m_broadphase(new btAxisSweep3(worldAabbMin, worldAabbMax, maxProxies)),
|
// m_broadphase(new btAxisSweep3(minWorld,maxWorld,maxNumObj)),
|
||||||
|
m_broadphase(new btDbvtBroadphase()),
|
||||||
m_solver(new btSequentialImpulseConstraintSolver),
|
m_solver(new btSequentialImpulseConstraintSolver),
|
||||||
m_collisionConfiguration(new btDefaultCollisionConfiguration),
|
m_collisionConfiguration(new btDefaultCollisionConfiguration),
|
||||||
m_dispatcher(new btCollisionDispatcher(m_collisionConfiguration.get())),
|
m_dispatcher(new btCollisionDispatcher(m_collisionConfiguration.get())),
|
||||||
@@ -39,6 +56,7 @@ bt_solver_t::bt_solver_t():
|
|||||||
m_solver.get(),
|
m_solver.get(),
|
||||||
m_collisionConfiguration.get()))
|
m_collisionConfiguration.get()))
|
||||||
{
|
{
|
||||||
|
|
||||||
//register algorithm for concave meshes
|
//register algorithm for concave meshes
|
||||||
btGImpactCollisionAlgorithm::registerAlgorithm(m_dispatcher.get());
|
btGImpactCollisionAlgorithm::registerAlgorithm(m_dispatcher.get());
|
||||||
|
|
||||||
|
|||||||
@@ -98,6 +98,11 @@ public:
|
|||||||
m_dynamicsWorld->stepSimulation(dt, 1000, 1.0 / 120.0);
|
m_dynamicsWorld->stepSimulation(dt, 1000, 1.0 / 120.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual void export_collada_file(const char* fileName);
|
||||||
|
|
||||||
|
virtual void import_collada_file(const char* filename);
|
||||||
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
friend class solver_t;
|
friend class solver_t;
|
||||||
bt_solver_t();
|
bt_solver_t();
|
||||||
|
|||||||
148
Extras/MayaPlugin/colladaExport.cpp
Normal file
148
Extras/MayaPlugin/colladaExport.cpp
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
/*
|
||||||
|
Bullet Continuous Collision Detection and Physics Library Maya Plugin
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied warranty.
|
||||||
|
In no event will the authors be held liable for any damages arising
|
||||||
|
from the use of this software.
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it freely,
|
||||||
|
subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must
|
||||||
|
not claim that you wrote the original software. If you use this
|
||||||
|
software in a product, an acknowledgment in the product documentation
|
||||||
|
would be appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must
|
||||||
|
not be misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "colladaExport.h"
|
||||||
|
#include "solver.h"
|
||||||
|
#include "solver_impl.h"
|
||||||
|
|
||||||
|
#if defined (_WIN32)
|
||||||
|
#define strcasecmp stricmp
|
||||||
|
#elif defined (OSMac_)
|
||||||
|
extern "C" int strcasecmp (const char *, const char *);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define NO_SMOOTHING_GROUP -1
|
||||||
|
#define INITIALIZE_SMOOTHING -2
|
||||||
|
#define INVALID_ID -1
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void* ObjTranslator::creator()
|
||||||
|
{
|
||||||
|
return new ObjTranslator();
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
MStatus ObjTranslator::reader ( const MFileObject& file,
|
||||||
|
const MString& options,
|
||||||
|
FileAccessMode mode)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "COLLADA Physics import will be available very soon, please stay tuned.\n");
|
||||||
|
return MS::kFailure;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
MStatus ObjTranslator::writer ( const MFileObject& file,
|
||||||
|
const MString& options,
|
||||||
|
FileAccessMode mode )
|
||||||
|
|
||||||
|
{
|
||||||
|
MStatus status;
|
||||||
|
|
||||||
|
MString mname = file.fullName(), unitName;
|
||||||
|
|
||||||
|
//just pass in the filename
|
||||||
|
|
||||||
|
#if defined (OSMac_)
|
||||||
|
char fname[256];//MAXPATHLEN];
|
||||||
|
strcpy (fname, file.fullName().asChar());
|
||||||
|
// fp = fopen(fname,"wb");//MAYAMACTODO
|
||||||
|
#else
|
||||||
|
const char *fname = mname.asChar();
|
||||||
|
// fp = fopen(fname,"w");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
shared_ptr<solver_impl_t> solv = solver_t::get_solver();
|
||||||
|
|
||||||
|
solv->export_collada_file(fname);
|
||||||
|
|
||||||
|
return status;
|
||||||
|
|
||||||
|
}
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
bool ObjTranslator::haveReadMethod () const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
bool ObjTranslator::haveWriteMethod () const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
MString ObjTranslator::defaultExtension () const
|
||||||
|
{
|
||||||
|
return "dae";
|
||||||
|
}
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
MPxFileTranslator::MFileKind ObjTranslator::identifyFile (
|
||||||
|
const MFileObject& fileName,
|
||||||
|
const char* buffer,
|
||||||
|
short size) const
|
||||||
|
{
|
||||||
|
const char * name = fileName.name().asChar();
|
||||||
|
int nameLength = strlen(name);
|
||||||
|
|
||||||
|
if ((nameLength > 4) && !strcasecmp(name+nameLength-4, ".dae"))
|
||||||
|
return kCouldBeMyFileType;
|
||||||
|
else
|
||||||
|
return kNotMyFileType;
|
||||||
|
}
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
MStatus ObjTranslator::exportSelected( )
|
||||||
|
{
|
||||||
|
MStatus status;
|
||||||
|
MString filename;
|
||||||
|
|
||||||
|
|
||||||
|
// Create an iterator for the active selection list
|
||||||
|
//
|
||||||
|
MSelectionList slist;
|
||||||
|
MGlobal::getActiveSelectionList( slist );
|
||||||
|
MItSelectionList iter( slist );
|
||||||
|
|
||||||
|
if (iter.isDone()) {
|
||||||
|
fprintf(stderr,"Error: Nothing is selected.\n");
|
||||||
|
return MS::kFailure;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
MStatus ObjTranslator::exportAll( )
|
||||||
|
{
|
||||||
|
MStatus status = MS::kSuccess;
|
||||||
|
|
||||||
|
return status;
|
||||||
|
}
|
||||||
89
Extras/MayaPlugin/colladaExport.h
Normal file
89
Extras/MayaPlugin/colladaExport.h
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/*
|
||||||
|
Bullet Continuous Collision Detection and Physics Library Maya Plugin
|
||||||
|
|
||||||
|
This software is provided 'as-is', without any express or implied warranty.
|
||||||
|
In no event will the authors be held liable for any damages arising
|
||||||
|
from the use of this software.
|
||||||
|
Permission is granted to anyone to use this software for any purpose,
|
||||||
|
including commercial applications, and to alter it and redistribute it freely,
|
||||||
|
subject to the following restrictions:
|
||||||
|
|
||||||
|
1. The origin of this software must not be misrepresented; you must
|
||||||
|
not claim that you wrote the original software. If you use this
|
||||||
|
software in a product, an acknowledgment in the product documentation
|
||||||
|
would be appreciated but is not required.
|
||||||
|
2. Altered source versions must be plainly marked as such, and must
|
||||||
|
not be misrepresented as being the original software.
|
||||||
|
3. This notice may not be removed or altered from any source distribution.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef COLLADA_EXPORT_H
|
||||||
|
#define COLLADA_EXPORT_H
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <maya/MStatus.h>
|
||||||
|
#include <maya/MPxCommand.h>
|
||||||
|
#include <maya/MString.h>
|
||||||
|
#include <maya/MStringArray.h>
|
||||||
|
#include <maya/MArgList.h>
|
||||||
|
#include <maya/MGlobal.h>
|
||||||
|
#include <maya/MSelectionList.h>
|
||||||
|
#include <maya/MItSelectionList.h>
|
||||||
|
#include <maya/MPoint.h>
|
||||||
|
#include <maya/MPointArray.h>
|
||||||
|
#include <maya/MDagPath.h>
|
||||||
|
#include <maya/MDagPathArray.h>
|
||||||
|
//#include <maya/MFnPlugin.h>
|
||||||
|
#include <maya/MFnMesh.h>
|
||||||
|
#include <maya/MFnSet.h>
|
||||||
|
#include <maya/MItMeshPolygon.h>
|
||||||
|
#include <maya/MItMeshVertex.h>
|
||||||
|
#include <maya/MItMeshEdge.h>
|
||||||
|
#include <maya/MFloatVector.h>
|
||||||
|
#include <maya/MFloatVectorArray.h>
|
||||||
|
#include <maya/MFloatArray.h>
|
||||||
|
#include <maya/MObjectArray.h>
|
||||||
|
#include <maya/MObject.h>
|
||||||
|
//#include <maya/MPlug.h>
|
||||||
|
#include <maya/MPxFileTranslator.h>
|
||||||
|
#include <maya/MFnDagNode.h>
|
||||||
|
#include <maya/MItDag.h>
|
||||||
|
#include <maya/MDistance.h>
|
||||||
|
#include <maya/MIntArray.h>
|
||||||
|
#include <maya/MIOStream.h>
|
||||||
|
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////
|
||||||
|
class ObjTranslator : public MPxFileTranslator {
|
||||||
|
public:
|
||||||
|
ObjTranslator () {};
|
||||||
|
virtual ~ObjTranslator () {};
|
||||||
|
static void* creator();
|
||||||
|
|
||||||
|
MStatus reader ( const MFileObject& file,
|
||||||
|
const MString& optionsString,
|
||||||
|
FileAccessMode mode);
|
||||||
|
|
||||||
|
MStatus writer ( const MFileObject& file,
|
||||||
|
const MString& optionsString,
|
||||||
|
FileAccessMode mode );
|
||||||
|
bool haveReadMethod () const;
|
||||||
|
bool haveWriteMethod () const;
|
||||||
|
MString defaultExtension () const;
|
||||||
|
MFileKind identifyFile ( const MFileObject& fileName,
|
||||||
|
const char* buffer,
|
||||||
|
short size) const;
|
||||||
|
private:
|
||||||
|
MStatus exportSelected();
|
||||||
|
MStatus exportAll();
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif //COLLADA_EXPORT_H
|
||||||
|
|
||||||
@@ -34,6 +34,17 @@ Written by: Nicola Candussi <nicola@fluidinteractive.com>
|
|||||||
#include "dRigidBodyCmd.h"
|
#include "dRigidBodyCmd.h"
|
||||||
#include "dRigidBodyArrayCmd.h"
|
#include "dRigidBodyArrayCmd.h"
|
||||||
#include "mvl/util.h"
|
#include "mvl/util.h"
|
||||||
|
#include "colladaExport.h"
|
||||||
|
|
||||||
|
const char *const colladaOptionScript = "colladaExportOptions";
|
||||||
|
const char *const colladaDefaultOptions =
|
||||||
|
"groups=1;"
|
||||||
|
"ptgroups=1;"
|
||||||
|
"materials=1;"
|
||||||
|
"smoothing=1;"
|
||||||
|
"normals=1;"
|
||||||
|
;
|
||||||
|
|
||||||
|
|
||||||
MStatus initializePlugin( MObject obj )
|
MStatus initializePlugin( MObject obj )
|
||||||
{
|
{
|
||||||
@@ -42,7 +53,17 @@ MStatus initializePlugin( MObject obj )
|
|||||||
|
|
||||||
solver_t::initialize();
|
solver_t::initialize();
|
||||||
|
|
||||||
//
|
|
||||||
|
// Register the translator with the system
|
||||||
|
status = plugin.registerFileTranslator( "COLLADA Physics export", "none",
|
||||||
|
ObjTranslator::creator,
|
||||||
|
(char *)colladaOptionScript,
|
||||||
|
(char *)colladaDefaultOptions );
|
||||||
|
|
||||||
|
MCHECKSTATUS(status,"registerFileTranslator COLLADA Physics export")
|
||||||
|
|
||||||
|
|
||||||
|
//
|
||||||
status = plugin.registerNode( rigidBodyNode::typeName, rigidBodyNode::typeId,
|
status = plugin.registerNode( rigidBodyNode::typeName, rigidBodyNode::typeId,
|
||||||
rigidBodyNode::creator,
|
rigidBodyNode::creator,
|
||||||
rigidBodyNode::initialize,
|
rigidBodyNode::initialize,
|
||||||
@@ -121,6 +142,9 @@ MStatus uninitializePlugin( MObject obj )
|
|||||||
status = plugin.deregisterNode(rigidBodyNode::typeId);
|
status = plugin.deregisterNode(rigidBodyNode::typeId);
|
||||||
MCHECKSTATUS(status, "deregistering rigidBodyNode")
|
MCHECKSTATUS(status, "deregistering rigidBodyNode")
|
||||||
|
|
||||||
|
status = plugin.deregisterFileTranslator( "OBJexport" );
|
||||||
|
MCHECKSTATUS(status,"deregistering OBJexport" )
|
||||||
|
|
||||||
solver_t::cleanup();
|
solver_t::cleanup();
|
||||||
|
|
||||||
return status;
|
return status;
|
||||||
|
|||||||
@@ -28,6 +28,12 @@ Written by: Nicola Candussi <nicola@fluidinteractive.com>
|
|||||||
shared_ptr<solver_impl_t> solver_t::m_impl;
|
shared_ptr<solver_impl_t> solver_t::m_impl;
|
||||||
std::set<rigid_body_t::pointer> solver_t::m_rigid_bodies;
|
std::set<rigid_body_t::pointer> solver_t::m_rigid_bodies;
|
||||||
|
|
||||||
|
shared_ptr<solver_impl_t> solver_t::get_solver()
|
||||||
|
{
|
||||||
|
return m_impl;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void solver_t::initialize()
|
void solver_t::initialize()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -77,6 +77,8 @@ public:
|
|||||||
//
|
//
|
||||||
static void step_simulation(float dt);
|
static void step_simulation(float dt);
|
||||||
|
|
||||||
|
static shared_ptr<solver_impl_t> get_solver();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static shared_ptr<solver_impl_t> m_impl;
|
static shared_ptr<solver_impl_t> m_impl;
|
||||||
static std::set<rigid_body_t::pointer> m_rigid_bodies;
|
static std::set<rigid_body_t::pointer> m_rigid_bodies;
|
||||||
|
|||||||
@@ -55,6 +55,10 @@ public:
|
|||||||
|
|
||||||
virtual void set_split_impulse(bool enabled) = 0;
|
virtual void set_split_impulse(bool enabled) = 0;
|
||||||
|
|
||||||
|
virtual void export_collada_file(const char* fileName) = 0;
|
||||||
|
|
||||||
|
virtual void import_collada_file(const char* filename) = 0;
|
||||||
|
|
||||||
virtual void step_simulation(float dt) = 0;
|
virtual void step_simulation(float dt) = 0;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|||||||
Reference in New Issue
Block a user