2
* SOLID - Software Library for Interference Detection
3
* Copyright (c) 2001 Dtecta <gino@dtecta.com>
10
#include "BP_Endpoint.h"
19
BP_Endpoint::BP_Endpoint(Ogre::Real pos, Type type, BP_Proxy *proxy,
20
GEN_List& endpointList) :
21
m_pos(pos), m_type(type), m_proxy(proxy)
23
GEN_Link *next = endpointList.getHead();
25
while (!next->isTail() && (*(BP_Endpoint *)next < *this)) {
26
next = next->getNext();
31
BP_Endpoint::~BP_Endpoint()
38
void encounters(const BP_Endpoint& a, const BP_Endpoint& b,
39
BP_Scene& scene, T_Overlap overlap)
41
assert(a.m_proxy != b.m_proxy);
43
if ((a.m_type != b.m_type) && overlap(*a.m_proxy, *b.m_proxy)) {
44
if (a.m_type == BP_Endpoint::MAXIMUM) {
45
scene.callBeginOverlap(a.m_proxy->getObject(),
46
b.m_proxy->getObject());
49
scene.callEndOverlap(a.m_proxy->getObject(),
50
b.m_proxy->getObject());
55
void BP_Endpoint::move(Ogre::Real x, BP_Scene& scene, T_Overlap overlap)
57
int sign = MT_sign(x - m_pos);
63
GEN_Link *prev = getPrev();
64
if (!prev->isHead() && (*this < *(BP_Endpoint *)prev)) {
67
encounters(*(BP_Endpoint *)prev, *this, scene, overlap);
68
prev = prev->getPrev();
70
while (!prev->isHead() && (*this < *(BP_Endpoint *)prev));
76
GEN_Link *next = getNext();
77
if (!next->isTail() && (*(BP_Endpoint *)next < *this)) {
80
encounters(*this, *(BP_Endpoint *)next, scene, overlap);
81
next = next->getNext();
83
while (!next->isTail() && (*(BP_Endpoint *)next < *this));