Files
bullet3/Extras/PhysicsEffects/src/base_level/collision/pfx_contact_cache.h
erwin.coumans a93a661b94 Add PhysicsEffects to Extras. The build is only tested on Windows and Android.
The Android/NEON optimized version of Physics Effects is thanks to Graham Rhodes and Anthony Hamilton, See Issue 587
2012-03-05 04:59:58 +00:00

101 lines
3.0 KiB
C++

/*
Physics Effects Copyright(C) 2010 Sony Computer Entertainment Inc.
All rights reserved.
Physics Effects is open software; you can redistribute it and/or
modify it under the terms of the BSD License.
Physics Effects is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the BSD License for more details.
A copy of the BSD License is distributed with
Physics Effects under the filename: physics_effects_license.txt
*/
#ifndef _SCE_PFX_CONTACT_CACHE_H
#define _SCE_PFX_CONTACT_CACHE_H
#include "../../../include/physics_effects/base_level/base/pfx_common.h"
#include "../../../include/physics_effects/base_level/base/pfx_vec_utils.h"
#include "../../../include/physics_effects/base_level/collision/pfx_sub_data.h"
namespace sce {
namespace PhysicsEffects {
#define SCE_PFX_MAX_CACHED_CONTACT_POINTS 4
/*
内部の衝突判定に使う軽量なコンタクトキャッシュ
*/
///////////////////////////////////////////////////////////////////////////////
// Contact Point
struct PfxCachedContactPoint
{
PfxSubData m_subData;
PfxUInt8 m_shapeIdA;
PfxUInt8 m_shapeIdB;
SCE_PFX_PADDING(1,2)
PfxFloat m_distance;
PfxVector3 m_normal;
PfxPoint3 m_localPointA;
PfxPoint3 m_localPointB;
void reset()
{
m_shapeIdA = m_shapeIdB = 0;
m_subData = PfxSubData();
m_distance = SCE_PFX_FLT_MAX;
}
};
///////////////////////////////////////////////////////////////////////////////
// Contact Point
class PfxContactCache
{
private:
PfxUInt32 m_numContacts;
SCE_PFX_PADDING(1,12)
PfxCachedContactPoint m_cachedContactPoints[SCE_PFX_MAX_CACHED_CONTACT_POINTS];
int findNearestContactPoint(const PfxPoint3 &newPoint,const PfxVector3 &newNormal);
int sort4ContactPoints(const PfxPoint3 &newPoint,PfxFloat newDistance);
public:
PfxContactCache() : m_numContacts(0) {}
void addContactPoint(
PfxFloat newDistance,
const PfxVector3 &newNormal, // world normal vector
const PfxPoint3 &newPointA, // local contact point to the objectA
const PfxPoint3 &newPointB, // local contact point to the objectB
PfxSubData m_subData);
void addContactPoint(const PfxCachedContactPoint &cp);
int getNumContacts() const {return (int)m_numContacts;}
PfxCachedContactPoint &getContactPoint(int i) {return m_cachedContactPoints[i];}
const PfxCachedContactPoint &getContactPoint(int i) const {return m_cachedContactPoints[i];}
PfxFloat getDistance(int i) {return m_cachedContactPoints[i].m_distance;}
const PfxVector3 &getNormal(int i) const {return m_cachedContactPoints[i].m_normal;}
const PfxPoint3 &getLocalPointA(int i) const {return m_cachedContactPoints[i].m_localPointA;}
const PfxPoint3 &getLocalPointB(int i) const {return m_cachedContactPoints[i].m_localPointB;}
const PfxSubData &getSubData(int i) const {return m_cachedContactPoints[i].m_subData;}
};
} //namespace PhysicsEffects
} //namespace sce
#endif // _SCE_PFX_CONTACT_CACHE_H