scummvm/engines/saga2/tilevect.h
2021-07-01 01:36:55 +02:00

132 lines
4.3 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* 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.
*
*
* Based on the original sources
* Faery Tale II -- The Halls of the Dead
* (c) 1993-1996 The Wyrmkeep Entertainment Co.
*/
#ifndef SAGA2_TILEVECT_H
#define SAGA2_TILEVECT_H
namespace Saga2 {
// This routine returns a random vector between two bounding vectors
inline TilePoint randomVector(TilePoint minv, TilePoint maxv) {
return TilePoint(
RANDOM(minv.u, maxv.u),
RANDOM(minv.v, maxv.v),
RANDOM(minv.z, maxv.z));
}
// Routine to get an orthogonal vector in the uv plane to an existing vector
inline TilePoint rightVector(TilePoint tp, bool which = 0) {
return TilePoint(
tp.v * (which ? 1 : -1),
tp.u * (which ? -1 : 1),
0);
}
// Routine to force the magnitude of a vector to a value
inline void setMagnitude(TilePoint &tp, int32 newMag) {
#if DEBUG
assert(tp.magnitude());
#else
if (tp.magnitude() == 0)
tp = TilePoint(1, 1, 0);
#endif
//if ( tp.magnitude() )
//{
int32 nu = (tp.u * newMag) / tp.magnitude();
int32 nv = (tp.v * newMag) / tp.magnitude();
tp = TilePoint(nu, nv, tp.z);
//}
}
// returns an arbitrary 'side' designation for a line and a point
// the only determination that can be made from this value is that
// any other points returning the same value for the same line will
// be on the same 'side' of the line as the first
// note that this is flat in uv-space (no z)
inline bool sideOf(const TilePoint &p1, // point 1 used to define the line
const TilePoint &p2, // point 2 used to define the line
const TilePoint &pp) { // the point to get the 'side' of
int32 m;
if (p1.u - p2.u == 0)
return pp.u > p1.u;
m = (p1.v - p2.v) / (p1.u - p2.u);
return m * pp.u + p1.v > m * p1.u + pp.v;
}
// determines whether or not two points are on the same side of a
// line
inline bool sameSide(const TilePoint &p1, // point 1 used to define the line
const TilePoint &p2, // point 2 used to define the line
const TilePoint &pa, // the first point (to check)
const TilePoint &pb) { // the second point (to check against)
return sideOf(p1, p2, pa) == sideOf(p1, p2, pb);
}
// Get the lowest u,v, and z in either of 2,3 or 4 points
inline TilePoint MinTilePoint(
const TilePoint &c1,
const TilePoint &c2) {
return TilePoint(MIN(c1.u, c2.u), MIN(c1.v, c2.v), MIN(c1.z, c2.z));
}
inline TilePoint MinTilePoint(const TilePoint &c1, const TilePoint &c2, const TilePoint &c3) {
return MinTilePoint(MinTilePoint(c1, c2), c3);
}
inline TilePoint MinTilePoint(const TilePoint &c1, const TilePoint &c2,
const TilePoint &c3, const TilePoint &c4) {
return MinTilePoint(MinTilePoint(c1, c2), MinTilePoint(c3, c4));
}
// Get the highest u,v, and z in either of 2,3 or 4 points
inline TilePoint MaxTilePoint(
const TilePoint &c1,
const TilePoint &c2) {
return TilePoint(MAX(c1.u, c2.u), MAX(c1.v, c2.v), MAX(c1.z, c2.z));
}
inline TilePoint MaxTilePoint(const TilePoint &c1, const TilePoint &c2, const TilePoint &c3) {
return MaxTilePoint(MaxTilePoint(c1, c2), c3);
}
inline TilePoint MaxTilePoint(const TilePoint &c1, const TilePoint &c2,
const TilePoint &c3, const TilePoint &c4) {
return MaxTilePoint(MaxTilePoint(c1, c2), MaxTilePoint(c3, c4));
}
} // end of namespace Saga2
#endif