Files
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

389 lines
10 KiB
C++

//===========================================================================//
// File: mover.hh //
// Project: MUNGA Brick: Model Manager //
// Contents: Interface specification for moving entity class //
//---------------------------------------------------------------------------//
// Date Who Modification //
// -------- --- ---------------------------------------------------------- //
// 01/21/95 JMA Initial coding. //
//---------------------------------------------------------------------------//
// Copyright (C) 1995, Virtual World Entertainment, Inc. //
// All Rights reserved worldwide //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
//===========================================================================//
#pragma once
#include "Adept.hpp"
#include "EntityClassData.hpp"
namespace Adept {
class Mover;
//##########################################################################
//##################### Mover::ModelResource #########################
//##########################################################################
class Mover__GameModel:
public Entity__GameModel
{
public:
Stuff::Scalar
moverMass;
Stuff::Vector3D
momentOfInertia,
linearDragCoefficients,
angularDragCoefficients;
Stuff::Scalar
frictionCoefficient,
elasticityCoefficient,
minimumBounceSpeed;
enum {
MoverMassAttributeID = Entity__GameModel::NextAttributeID,
MomentOfInertiaAttributeID,
LinearDragCoefficientsAttributeID,
AngularDragCoefficientsAttributeID,
FrictionCoefficientAttributeID,
ElasticityCoefficientAttributeID,
MinimumBounceSpeedAttributeID,
NextAttributeID
};
static bool
ReadAndVerify(
Mover__GameModel *model,
ModelAttributeEntry *attribute_entry,
const char *data,
char **error,
int error_buffer = 128
);
static void
ConstructGameModel(Script *script);
};
//##########################################################################
//############### Mover::ExecutionStateEngine #####################
//##########################################################################
class Mover__ExecutionStateEngine:
public Entity__ExecutionStateEngine
{
public:
static void
InitializeClass();
static void
TerminateClass();
typedef Entity__ExecutionStateEngine BaseClass;
static ClassData
*DefaultData;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Run-time Construction and Destruction Support
//
public:
typedef Mover__ExecutionStateEngine*
(*Factory)(
Mover *entity,
FactoryRequest *request
);
static Mover__ExecutionStateEngine*
Make(
Mover *mover,
FactoryRequest *request
);
protected:
Mover__ExecutionStateEngine(
ClassData *class_data,
Mover *mover,
FactoryRequest *request
);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// State stuff
//
public:
enum {
StraightLineMotionState = Entity__ExecutionStateEngine::StateCount,
LinearDragMotionState,
StateCount
};
protected:
static const StateEntry
StateEntries[];
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Test Support
//
public:
void
TestInstance();
};
//##########################################################################
//################## Mover::CreateMessage #######################
//##########################################################################
class Mover__CreateMessage:
public Entity__CreateMessage
{
public:
Stuff::Motion3D
worldSpaceVelocity;
Stuff::Motion3D
worldSpaceAcceleration;
Mover__CreateMessage(
size_t length,
int priority,
int message_flags,
Stuff::RegisteredClass::ClassID class_id,
int replicator_flags,
const ResourceID& instance_id,
const Stuff::LinearMatrix4D &creation_matrix,
Stuff::Scalar age,
int execution_state,
int name_id,
int entity_alignment,
const Stuff::Motion3D &initial_velocity = Stuff::Motion3D::Identity,
const Stuff::Motion3D &initial_acceleration = Stuff::Motion3D::Identity
):
Entity__CreateMessage(
length,
priority,
message_flags,
class_id,
replicator_flags,
instance_id,
creation_matrix,
age,
execution_state,
name_id,
entity_alignment
),
worldSpaceVelocity(initial_velocity),
worldSpaceAcceleration(initial_acceleration)
{}
static void
ConstructCreateMessage(Script *script);
};
//##########################################################################
//############################ Mover #################################
//##########################################################################
//-------------------------------------------------------------------------
// The following helper classes must always be typedef'd or overriden by an
// inheritor
//
typedef Entity__ClassData Mover__ClassData;
typedef Entity__Message Mover__Message;
typedef Entity__UpdateMessage Mover__UpdateMessage;
//----------------------- End of inheritance stuff ------------------------
class Mover:
public Entity
{
friend class MovementClass;
public:
static void
InitializeClass();
static void
TerminateClass();
typedef Entity BaseClass;
//##########################################################################
// Inheritance support
//
public:
typedef Mover__ClassData ClassData;
typedef Mover__GameModel GameModel;
typedef Mover__Message Message;
typedef Mover__ExecutionStateEngine ExecutionStateEngine;
typedef Mover__CreateMessage CreateMessage;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Run-time Construction and Destruction Support
//
public:
static Mover*
Make(
const CreateMessage *message,
ReplicatorID *base_id
);
Replicator::CreateMessage*
SaveMakeMessage(Stuff::MemoryStream *stream, ResourceFile *res_file);
void
SaveInstanceText(Stuff::Page *page);
void Respawn(Entity::CreateMessage *message);
void
Reuse(
const CreateMessage *message,
ReplicatorID *base_id
);
protected:
Mover(
ClassData *class_data,
const CreateMessage *message,
ReplicatorID *base_id,
ElementRenderer::Element *element
);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Class Data support
//
public:
static ClassData
*DefaultData;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Attribute Support
//
public:
enum {
LocalSpaceVelocityAttributeID = Entity::NextAttributeID,
LocalSpaceAccelerationAttributeID,
WorldSpaceVelocityAttributeID,
WorldSpaceAccelerationAttributeID,
NextAttributeID
};
//
// public attribute declarations go here
//
public:
Stuff::Motion3D
localSpaceVelocity,
localSpaceAcceleration,
worldSpaceVelocity,
worldSpaceAcceleration;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Game Model Support
//
public:
const GameModel*
GetGameModel()
{
Check_Object(this);
return Cast_Pointer(const GameModel*,gameModelResource.GetPointer());
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Execution Support
//
public:
void
StraightLineMotionSimulation(Stuff::Time till);
void
LinearDragMotionSimulation(Stuff::Time till);
void
PlaceOnEntity(
Stuff::LinearMatrix4D *position,
Stuff::Motion3D *velocity,
const Stuff::LinearMatrix4D &initial_offset,
const Stuff::Motion3D &initial_velocity
);
static void
CalculateMotionWithLinearDrag(
Stuff::Scalar time_slice,
Stuff::LinearMatrix4D *new_local_to_parent,
Stuff::Motion3D *new_velocity,
const Stuff::LinearMatrix4D &old_local_to_parent,
const Stuff::Motion3D &old_velocity,
const Stuff::Motion3D &acceleration,
const Stuff::Motion3D &drag
);
void
ApplyLocalAccelerationToTorque(
const Stuff::Vector3D &acceleration,
const Stuff::Vector3D &moment
);
void
ApplyLocalForceToTorque(
const Stuff::Vector3D &force,
const Stuff::Vector3D &moment
);
void
ApplyLocalAcceleration(
const Stuff::Vector3D &acceleration,
const Stuff::Vector3D &moment
);
void
ApplyLocalForce(
const Stuff::Vector3D &force,
const Stuff::Vector3D &moment
);
Stuff::Motion3D
localSpaceDrag,
initialWorldSpaceVelocity,
initialWorldSpaceAcceleration;
void
PreCollisionExecute(Stuff::Time till);
void
PostCollisionExecute(Stuff::Time till);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Collision support
//
public:
Stuff::Scalar
StaticBounce(
const Stuff::Point3D &old_position,
Stuff::Scalar delta_t,
Stuff::Scalar penetration,
const Stuff::Normal3D &normal,
Stuff::Scalar *elasticity,
Stuff::Scalar bounce_min,
Stuff::Scalar *friction
);
Stuff::Scalar
DynamicBounce(
Mover *other,
Stuff::Scalar delta_t,
Stuff::Scalar penetration,
const Stuff::Normal3D &normal,
Stuff::Scalar *elasticity
);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Test Support
//
public:
void
TestInstance();
};
inline Mover__ExecutionStateEngine::Mover__ExecutionStateEngine(
ClassData *class_data,
Mover *mover,
FactoryRequest *request
):
BaseClass(class_data, mover, request)
{
}
}