Skip to content

Commit f12d4cb

Browse files
committed
Added CollisionSet.
Some minors fixes to make potential physics support easier.
1 parent a1f2d70 commit f12d4cb

File tree

6 files changed

+211
-73
lines changed

6 files changed

+211
-73
lines changed

addons/source-python/packages/source-python/entities/collisions.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
from _entities._collisions import CollisionHash
2020
from _entities._collisions import CollisionManager
2121
from _entities._collisions import CollisionRules
22+
from _entities._collisions import CollisionSet
2223
from _entities._collisions import collision_manager
2324

2425

@@ -30,6 +31,7 @@
3031
'CollisionHook',
3132
'CollisionManager',
3233
'CollisionRules',
34+
'CollisionSet',
3335
'collision_manager',
3436
]
3537

src/core/modules/entities/entities_collisions.cpp

Lines changed: 102 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ void CCollisionManager::OnNetworkedEntityCreated(object oEntity)
160160
void CCollisionManager::OnNetworkedEntityDeleted(CBaseEntity *pEntity)
161161
{
162162
FOR_EACH_VEC(m_vecRules, i) {
163-
m_vecRules[i]->OnEntityDeleted((void *)pEntity);
163+
m_vecRules[i]->OnEntityDeleted(pEntity);
164164
}
165165
}
166166

@@ -422,14 +422,14 @@ bool CCollisionManager::ShouldHitEntity(IHandleEntity *pHandleEntity, int conten
422422
}
423423

