mirror of
https://github.com/bearstonem/openmohaa-vr.git
synced 2026-10-26 02:00:27 +01:00
182 lines
4.6 KiB
C++
182 lines
4.6 KiB
C++
/*
|
|
===========================================================================
|
|
Copyright (C) 2024 the OpenMoHAA team
|
|
|
|
This file is part of OpenMoHAA source code.
|
|
|
|
OpenMoHAA source code 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.
|
|
|
|
OpenMoHAA source code 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 OpenMoHAA source code; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
===========================================================================
|
|
*/
|
|
|
|
// gravpath.h: Gravity path - Used for underwater currents and wells.
|
|
|
|
#pragma once
|
|
|
|
#include "g_local.h"
|
|
#include "../corepp/class.h"
|
|
#include "../corepp/container.h"
|
|
|
|
class GravPathNode : public Entity
|
|
{
|
|
private:
|
|
float speed;
|
|
float radius;
|
|
qboolean headnode;
|
|
float max_speed;
|
|
|
|
public:
|
|
qboolean active;
|
|
|
|
CLASS_PROTOTYPE(GravPathNode);
|
|
GravPathNode();
|
|
void SetSpeed(Event *ev);
|
|
void SetMaxSpeed(Event *ev);
|
|
void SetRadius(Event *ev);
|
|
void CreatePath(Event *ev);
|
|
void Activate(Event *ev);
|
|
void Deactivate(Event *ev);
|
|
float Speed(void);
|
|
float MaxSpeed(void);
|
|
|
|
float Radius(void) { return radius; };
|
|
|
|
void Archive(Archiver& arc) override;
|
|
};
|
|
|
|
inline void GravPathNode::Archive(Archiver& arc)
|
|
{
|
|
Entity::Archive(arc);
|
|
|
|
arc.ArchiveFloat(&speed);
|
|
arc.ArchiveFloat(&radius);
|
|
arc.ArchiveBoolean(&headnode);
|
|
arc.ArchiveBoolean(&active);
|
|
arc.ArchiveFloat(&max_speed);
|
|
}
|
|
|
|
typedef SafePtr<GravPathNode> GravPathNodePtr;
|
|
|
|
class GravPath : public Listener
|
|
{
|
|
private:
|
|
Container<GravPathNodePtr> pathlist;
|
|
float pathlength;
|
|
|
|
GravPathNodePtr from;
|
|
GravPathNodePtr to;
|
|
int nextnode;
|
|
|
|
public:
|
|
CLASS_PROTOTYPE(GravPath);
|
|
|
|
GravPath();
|
|
~GravPath();
|
|
void Clear(void);
|
|
void Reset(void);
|
|
void AddNode(GravPathNode *node);
|
|
GravPathNode *GetNode(int num);
|
|
GravPathNode *NextNode(void);
|
|
Vector ClosestPointOnPath(Vector pos, Entity& ent, float *bestdist, float *speed, float *radius);
|
|
float DistanceAlongPath(Vector pos, float *speed);
|
|
Vector PointAtDistance(Vector pos, float dist, qboolean is_player, float *max_distance);
|
|
void DrawPath(float r, float g, float b);
|
|
int NumNodes(void);
|
|
float Length(void);
|
|
GravPathNode *Start(void);
|
|
GravPathNode *End(void);
|
|
void Archive(Archiver& arc) override;
|
|
|
|
Vector mins;
|
|
Vector maxs;
|
|
Vector origin;
|
|
qboolean force;
|
|
};
|
|
|
|
inline void GravPath::Archive(Archiver& arc)
|
|
{
|
|
GravPathNodePtr *tempPtr;
|
|
int i, num;
|
|
|
|
Listener::Archive(arc);
|
|
|
|
if (arc.Loading()) {
|
|
Reset();
|
|
} else {
|
|
num = pathlist.NumObjects();
|
|
}
|
|
arc.ArchiveInteger(&num);
|
|
if (arc.Loading()) {
|
|
pathlist.Resize(num);
|
|
}
|
|
|
|
for (i = 1; i <= num; i++) {
|
|
tempPtr = pathlist.AddressOfObjectAt(i);
|
|
arc.ArchiveSafePointer(tempPtr);
|
|
}
|
|
|
|
arc.ArchiveFloat(&pathlength);
|
|
arc.ArchiveSafePointer(&from);
|
|
arc.ArchiveSafePointer(&to);
|
|
arc.ArchiveInteger(&nextnode);
|
|
arc.ArchiveVector(&mins);
|
|
arc.ArchiveVector(&maxs);
|
|
arc.ArchiveVector(&origin);
|
|
arc.ArchiveBoolean(&force);
|
|
}
|
|
|
|
class GravPathManager : public Class
|
|
{
|
|
private:
|
|
Container<GravPath *> pathList;
|
|
|
|
public:
|
|
CLASS_PROTOTYPE(GravPathManager);
|
|
~GravPathManager();
|
|
void Reset(void);
|
|
void AddPath(GravPath *p);
|
|
void RemovePath(GravPath *p);
|
|
Vector CalculateGravityPull(Entity& ent, Vector position, qboolean *force, float *max_speed);
|
|
void DrawGravPaths(void);
|
|
void Archive(Archiver& arc) override;
|
|
};
|
|
|
|
inline void GravPathManager::Archive(Archiver& arc)
|
|
{
|
|
GravPath *ptr;
|
|
int i, num;
|
|
|
|
Class::Archive(arc);
|
|
|
|
if (arc.Saving()) {
|
|
num = pathList.NumObjects();
|
|
} else {
|
|
Reset();
|
|
}
|
|
arc.ArchiveInteger(&num);
|
|
for (i = 1; i <= num; i++) {
|
|
if (arc.Saving()) {
|
|
ptr = pathList.ObjectAt(i);
|
|
} else {
|
|
ptr = new GravPath;
|
|
}
|
|
arc.ArchiveObject(ptr);
|
|
if (arc.Loading()) {
|
|
pathList.AddObject(ptr);
|
|
}
|
|
}
|
|
}
|
|
|
|
extern GravPathManager gravPathManager;
|