Select Git revision
BaseAmmo.cpp
BaseAmmo.cpp 11.54 KiB
/***********************************************************
Copyright © Vitaliy Buturlin, Evgeny Danilovich, 2017, 2018
See the license in LICENSE
***********************************************************/
#include "BaseAmmo.h"
#include "Tracer.h"
#include "BaseTool.h"
#include <particles/sxparticles.h>
#include <decals/sxdecals.h>
#include <BulletCollision/NarrowPhaseCollision/btRaycastCallback.h>
/*! \skydocent base_ammo
Базовый класс для патронов
*/
BEGIN_PROPTABLE(CBaseAmmo)
//! Начальная скорость пули
DEFINE_FIELD_FLOAT(m_fStartSpeed, PDFF_NOEDIT | PDFF_NOEXPORT, "start_speed", "", EDITOR_NONE)
//! Масса пули, кг
DEFINE_FIELD_FLOAT(m_fBulletMass, PDFF_NOEDIT | PDFF_NOEXPORT, "bullet_mass", "", EDITOR_NONE)
//! Бронебойность
DEFINE_FIELD_FLOAT(m_fArmorPiercing, PDFF_NOEDIT | PDFF_NOEXPORT, "armor_piercing", "", EDITOR_NONE)
//! Экспансивная?
DEFINE_FIELD_BOOL(m_isExpansive, PDFF_NOEDIT | PDFF_NOEXPORT, "is_expansive", "", EDITOR_NONE)
//! Разрывная?
DEFINE_FIELD_BOOL(m_isBursting, PDFF_NOEDIT | PDFF_NOEXPORT, "is_bursting", "", EDITOR_NONE)
END_PROPTABLE()
REGISTER_ENTITY_NOLISTING(CBaseAmmo, base_ammo);
struct AllHitsNotMeRayResultCallback: public btCollisionWorld::AllHitsRayResultCallback
{
AllHitsNotMeRayResultCallback(btCollisionObject* me, const btVector3& rayFromWorld, const btVector3& rayToWorld):
AllHitsRayResultCallback(rayFromWorld, rayToWorld)
{
m_me = me;
}
virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult, bool normalInWorldSpace)
{
//printf("%f\n", rayResult.m_hitFraction);
if(rayResult.m_collisionObject == m_me)
{
return 1.0;
}
if(rayResult.m_localShapeInfo)
{
m_shapeInfos.push_back(*rayResult.m_localShapeInfo);
}
else
{
m_shapeInfos.push_back({-1, -1});
}
return(AllHitsRayResultCallback::addSingleResult(rayResult, normalInWorldSpace));
}
Array<btCollisionWorld::LocalShapeInfo> m_shapeInfos;
protected:
btCollisionObject* m_me;
};
CBaseAmmo::CBaseAmmo(CEntityManager * pMgr):
BaseClass(pMgr),
m_fStartSpeed(0.0f),
m_fBulletMass(0.0f),
m_fArmorPiercing(0.0f),
m_fNextBarrierDepth(0.0f)
{
m_bPickable = false;