424424
FOR_EACH_VEC(pManager->m_vecRules, i) {
425-
if (!pManager->m_vecRules[i]->ShouldHitEntity((void *)scope.m_pFilter->m_pPassEnt, (void *)pHandleEntity)) {
425+
if (!pManager->m_vecRules[i]->ShouldHitEntity((CBaseEntity *)scope.m_pFilter->m_pPassEnt, (CBaseEntity *)pHandleEntity)) {
426426
scope.m_pCache->SetResult(uiIndex, false);
427427
return false;
428428
}
429429
}
430430

431431
if (scope.m_bIsPlayer) {
432-
static CPlayerCollisionListenerManager *OnPlayerCollision = GetOnPlayerCollisionListenerManager();
432+
static CCollisionListenerManager *OnPlayerCollision = GetOnPlayerCollisionListenerManager();
433433
if (!OnPlayerCollision->GetCount()) {
434434
scope.m_pCache->SetResult(uiIndex, true);
435435
return true;
@@ -451,7 +451,7 @@ bool CCollisionManager::ShouldHitEntity(IHandleEntity *pHandleEntity, int conten
451451
return true;
452452
}
453453

454-
static CEntityCollisionListenerManager *OnEntityCollision = GetOnEntityCollisionListenerManager();
454+
static CCollisionListenerManager *OnEntityCollision = GetOnEntityCollisionListenerManager();
455455
if (!OnEntityCollision->GetCount()) {
456456
scope.m_pCache->SetResult(uiIndex, true);
457457
return true;
@@ -563,78 +563,146 @@ CCollisionHash::~CCollisionHash()
563563
physics->DestroyObjectPairHash(m_pHash);
564564
}
565565

566-
void CCollisionHash::OnEntityDeleted(void *pEntity)
566+
void CCollisionHash::OnEntityDeleted(CBaseEntity *pEntity)
567567
{
568568
RemovePairs(pEntity);
569569
}
570570

571-
bool CCollisionHash::ShouldHitEntity(void *pEntity, void *pOther)
571+
bool CCollisionHash::ShouldHitEntity(CBaseEntity *pEntity, CBaseEntity *pOther)
572572
{
573573
return !HasPair(pEntity, pOther);
574574
}
575575

576-
void CCollisionHash::AddPair(void *pEntity, void *pOther)
576+
void CCollisionHash::AddPair(CBaseEntityWrapper *pEntity, CBaseEntityWrapper *pOther)
577577
{
578-
if (!IsValidNetworkedEntityPointer(pEntity) || !IsValidNetworkedEntityPointer(pOther)) {
578+
if (!pEntity->IsNetworked() || !pOther->IsNetworked()) {
579579
BOOST_RAISE_EXCEPTION(
580580
PyExc_ValueError,
581-
"Given entity pointer invalid or not networked."
581+
"Given entity is not networked."
582582
)
583583
}
584584

585585
m_pHash->AddObjectPair(pEntity, pOther);
586586
}
587587

588-
void CCollisionHash::RemovePair(void *pEntity, void *pOther)
588+
void CCollisionHash::RemovePair(void *pObject, void *pOther)
589589
{
590-
m_pHash->RemoveObjectPair(pEntity, pOther);
590+
m_pHash->RemoveObjectPair(pObject, pOther);
591591
}
592592

593-
void CCollisionHash::RemovePairs(void *pEntity)
593+
void CCollisionHash::RemovePairs(void *pObject)
594594
{
595-
m_pHash->RemoveAllPairsForObject(pEntity);
595+
m_pHash->RemoveAllPairsForObject(pObject);
596596
}
597597

598-
bool CCollisionHash::Contains(void *pEntity)
598+
bool CCollisionHash::Contains(void *pObject)
599599
{
600-
return m_pHash->IsObjectInHash(pEntity);
600+
return m_pHash->IsObjectInHash(pObject);
601601
}
602602

603-
bool CCollisionHash::HasPair(void *pEntity, void *pOther)
603+
bool CCollisionHash::HasPair(void *pObject, void *pOther)
604604
{
605-
return m_pHash->IsObjectPairInHash(pEntity, pOther);
605+
return m_pHash->IsObjectPairInHash(pObject, pOther);
606606
}
607607

608-
int CCollisionHash::GetCount(void *pEntity)
608+
int CCollisionHash::GetCount(void *pObject)
609609
{
610-
return m_pHash->GetPairCountForObject(pEntity);
610+
return m_pHash->GetPairCountForObject(pObject);
611611
}
612612

613-
list CCollisionHash::GetPairs(void *pEntity)
613+
list CCollisionHash::GetPairs(void *pObject)
614614
{
615-
list oEntities;
616-
int nCount = m_pHash->GetPairCountForObject(pEntity);
615+
list oObjects;
616+
int nCount = m_pHash->GetPairCountForObject(pObject);
617617

618618
if (!nCount) {
619-
return oEntities;
619+
return oObjects;
620620
}
621621

622-
void **ppEntities = (void **)stackalloc(nCount * sizeof(void *));
623-
m_pHash->GetPairListForObject(pEntity, nCount, ppEntities);
622+
void **ppObjects = (void **)stackalloc(nCount * sizeof(void *));
623+
m_pHash->GetPairListForObject(pObject, nCount, ppObjects);
624624

625625
for (int i = 0; i < nCount; ++i) {
626-
pEntity = ppEntities[i];
627-
if (!pEntity) {
626+
pObject = ppObjects[i];
627+
if (!pObject) {
628628
continue;
629629
}
630630

631-
oEntities.append(pEntity);
631+
oObjects.append(pObject);
632632
}
633633

634-
return oEntities;
634+
return oObjects;
635635
}
636636

637637

638+
//-----------------------------------------------------------------------------
639+
// CCollisionSet class.
640+
//-----------------------------------------------------------------------------
641+
void CCollisionSet::Add(CBaseEntityWrapper *pEntity)
642+
{
643+
if (Contains(pEntity)) {
644+
return;
645+
}
646+
647+
if (!pEntity->IsNetworked()) {
648+
BOOST_RAISE_EXCEPTION(
649+
PyExc_ValueError,
650+
"Given entity is not networked."
651+
)
652+
}
653+
654+
m_pSet.insert(pEntity);
655+
}
656+
657+
void CCollisionSet::Remove(void *pObject)
658+
{
659+
m_pSet.erase(pObject);
660+
}
661+
662+
bool CCollisionSet::Contains(void *pObject)
663+
{
664+
return m_pSet.find(pObject) != m_pSet.end();
665+
}
666+
667+
void CCollisionSet::Clear(void *pObject)
668+
{
669+
m_pSet.clear();
670+
}
671+
672+
unsigned int CCollisionSet::GetSize()
673+
{
674+
return m_pSet.size();
675+
}
676+
677+
bool CCollisionSet::HasElements()
678+
{
679+
return !m_pSet.empty();
680+
}
681+
682+
object CCollisionSet::Iterate()
683+
{
684+
list oElements;
685+
686+
if (HasElements()) {
687+
for (boost::unordered_set<void *>::const_iterator it = m_pSet.begin(); it != m_pSet.end(); it++) {
688+
oElements.append(*it);
689+
}
690+
}
691+
692+
return oElements.attr("__iter__")();
693+
}
694+
695+
void CCollisionSet::OnEntityDeleted(CBaseEntity *pEntity)
696+
{
697+
Remove(pEntity);
698+
};
699+
700+
bool CCollisionSet::ShouldHitEntity(CBaseEntity *pEntity, CBaseEntity *pOther)
701+
{
702+
return !(Contains(pEntity) || Contains(pOther));
703+
};
704+
705+
638706
//-----------------------------------------------------------------------------
639707
// CCollisionListenerManager class.
640708
//-----------------------------------------------------------------------------
@@ -682,20 +750,16 @@ bool CCollisionListenerManager::CallCallbacks(object oEntity, object oOther)
682750

683751

684752
//-----------------------------------------------------------------------------
685-
// CEntityCollisionListenerManager singleton accessor.
753+
// Singleton accessors.
686754
//-----------------------------------------------------------------------------
687-
static CEntityCollisionListenerManager s_OnEntityCollision;
688-
CEntityCollisionListenerManager *GetOnEntityCollisionListenerManager()
755+
static CCollisionListenerManager s_OnEntityCollision;
756+
CCollisionListenerManager *GetOnEntityCollisionListenerManager()
689757
{
690758
return &s_OnEntityCollision;
691759
}
692760

693-
694-
//-----------------------------------------------------------------------------
695-
// CPlayerCollisionListenerManager singleton accessor.
696-
//-----------------------------------------------------------------------------
697-
static CPlayerCollisionListenerManager s_OnPlayerCollision;
698-
CPlayerCollisionListenerManager *GetOnPlayerCollisionListenerManager()
761+
static CCollisionListenerManager s_OnPlayerCollision;
762+
CCollisionListenerManager *GetOnPlayerCollisionListenerManager()
699763
{
700764
return &s_OnPlayerCollision;
701765
}

src/core/modules/entities/entities_collisions.h

Lines changed: 38 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,8 @@ class ICollisionRules
113113
ICollisionRules();
114114
virtual ~ICollisionRules();
115115

116-
virtual void OnEntityDeleted(void *pEntity) = 0;
117-
virtual bool ShouldHitEntity(void *pEntity, void *pOther) = 0;
116+
virtual void OnEntityDeleted(CBaseEntity *pEntity) = 0;
117+
virtual bool ShouldHitEntity(CBaseEntity *pEntity, CBaseEntity *pOther) = 0;
118118

119119
virtual void UnloadInstance();
120120
};
@@ -129,24 +129,48 @@ class CCollisionHash : public ICollisionRules
129129
CCollisionHash();
130130
~CCollisionHash();
131131

132-
void OnEntityDeleted(void *pEntity);
133-
bool ShouldHitEntity(void *pEntity, void *pOther);
132+
void OnEntityDeleted(CBaseEntity *pEntity);
133+
bool ShouldHitEntity(CBaseEntity *pEntity, CBaseEntity *pOther);
134134

135-
void AddPair(void *pEntity, void *pOther);
136-
void RemovePair(void *pEntity, void *pOther);
137-
void RemovePairs(void *pEntity);
135+
void AddPair(CBaseEntityWrapper *pEntity, CBaseEntityWrapper *pOther);
136+
void RemovePair(void *pObject, void *pOther);
137+
void RemovePairs(void *pObject);
138138

139-
bool Contains(void *pEntity);
140-
bool HasPair(void *pEntity, void *pOther);
139+
bool Contains(void *pObject);
140+
bool HasPair(void *pObject, void *pOther);
141141

142-
int GetCount(void *pEntity);
143-
list GetPairs(void *pEntity);
142+
int GetCount(void *pObject);
143+
list GetPairs(void *pObject);
144144

145145
private:
146146
IPhysicsObjectPairHash *m_pHash;
147147
};
148148

149149

150+
//-----------------------------------------------------------------------------
151+
// CCollisionSet class.
152+
//-----------------------------------------------------------------------------
153+
class CCollisionSet : public ICollisionRules
154+
{
155+
public:
156+
void Add(CBaseEntityWrapper *pEntity);
157+
void Remove(void *pObject);
158+
void Clear(void *pObject);
159+
160+
bool Contains(void *pObject);
161+
unsigned int GetSize();
162+
bool HasElements();
163+
164+
object Iterate();
165+
166+
void OnEntityDeleted(CBaseEntity *pEntity);
167+
bool ShouldHitEntity(CBaseEntity *pEntity, CBaseEntity *pOther);
168+
169+
private:
170+
boost::unordered_set<void *> m_pSet;
171+
};
172+
173+
150174
//-----------------------------------------------------------------------------
151175
// CCollisionCache class.
152176
//-----------------------------------------------------------------------------
@@ -245,29 +269,9 @@ class CCollisionListenerManager : public CListenerManager
245269
bool m_bInitialized;
246270
};
247271

248-
249-
//-----------------------------------------------------------------------------
250-
// CEntityCollisionListenerManager class.
251-
//-----------------------------------------------------------------------------
252-
class CEntityCollisionListenerManager: public CCollisionListenerManager
253-
{
254-
255-
};
256-
257-
// Singleton accessor.
258-
CEntityCollisionListenerManager *GetOnEntityCollisionListenerManager();
259-
260-
261-
//-----------------------------------------------------------------------------
262-
// CPlayerCollisionListenerManager class.
263-
//-----------------------------------------------------------------------------
264-
class CPlayerCollisionListenerManager: public CCollisionListenerManager
265-
{
266-
267-
};
268-
269-
// Singleton accessor.
270-
CPlayerCollisionListenerManager *GetOnPlayerCollisionListenerManager();
272+
// Singleton accessors.
273+
CCollisionListenerManager *GetOnPlayerCollisionListenerManager();
274+
CCollisionListenerManager *GetOnEntityCollisionListenerManager();
271275

272276

273277
#endif // _ENTITIES_COLLISIONS_H

0 commit comments

Comments
 (0)