Imports the current Win32 source for the pod-racing game 'Red Planet', built on the MUNGA engine and its L4 (Win32/DirectX) platform layer: - MUNGA / MUNGA_L4: cross-platform engine core and Win32 backend - RP / RP_L4: Red Planet game logic and Win32 application - DivLoader, Setup1: asset loader and installer project - lib, MUNGA_L4/openal, MUNGA_L4/sos: third-party audio dependencies Removed stale Subversion metadata and added .gitignore/.gitattributes. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
203 lines
4.9 KiB
C++
203 lines
4.9 KiB
C++
#pragma once
|
|
|
|
#include "mover.h"
|
|
#include "cammgr.h"
|
|
|
|
class CameraControlsMapper;
|
|
|
|
//##########################################################################
|
|
//############### CameraShip::DirectionMessage #################
|
|
//##########################################################################
|
|
|
|
class CameraShip__DirectionMessage : public Mover::Message
|
|
{
|
|
public:
|
|
EntityID goalEntity;
|
|
Scalar timeOnCamera;
|
|
Point3D focusOffset;
|
|
|
|
CameraShip__DirectionMessage(Receiver::MessageID message_ID, size_t length, const EntityID& goal_entity, Scalar time_on_camera, const Point3D& focus) : Entity::Message(message_ID, length), goalEntity(goal_entity), timeOnCamera(time_on_camera), focusOffset(focus) {}
|
|
};
|
|
|
|
//##########################################################################
|
|
//############################# CameraShip ################################
|
|
//##########################################################################
|
|
|
|
class CameraShip : public Mover
|
|
{
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// Shared Data support
|
|
//
|
|
public:
|
|
static Derivation *GetClassDerivations();
|
|
static SharedData DefaultData;
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// Messaging support
|
|
//
|
|
protected:
|
|
static const HandlerEntry MessageHandlerEntries[];
|
|
static MessageHandlerSet MessageHandlers;
|
|
|
|
public:
|
|
enum
|
|
{
|
|
DirectionMessageID = Entity::NextMessageID,
|
|
NextMessageID
|
|
};
|
|
|
|
typedef CameraShip__DirectionMessage DirectionMessage;
|
|
|
|
void DirectionMessageHandler(DirectionMessage *message);
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// Attribute Support
|
|
//
|
|
public:
|
|
enum
|
|
{
|
|
MapRangeAttributeID = Mover::NextAttributeID,
|
|
MapLinearPositionAttributeID,
|
|
MapAngularPositionAttributeID,
|
|
NextAttributeID
|
|
};
|
|
|
|
private:
|
|
static const IndexEntry AttributePointers[];
|
|
|
|
protected:
|
|
//static AttributeIndexSet AttributeIndex
|
|
static AttributeIndexSet& GetAttributeIndex();
|
|
|
|
public:
|
|
Scalar mapRange;
|
|
Point3D *mapLinearPosition; // pointer to linear position of object or NULL
|
|
Quaternion *mapAngularPosition; // pointer to angular position of object or NULL
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// Model support
|
|
//
|
|
public:
|
|
enum
|
|
{
|
|
ControlsMapperSubsystem,
|
|
BasicSubsystemCount
|
|
};
|
|
void SetMappingSubsystem(CameraControlsMapper *mapper);
|
|
|
|
//
|
|
// Various States of the CameraShip
|
|
//
|
|
enum
|
|
{
|
|
ConfigureCamerasState = Mover::StateCount,
|
|
StateCount
|
|
};
|
|
|
|
typedef void (CameraShip::*Performance)(Scalar time_slice);
|
|
|
|
void SetPerformance(Performance performance)
|
|
{
|
|
Check(this);
|
|
activePerformance = (Simulation::Performance)performance;
|
|
}
|
|
|
|
void FollowGoal(Scalar time_slice);
|
|
|
|
void DriveCamera(Scalar time_slice);
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// Flag Support
|
|
//
|
|
public:
|
|
enum
|
|
{
|
|
DefaultFlags = Mover::DefaultFlags | NoCollisionVolumeFlag | NoCollisionTestFlag | InitialStasisFlag
|
|
};
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// Construction and Destruction
|
|
//
|
|
public:
|
|
static CameraShip* Make(MakeMessage *creation_message);
|
|
|
|
CameraShip(MakeMessage *creation_message, SharedData &virtual_data = DefaultData);
|
|
~CameraShip();
|
|
|
|
Logical TestInstance() const;
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// Public Data and Member Access Functions
|
|
//
|
|
public:
|
|
void SetGoalEntity(Entity *goal_entity)
|
|
{
|
|
Check(this);
|
|
Check(goal_entity);
|
|
goalEntity = goal_entity;
|
|
}
|
|
|
|
Entity* GetGoalEntity()
|
|
{
|
|
Check(this);
|
|
return goalEntity;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
// Local Member Data
|
|
//
|
|
public:
|
|
void GoToClosestCamera(const Point3D &point_3D);
|
|
CameraInstance* GetCurrentCamera()
|
|
{
|
|
Check(this);
|
|
return currentCamera;
|
|
}
|
|
|
|
Time lastSwitch;
|
|
Scalar timeOnCamera;
|
|
|
|
protected:
|
|
CameraInstanceManager cameraManager;
|
|
Entity *goalEntity;
|
|
CameraInstance *currentCamera;
|
|
Point3D focusOffset;
|
|
|
|
void MoveCameraShip(CameraInstance *camera_instance);
|
|
|
|
void AimCameraAtPoint(const Point3D &point_3D);
|
|
|
|
void RotateCameraToPoint(Scalar time_slice, const Point3D &point_3D);
|
|
|
|
//
|
|
// Camera Motion Support
|
|
//
|
|
public:
|
|
void ResetMotionVariables()
|
|
{
|
|
Check(this);
|
|
localVelocity = Motion::Identity;
|
|
localAcceleration = Motion::Identity;
|
|
worldLinearVelocity = Vector3D::Identity;
|
|
worldLinearAcceleration = Vector3D::Identity;
|
|
}
|
|
|
|
protected:
|
|
void ApplyControlledPanAndTilt(CameraControlsMapper *controls, Scalar time_slice);
|
|
void ApplyControlledCameraHeight(CameraControlsMapper *controls);
|
|
|
|
void ApplyControlledCameraMotion(CameraControlsMapper *controls, Scalar time_slice);
|
|
|
|
//
|
|
// Camera Manager Support
|
|
//
|
|
public:
|
|
void CreateCameraInstance();
|
|
void DeleteCameraInstance();
|
|
void IncrementCameraInstance();
|
|
void DecrementCameraInstance();
|
|
|
|
public:
|
|
void OutputCameraList() { cameraManager.WriteNotationFile(); }
|
|
};
|