📄 ivp_clustering_visualizer.cxx
字号:
return;
}
void IVP_Clustering_Visualizer_Shortrange::disable() {
this->enabled = IVP_FALSE;
return;
}
IVP_BOOL IVP_Clustering_Visualizer_Shortrange::get_state() {
return(this->enabled);
}
IVP_Clustering_Visualizer_Shortrange::IVP_Clustering_Visualizer_Shortrange() {
this->enabled = IVP_FALSE; // disabled by default!
this->accept_filter_intruder = new IVP_Clustering_Visualizer_Object_Hash(64);
this->reject_filter_intruder = new IVP_Clustering_Visualizer_Object_Hash(64);
this->accept_filter_private_property = new IVP_Clustering_Visualizer_Object_Hash(64);
this->reject_filter_private_property = new IVP_Clustering_Visualizer_Object_Hash(64);
this->use_intruder_accept_filter = IVP_FALSE;
this->use_intruder_reject_filter = IVP_FALSE;
this->use_private_property_accept_filter = IVP_FALSE;
this->use_private_property_reject_filter = IVP_FALSE;
// this->remove_longrange_visualization = IVP_TRUE; //IVP_TRUE
this->boxmode = TRAVERSED_BOXES; //ABORTED_BOXES TERMINALS_ONLY TRAVERSED_BOXES
this->stats_n_sphere_collisiontests = 0;
this->stats_n_box_collisiontests = 0;
return;
}
IVP_Clustering_Visualizer_Shortrange::~IVP_Clustering_Visualizer_Shortrange() {
this->enabled = IVP_FALSE; // just in case...
P_DELETE(this->accept_filter_intruder);
P_DELETE(this->reject_filter_intruder);
P_DELETE(this->accept_filter_private_property);
P_DELETE(this->reject_filter_private_property);
return;
}
/*******************************************************************************
*******************************************************************************
*
* LONGRANGE CLUSTERING VISUALIZER
*
*******************************************************************************
******************************************************************************/
IVP_Clustering_Visualizer_Longrange_Callback::~IVP_Clustering_Visualizer_Longrange_Callback() {
return;
}
/********************************************************************************
* Class: IVP_CFEP_Hash
* Description: hash table needed for fast storage of object pairs in
* "Exclusive Pair" collision filter
********************************************************************************/
class IVP_Clustering_Visualizer_Longrange_Hash : protected IVP_VHash {
protected:
IVP_BOOL compare (void *elem0, void *elem1) const;
int obj_to_index(IVP_Real_Object *obj);
public:
void add (IVP_Real_Object *obj);
IVP_Real_Object * remove (IVP_Real_Object *obj);
IVP_Real_Object * find (IVP_Real_Object *obj);
IVP_Clustering_Visualizer_Longrange_Hash(int create_size);
~IVP_Clustering_Visualizer_Longrange_Hash();
};
IVP_BOOL IVP_Clustering_Visualizer_Longrange_Hash::compare(void *elem0, void *elem1) const {
IVP_Real_Object *obj0 = (IVP_Real_Object *)elem0;
IVP_Real_Object *obj1 = (IVP_Real_Object *)elem1;
if ( obj0 != obj1 ) return(IVP_FALSE);
return(IVP_TRUE);
}
int IVP_Clustering_Visualizer_Longrange_Hash::obj_to_index(IVP_Real_Object *obj) {
return hash_index( (char *)obj, sizeof(obj));
};
void IVP_Clustering_Visualizer_Longrange_Hash::add(IVP_Real_Object *obj) {
add_elem(obj, obj_to_index(obj));
}
IVP_Real_Object *IVP_Clustering_Visualizer_Longrange_Hash::remove(IVP_Real_Object *obj) {
return (IVP_Real_Object *)remove_elem(obj, obj_to_index(obj));
}
IVP_Real_Object *IVP_Clustering_Visualizer_Longrange_Hash::find(IVP_Real_Object *obj) {
return (IVP_Real_Object *)find_elem(obj, obj_to_index(obj));
}
IVP_Clustering_Visualizer_Longrange_Hash::IVP_Clustering_Visualizer_Longrange_Hash(int create_size) : IVP_VHash(create_size) {
return;
}
IVP_Clustering_Visualizer_Longrange_Hash::~IVP_Clustering_Visualizer_Longrange_Hash() {
return;
}
/*******************************************************************************
*******************************************************************************
*
* LONGRANGE CLUSTERING: METHODS
*
*******************************************************************************
******************************************************************************/
class IVP_Clustering_Visualizer_Longrange_Data {
public:
IVP_Real_Object * real_object;
IVP_U_Float_Point center;
IVP_DOUBLE radius;
};
void IVP_Clustering_Visualizer_Longrange::visualize() {
if ( !this->enabled ) return;
int x;
for (x=this->visualize_data.len()-1; x>=0; x--) {
IVP_Clustering_Visualizer_Longrange_Data *data = this->visualize_data.element_at(x);
IVP_Real_Object *real_object = data->real_object;
if ( real_object->get_core()->physical_unmoveable && !this->visualize_unmoveable_objects) return;
if ( !real_object->get_core()->physical_unmoveable && !this->visualize_moveable_objects) return;
if ( this->use_accept_filter ) {
if ( !this->accept_filter->find(real_object) ) return;
}
if ( this->use_reject_filter ) {
if ( this->reject_filter->find(real_object) ) return;
}
int i;
for (i=0; i<this->graphics_callbacks.len(); i++) {
IVP_Clustering_Visualizer_Longrange_Callback *callback = this->graphics_callbacks.element_at(i);
callback->real_object = real_object;
callback->center.set(&data->center);
callback->radius = data->radius;
callback->visualize_request();
}
this->visualize_data.remove(data);
P_DELETE(data);
}
return;
}
void IVP_Clustering_Visualizer_Longrange::remove_object(IVP_Real_Object *real_object) {
if ( !this->enabled ) return;
this->remove_objectdata(real_object);
int i;
for (i=0; i<this->graphics_callbacks.len(); i++) {
IVP_Clustering_Visualizer_Longrange_Callback *callback = this->graphics_callbacks.element_at(i);
callback->real_object = real_object;
callback->devisualize_request();
}
return;
}
void IVP_Clustering_Visualizer_Longrange::add_object(IVP_Real_Object *real_object, IVP_U_Float_Point *center, IVP_DOUBLE radius) {
IVP_Clustering_Visualizer_Longrange_Data *data = new IVP_Clustering_Visualizer_Longrange_Data();
data->real_object = real_object;
data->center.set(center);
data->radius = radius;
this->visualize_data.add(data);
return;
}
void IVP_Clustering_Visualizer_Longrange::remove_objectdata(IVP_Real_Object *real_object) {
int x;
for (x=0; x<this->visualize_data.len(); x++) {
IVP_Clustering_Visualizer_Longrange_Data *data = this->visualize_data.element_at(x);
if ( data->real_object != real_object ) continue;
this->visualize_data.remove(data);
P_DELETE(data);
return;
}
return;
}
void IVP_Clustering_Visualizer_Longrange::install_visualize_callback(IVP_Clustering_Visualizer_Longrange_Callback *callback) {
this->graphics_callbacks.add(callback);
return;
}
void IVP_Clustering_Visualizer_Longrange::remove_visualize_callback(IVP_Clustering_Visualizer_Longrange_Callback *callback) {
if ( this->graphics_callbacks.index_of(callback) == -1 ) {
return;
}
this->graphics_callbacks.remove(callback);
return;
}
void IVP_Clustering_Visualizer_Longrange::add_object_to_filter(IVP_Real_Object *obj, IVP_CLUSTERING_VISUALIZER_FILTER filter) {
switch ( filter ) {
case ACCEPT:
{
if ( !this->accept_filter->find(obj) ) { // pair already stored?
this->accept_filter->add(obj); // no, then store now...
}
}
break;
case REJECT:
{
if ( !this->reject_filter->find(obj) ) { // pair already stored?
this->reject_filter->add(obj); // no, then store now...
}
}
break;
}
return;
}
void IVP_Clustering_Visualizer_Longrange::remove_object_from_filter(IVP_Real_Object *obj, IVP_CLUSTERING_VISUALIZER_FILTER filter) {
switch ( filter ) {
case ACCEPT:
{
if ( this->accept_filter->find(obj) ) { // pair stored in hash?
this->accept_filter->remove(obj); // yes, remove...
}
}
break;
case REJECT:
{
if ( this->reject_filter->find(obj) ) { // pair stored in hash?
this->reject_filter->remove(obj); // yes, remove...
}
}
break;
}
return;
}
void IVP_Clustering_Visualizer_Longrange::enable() {
int i;
for (i=0; i<this->graphics_callbacks.len(); i++) {
IVP_Clustering_Visualizer_Longrange_Callback *callback = this->graphics_callbacks.element_at(i);
callback->enable();
callback->enabled = IVP_TRUE;
}
this->enabled = IVP_TRUE;
return;
}
void IVP_Clustering_Visualizer_Longrange::disable() {
int i;
for (i=0; i<this->graphics_callbacks.len(); i++) {
IVP_Clustering_Visualizer_Longrange_Callback *callback = this->graphics_callbacks.element_at(i);
callback->disable();
callback->enabled = IVP_FALSE;
}
this->enabled = IVP_FALSE;
return;
}
IVP_BOOL IVP_Clustering_Visualizer_Longrange::get_state() {
return(this->enabled);
}
IVP_Clustering_Visualizer_Longrange::IVP_Clustering_Visualizer_Longrange() {
this->enabled = IVP_FALSE;
this->visualize_moveable_objects = IVP_FALSE; //TRUE;
this->visualize_unmoveable_objects = IVP_FALSE; //TRUE;
this->accept_filter = new IVP_Clustering_Visualizer_Longrange_Hash(1024);
this->reject_filter = new IVP_Clustering_Visualizer_Longrange_Hash(1024);
return;
}
IVP_Clustering_Visualizer_Longrange::~IVP_Clustering_Visualizer_Longrange() {
P_DELETE(this->accept_filter);
P_DELETE(this->reject_filter);
return;
}
#if 0
IVP_Clustering_Visualizer_Shortrange::IVP_Clustering_Visualizer_Shortrange(IVP_Real_Object *object) {
// { statistical output
this->statistics_sphere_collisions = new IVP_BetterStatisticsmanager_Data_Entity(INT_VALUE);
this->statistics_sphere_collisions->set_text("# of sphere collision tests: ");
this->statistics_sphere_collisions->set_position(10, 10);
this->statistics_box_collisions = new IVP_BetterStatisticsmanager_Data_Entity(INT_VALUE);
this->statistics_box_collisions->set_text("# of box collision tests: ");
this->statistics_box_collisions->set_position(10, 20);
this->statistics_true_collisions = new IVP_BetterStatisticsmanager_Data_Entity(INT_VALUE);
this->statistics_true_collisions->set_text("# of true collisions: ");
this->statistics_true_collisions->set_position(10, 30);
this->statistics_terminals = new IVP_BetterStatisticsmanager_Data_Entity(INT_VALUE);
this->statistics_terminals->set_text("# of terminal collisions: ");
this->statistics_terminals->set_position(10, 40);
IVP_BetterStatisticsmanager *stats_manager = this->environment->get_betterstatisticsmanager();
stats_manager->install_data_entity(this->statistics_sphere_collisions);
stats_manager->install_data_entity(this->statistics_box_collisions);
stats_manager->install_data_entity(this->statistics_true_collisions);
stats_manager->install_data_entity(this->statistics_terminals);
// statistical output }
return;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -