2016-03-12 01:20:51 +01:00
|
|
|
/* Copyright (c) 2002-2012 Croteam Ltd.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of version 2 of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation
|
|
|
|
|
|
|
|
|
|
|
|
This program 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
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
|
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
|
2016-03-11 14:57:17 +01:00
|
|
|
|
|
|
|
#ifndef SE_INCL_WORLDRAYCASTING_H
|
|
|
|
#define SE_INCL_WORLDRAYCASTING_H
|
|
|
|
#ifdef PRAGMA_ONCE
|
|
|
|
#pragma once
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <Engine/Math/Vector.h>
|
|
|
|
#include <Engine/Math/Placement.h>
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Class that describes casting of a ray.
|
|
|
|
*/
|
|
|
|
class ENGINE_API CCastRay {
|
|
|
|
public:
|
|
|
|
// diferent types of testing
|
|
|
|
enum TestType {
|
|
|
|
TT_NONE, // do not test at all
|
|
|
|
TT_SIMPLE, // do approximate testing
|
|
|
|
TT_COLLISIONBOX, // do testing by collision box
|
|
|
|
TT_FULL, // do full testing
|
|
|
|
TT_FULLSEETHROUGH, // do full testing without entities marked as see through
|
|
|
|
};
|
|
|
|
public:
|
|
|
|
BOOL cr_bAllowOverHit; // set if the ray can hit behind its target
|
|
|
|
ULONG cr_ulPassablePolygons; // flags mask for pass-through testing
|
|
|
|
CBrushPolygon *cr_pbpoIgnore; // polygon that is origin of the continuted ray (is never hit by the ray)
|
|
|
|
CEntity *cr_penIgnore; // entity that is origin of the continuted ray (is never hit by the ray)
|
|
|
|
|
|
|
|
/* Internal construction helper. */
|
|
|
|
void Init(CEntity *penOrigin, const FLOAT3D &vOrigin, const FLOAT3D &vTarget);
|
|
|
|
void ClearSectorList(void);
|
|
|
|
|
|
|
|
/* Add a sector if needed. */
|
|
|
|
inline void AddSector(CBrushSector *pbsc);
|
|
|
|
/* Add all sectors of a brush. */
|
|
|
|
void AddAllSectorsOfBrush(CBrush3D *pbr);
|
|
|
|
/* Add all sectors around given entity. */
|
|
|
|
void AddSectorsAroundEntity(CEntity *pen);
|
|
|
|
|
|
|
|
/* Test against a model entity. */
|
|
|
|
void TestModelSimple(CEntity *penModel, CModelObject &mo);
|
|
|
|
void TestModelCollisionBox(CEntity *penModel);
|
|
|
|
void TestModelFull(CEntity *penModel, CModelObject &mo);
|
|
|
|
void TestSkaModelSimple(CEntity *penModel, CModelInstance &mi);
|
|
|
|
void TestSkaModelFull(CEntity *penModel, CModelInstance &mi);
|
|
|
|
void TestModel(CEntity *penModel);
|
|
|
|
void TestSkaModel(CEntity *penModel);
|
|
|
|
|
|
|
|
/* Test against a terrain */
|
|
|
|
void TestTerrain(CEntity *penTerrain);
|
|
|
|
|
|
|
|
/* Test against a brush sector. */
|
|
|
|
void TestBrushSector(CBrushSector *pbscSector);
|
|
|
|
|
|
|
|
/* Test entire world against ray. */
|
|
|
|
void TestWholeWorld(CWorld *pwoWorld);
|
|
|
|
/* Test active sectors recusively. */
|
|
|
|
void TestThroughSectors(void);
|
|
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
// these are filled by the constructor:
|
|
|
|
CPlacement3D cl_plRay; // placement of the ray in absolute space
|
|
|
|
CEntity *cr_penOrigin; // entity that is origin of the ray (is never hit by the ray)
|
|
|
|
FLOAT3D cr_vOrigin; // coordinates of ray origin
|
|
|
|
FLOAT3D cr_vTarget; // coordinates of ray target
|
|
|
|
FLOAT3D cr_vOriginRelative; // coordinates of ray origin relative to current entity
|
|
|
|
FLOAT3D cr_vTargetRelative; // coordinates of ray target relative to current entity
|
|
|
|
|
|
|
|
// these can be altered afterwards for special options
|
|
|
|
BOOL cr_bHitPortals; // don't pass through portals (off by default)
|
|
|
|
BOOL cr_bHitTranslucentPortals; // don't pass through translucent portals (on by default)
|
|
|
|
enum TestType cr_ttHitModels; // type of testing against models (simple by default)
|
|
|
|
BOOL cr_bHitFields; // don't pass thrugh field brushes (off by default)
|
|
|
|
BOOL cr_bHitBrushes; // don't pass thrugh brushes (on by default)
|
|
|
|
BOOL cr_bHitTerrainInvisibleTris;// don't pass thrugh invisible terrain triangles (off by default)
|
|
|
|
BOOL cr_bPhysical; // pass only where physical objects can pass
|
|
|
|
FLOAT cr_fTestR; // additional radius of ray (default 0)
|
|
|
|
|
|
|
|
// these are filled by casting algorithm:
|
|
|
|
CEntity *cr_penHit; // entity hit by ray, NULL if ray was cast in void
|
|
|
|
FLOAT3D cr_vHit; // coordinate where the ray hit the entity
|
|
|
|
FLOAT cr_fHitDistance; // how far the hit was from the origin
|
|
|
|
|
|
|
|
BOOL cr_bFindBone; // should the bone ID be checked while testing with SKA
|
|
|
|
INDEX cr_iBoneHit; // id of the bone hit by the ray (SKA)
|
|
|
|
|
|
|
|
CBrushPolygon *cr_pbpoBrushPolygon; // polygon that was hit (if brush entity hit)
|
|
|
|
CBrushSector *cr_pbscBrushSector; // sector that was hit (if brush entity hit)
|
|
|
|
|
|
|
|
/* Constructor. */
|
|
|
|
CCastRay(CEntity *penOrigin, const CPlacement3D &plOrigin); // target is very far away
|
|
|
|
CCastRay(CEntity *penOrigin, const CPlacement3D &plOrigin, FLOAT fMaxTestDistance);
|
|
|
|
CCastRay(CEntity *penOrigin, const FLOAT3D &vOrigin, const FLOAT3D &vTarget);
|
|
|
|
~CCastRay(void);
|
|
|
|
|
|
|
|
/* Do the ray casting. */
|
|
|
|
void Cast(CWorld *pwoWorld);
|
|
|
|
/* Continue cast. */
|
|
|
|
void ContinueCast(CWorld *pwoWorld);
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
#endif /* include-once check. */
|
|
|
|
|