1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
/* bzflag
* Copyright (c) 1993-2025 Tim Riker
*
* This package is free software; you can redistribute it and/or
* modify it under the terms of the license found in the file
* named COPYING that should have accompanied this file.
*
* THIS PACKAGE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
/* Teleporter:
* Encapsulates a box in the game environment.
*/
#ifndef BZF_TELEPORTER_H
#define BZF_TELEPORTER_H
#include "common.h"
#include <string>
#include "Obstacle.h"
#include "MeshFace.h"
class Teleporter : public Obstacle
{
public:
Teleporter();
Teleporter(const float* pos, float rotation,
float width, float breadth, float height,
float borderSize = 1.0f, bool horizontal = false,
bool drive = false, bool shoot = false, bool ricochet = false);
~Teleporter();
Obstacle* copyWithTransform(const MeshTransform&) const;
void setName(const std::string& name);
const std::string& getName() const;
const char* getType() const;
static const char* getClassName(); // const
float getBorder() const;
bool isHorizontal() const;
bool isValid() const;
float intersect(const Ray&) const;
void getNormal(const float* p, float* n) const;
bool inCylinder(const float* p, float radius, float height) const;
bool inBox(const float* p, float angle,
float halfWidth, float halfBreadth, float height) const;
bool inMovingBox(const float* oldP, float oldAngle,
const float *newP, float newAngle,
float halfWidth, float halfBreadth, float height) const;
bool isCrossing(const float* p, float angle,
float halfWidth, float halfBreadth, float height,
float* plane) const;
bool getHitNormal(
const float* pos1, float azimuth1,
const float* pos2, float azimuth2,
float halfWidth, float halfBreadth,
float height,
float* normal) const;
float isTeleported(const Ray&, int& face) const;
float getProximity(const float* p, float radius) const;
bool hasCrossed(const float* p1, const float* p2,
int& face) const;
void getPointWRT(const Teleporter& t2, int face1, int face2,
const float* pIn, const float* dIn, float aIn,
float* pOut, float* dOut, float* aOut) const;
void makeLinks();
const MeshFace* getBackLink() const;
const MeshFace* getFrontLink() const;
int packSize() const;
void* pack(void*) const;
const void* unpack(const void*);
void print(std::ostream& out, const std::string& indent) const;
void printOBJ(std::ostream& out, const std::string& indent) const;
std::string userTextures[1];
private:
void finalize();
private:
static const char* typeName;
std::string name;
float border;
bool horizontal;
float origSize[3];
MeshFace* backLink;
MeshFace* frontLink;
float fvertices[4][3]; // front vertices
float bvertices[4][3]; // back vertices
float texcoords[4][2]; // shared texture coordinates
};
//
// Teleporter
//
inline float Teleporter::getBorder() const
{
return border;
}
inline bool Teleporter::isHorizontal() const
{
return horizontal;
}
inline const MeshFace* Teleporter::getBackLink() const
{
return backLink;
}
inline const MeshFace* Teleporter::getFrontLink() const
{
return frontLink;
}
inline const std::string& Teleporter::getName() const
{
return name;
}
inline void Teleporter::setName(const std::string& _name)
{
name = _name;
return;
}
#endif // BZF_TELEPORTER_H
// Local Variables: ***
// mode: C++ ***
// tab-width: 4 ***
// c-basic-offset: 4 ***
// indent-tabs-mode: nil ***
// End: ***
// ex: shiftwidth=4 tabstop=4
|