Files
TeslaRel410/CODE/RP/MUNGA_L4/L4VIDEO.HPP
T
CydandClaude Fable 5 fdd9ac9d97 Initial import: Tesla Release 4.10 (Tesla:BattleTech & Tesla:Red Planet)
Archival snapshot of the Virtual World Entertainment Tesla cockpit
software, 1994-1996: MUNGA engine and L4 pod layer source (Borland
C++ 5.0), BT/RP game code, and game content (models, audio, maps,
gauges, Division renderer data). Includes third-party libraries:
Division dVS/DPL graphics, HMI SOS audio, WATTCP networking.

Files are preserved byte-for-byte (.gitattributes disables all
line-ending conversion). README.md documents the layout, target
hardware, and toolchain.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 13:21:58 -05:00

638 lines
18 KiB
C++

//===========================================================================//
// File: l4video.hpp //
// Project: MUNGA Brick: Video Renderer Manager //
// Contents: Interface specification Video Renderer Manager //
//---------------------------------------------------------------------------//
// Date Who Modification //
// -------- --- ---------------------------------------------------------- //
// 01/11/95 GAC Initial coding. //
// 07/11/95 KEO Modify video resource format. //
// 02/08/96 KEO Add rubble entry to video resource. //
//---------------------------------------------------------------------------//
// Copyright (C) 1995-1996, Virtual World Entertainment, Inc. //
// All Rights reserved worldwide. //
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL. //
//===========================================================================//
#if !defined(L4VIDEO_HPP)
# define L4VIDEO_HPP
# if !defined(VIDREND_HPP)
# include <vidrend.hpp>
# endif
# if !defined(ROTATION_HPP)
# include <rotation.hpp>
# endif
# if !defined(RETICLE_HPP)
# include <reticle.hpp>
# endif
# if !defined(GRAPH2D_HPP)
# include <graph2d.hpp>
# endif
# if !defined(SIMULATE_HPP)
# include <simulate.hpp>
# endif
# if !defined(L4VIDRND_HPP)
# include <l4vidrnd.hpp>
# endif
# if !defined(TREE_HPP)
# include <tree.hpp>
# endif
# if !defined(TABLE_HPP)
# include <table.hpp>
# endif
#include <dpl.h>
#include <dpl_2d.h>
class NotationFile;
#define INTERSECT_ALL (0xFFFFFFFF)
//##########################################################################
// Declaration of dpl callback function that performs in-place text
// substitution on all material names before they are looked up.
// There must be at least MATERIAL_NAME_LENGTH bytes available at source!
//
#define MATERIAL_NAME_BUFFER_LENGTH 256
char8*
substituteMaterial(char8 *source);
//##########################################################################
// This structure is attached to DPL nodes so we can put information in them
// on what entity the node is part of and what damage zone it belongs to.
//
#define MAX_DZ_NAME_LENGTH 25
struct dpl_tracker
{
Entity
*This_Entity; // The entity this is part of
char
dz_name[MAX_DZ_NAME_LENGTH]; // this is temporary, to make testing easier
int
Damage_Zone_Number; // number of this damage zone
};
//-----------------------------------------------------------------------------
//--------------------------DPL video resource object--------------------------
//-----------------------------------------------------------------------------
//##########################################################################
//########################## L4VideoObject ###########################
//##########################################################################
#define MAX_OBJECT_FILENAME_LENGTH 15
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// This class gets stored in a resource so it is derived from nothing.
//
class L4VideoObject
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Construction, Destruction and testing
//
public:
enum ResourceType
{
Unknown,
Skeleton,
Object,
Rubble,
VidFile
};
enum RendererModes // bit flags
{
Normal = 0x000,
BillboardXAxis = 0x001,
BillboardYAxis = 0x002,
BillboardZAxis = 0x004,
BillboardObject = (BillboardXAxis | BillboardYAxis | BillboardZAxis),
BlinkObject = 0x008,
IntersectImmune = 0x010
};
// L4VideoObject();
L4VideoObject(
const char *filename,
ResourceType resource_type,
Enumeration renderer_modes, // RendererModes
float blink_period = 0.0f,
float percent_time_on = 0.0f
);
~L4VideoObject();
const char*
GetObjectFilename() const
{ return objectFilename; }
char*
GetObjectFilename()
{ return objectFilename; }
ResourceType
GetResourceType() const
{ return resourceType; }
Enumeration // RendererModes
GetRendererModes() const
{ return rendererModes; }
Logical
TestInstance() const;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Implementations
//
// private:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Private data
//
private:
char
objectFilename[MAX_OBJECT_FILENAME_LENGTH];
ResourceType
resourceType;
Enumeration // RendererModes
rendererModes; // bit flags (see RendererModes)
float
blinkPeriod, // cycle length in seconds
percentTimeOn; // percent of cycle on
};
//##########################################################################
//####################### L4VideoObjectWrapper #######################
//##########################################################################
class L4VideoObjectWrapper:
public Plug
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Construction, Destruction and testing
//
public:
// L4VideoObjectWrapper();
L4VideoObjectWrapper(
L4VideoObject *video_object,
Logical delete_object = False
);
~L4VideoObjectWrapper();
L4VideoObject*
GetVideoObject() const
{ Check(this); return videoObject; }
Logical
TestInstance() const;
static int
BuildVideoObjectChainFromResource(
ChainOf<L4VideoObjectWrapper*> *video_chain,
ResourceDescription *video_resource
);
static void
DeleteVideoObjectChain(
ChainOf<L4VideoObjectWrapper*> *video_chain
);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Implementations
//
// public:
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Private data
//
private:
L4VideoObject
*videoObject;
Logical
deleteObject;
};
//
//-----------------------------------------------------------------------------
//--------------Actual DPL video renderer class starts below-------------------
//-----------------------------------------------------------------------------
//
class DPLObjectCacheLine:
public Plug
{
public:
DPLObjectCacheLine(
const CString &object_name,
dpl_OBJECT *object_ptr)
{
objectName = object_name;
objectPointer = object_ptr;
};
~DPLObjectCacheLine(){};
Logical
TestInstance() const
{
Check(&objectName);
Check_Pointer(objectPointer);
return True;
};
CString
objectName;
dpl_OBJECT
*objectPointer;
};
class DPLJointToDCSTranslator:
public Plug
{
public:
DPLJointToDCSTranslator(
Entity *entity, // The entity to translate
dpl_DCS *dcs_array[]); // Array of DCS's to translate
~DPLJointToDCSTranslator();
Logical
TestInstance() const;
int
DCSCount;
dpl_DCS
**translation_array; // array to translate from joint # to DCS*
};
//##########################################################################
//########################### DPLRenderer ############################
//##########################################################################
#define DELAY_DCS_FLUSH_ARRAY_SIZE 100
#define MAX_PSFX_COUNT 40
class DPLRenderer:
public VideoRenderer
{
public:
//
// Construction, Destruction and test instance declarations
//
DPLRenderer(
RendererRate calibration_rate,
RendererComplexity calibration_complexity,
RendererPriority calibration_priority,
InterestType interest_type,
InterestDepth depth_calibration);
~DPLRenderer();
Logical
TestInstance() const;
//
// These routines are the renderer side of the culling system, they are
// used to setup the stored data on the eyepoint's transformation matrices
//
inline Scalar
GetCurrentFrameTime()
{return(currentFrameTime);} // Returns the time at the start of the frame
inline LinearMatrix*
GetWorldToEyeMatrix()
{return(&worldToEyeMatrix);} // Returns the world to eye matrix (for culling)
inline Scalar
GetViewRatio()
{return(viewRatio);} // Returns tan(viewAngle/2.0)
void
SetupCull(); // Sets up the WorldToEyeMatrix each frame
//
// These routines manage the renderer's list of renderables that need to be
// executed each frame. For the moment these routines just blindly add and
// remove the items from the dplRenderableSocket
//
void
AddDynamicRenderable(Component *my_renderable);
void
RemoveDynamicRenderable(Component *my_renderable);
//
// These routines are used for tracking target frame time
//
void
ResetStatistics();
void
ReportStatistics();
//
// Other renderer stuff
//
dpl_ZONE*
MakeNewZone();
void
MarkDCSHiearchy(
dpl_DCS *root_DCS,
Entity *entity);
void
FlushBitSliceTexture(
unsigned int *local_storage);
void
LoadBitSliceTexture(
BitMap *bitmap_to_load, // MUNGA 1 bit bitmap to load
int load_position, // Position to load bitmap into
unsigned int *local_storage); // 8192 longword array for storage of the texmap
void
SetViewAngle(Degree new_angle);
unsigned int*
MakeBitSliceStorage();
void
SortAndReloadNameBitmaps();
void
LoadNameBitmaps();
void
LoadOrdinalBitmaps(unsigned int *local_storage);
void
DPLIndependantEffect(
Point3D location, // Location of the effect in world space
int effect_number, // DPL effect number to trigger at this location
dpl_DCS *my_dcs = NULL,
int subid = 0); // inserted into third byte of effect id.
void
DPLIndependantPFX(
Point3D location, // Location in space to trigger the effect
dpl_PARTICLESTART_EFFECT_INFO *psfx_definition, // Description of the pfx
dpl_DCS *my_dcs = NULL, // optional DCS to issue from
int subid = 0); // inserted into third byte of effect id.
void
DPLDelayDCSFlush(
dpl_DCS *my_dcs); // The DCS we want to remember for later
void
DPLDoDCSBatchFlush(); // Flush the dcs's remembered by DPLDelayDCSFlush
void
DPLReportFreeMemory(ostream &output); // Report current free memory in card
void
DPLReportPerfStats(ostream &output); // Report performance statistics
void
DPLToggleWireframe(); // Toggle state of dpl wireframe
void
DPLTogglePVision(); // Toggle state of dpl pvision
void
DPLFrameDump(Logical antialias); // Write framedump to targa file
Logical
CompleteCycle();
InnerProjectileRenderable*
GetProjectile(
dpl_OBJECT *graphical_object, // object to hang on the DCS, may be a list later <NULL>
dpl_ZONE *this_zone); // DPL Zone this stuff will live in (for culling)
void
ReleaseProjectile(
InnerProjectileRenderable *inner_projectile);
int
GetUniqueID();
dpl_PARTICLESTART_EFFECT_INFO*
ReadPSFX(
const char *file_name); // Name of the file containing the PSFX description
dpl_OBJECT*
GetCachedObject(
const CString &object_name); // Name of the object we want to get
void
PutCachedObject(
const CString &object_name, // Name of the object we will cache
dpl_OBJECT *object_pointer); // pointer to the object being cached
static ResourceDescription::ResourceID
CreateModelVideoStreamResource(
ResourceFile *resource_file,
const char *model_name,
NotationFile *model_file,
const ResourceDirectories *directories);
void
CacheExplosionScripts(
int script_select); // The script to be cached
enum FogStyle
{
updateFogSetting,
noUpdateFogSetting,
searchLightOnFogStyle,
searchLightOffFogStyle,
winnersCircleFogStyle
};
void
SetFogStyle(FogStyle my_fog);
void
GetCurrentFogSettings(
float *fogRed,
float *fogGreen,
float *fogBlue,
float *fogNear,
float *fogFar);
private:
void
ExplosionScripts(
Entity *entity, // The entity we are dealing with
ResourceDescription *model_resource, // Pointer to the video resource
ViewFrom view_type, // Type of reference (inside/outside...etc.)
int script_select);
void
DPLRenderer::DPLReadINIPage(
NotationFile *master_notation_file,
const char *starting_page_name,
Mission *mission,
Logical debug_print);
void
DPLRenderer::DPLReadEnvironment(Mission *mission);
void
ShutdownImplementation();
void
SuspendImplementation();
void
ResumeImplementation();
void
ExecuteImplementation(
RendererComplexity complexity_update,
RendererOrigin::InterestingEntityIterator *iterator
);
protected:
void
LoadMissionImplementation(Mission *mission);
//
// These variables hold some culling related information
//
LinearMatrix
worldToEyeMatrix; // the current world to eye transform for our linked entity
Scalar
currentFrameTime; // the time at the start of renderable execution
//
// These variables are used for tracking target frame time
//
unsigned long
total_cull,
total_draw,
total_pixelplanes,
total_frame_time,
target_frame_time,
frame_count,
target_frame_count;
Logical
statistics_started;
Scalar
report_time;
//
// The rest of the renderer's variables.
//
Time
StartSample; // For generating a framerate printout
Logical
fogUpdating,
eyeRelative, // True if the eye will be relative to the linked entity origin
completeCycleNeeded; // True when we are waiting for DPL to be ready for the next frame
int
myUniqueID, // Generates a unique 16 bit id value for PSFX use
lastAppState; // For keeping track of what the application is doing
float
aspectRatio, // aspect ratio of the screen
FrameCount, // For keeping track of framerate
// Fog is setup as standard fog used for vehicles without simulated lights
// and used when a vehicle with lights has them switched on. This setting
// is replicated into the "noSearchLight" setting so vehicles with lights
// will always get this setting if the environment doesn't specifically say
// that headlight simulation will work.
fogRed, // Fog setting to use when vehicle lights are on
fogBlue, // This is the default for vehicles with no lights
fogGreen,
fogNear,
fogFar,
searchLightFogRed, // Fog setting to use when vehicle lights are on
searchLightFogBlue,
searchLightFogGreen,
searchLightFogNear,
searchLightFogFar,
noSearchLightFogRed, // Fog setting to use when vehicle lights are off
noSearchLightFogBlue,
noSearchLightFogGreen,
noSearchLightFogNear,
noSearchLightFogFar,
clipNear, // Near clipping plane (from INI file)
clipFar, // Far clipping plane (from INI file)
backgroundRed, // Background color (from INI file)
backgroundGreen,
backgroundBlue,
viewAngle, // Viewing angle (from INI file)
viewRatio; // This is tan(viewAngle/2.0f) (handy for culling)
dpl_DCS
*dplTestEyeDCS; // A DCS we temporarily hook our eye on (for testing)
void
MakeEntityRenderables(
Entity *this_entity, // The entity we are dealing with
ResourceDescription *model_resource, // Pointer to the video resource
ViewFrom type); // Type of reference (inside/outside...etc.)
dpl_VIEW
*dplMainView; // The DPL view we create at the beginning and use for our eye
dpl_ZONE
*dplDeathZone, // The DPL zone that holds our vehicle (for death effect)
*dplMainZone; // The DPL zone that holds the rest of the world
Reticle
*vehicleReticle; // Pointer to our vehicle's reticle if one exists.
dpl_DCS
*delayDCSFlushArray[DELAY_DCS_FLUSH_ARRAY_SIZE+1];
int
delayedDCSCount;
dpl_PARTICLESTART_EFFECT_INFO
*myPSFXDescriptons[MAX_PSFX_COUNT];
//
// This information is captured from the pickpoint when it is enabled
//
dpl_INSTANCE
*dplHitInstance;
dpl_DCS
*dplHitDCS;
dpl_GEOGROUP
*dplHitGeoGroup;
dpl_GEOMETRY
*dplHitGeometry;
//
// This information holds the list of projectile renderables
//
SChainOf<InnerProjectileRenderable*>
projectile_list;
//
// This holds the list of cached objects
//
TreeOf<DPLObjectCacheLine*, CString>
dplObjectCacheSocket;
//
// This holds the list of jointed mover DCS tables
//
TableOf<DPLJointToDCSTranslator*, RegisteredClassMemoryAddress>
dplJointToDCSTranslatorSocket;
//
// This chain contains the list of active renderables
//
SChainOf<Component*>
dplRenderableSocket;
public:
//
// Store Lights for Later Revision
//
dpl_LIGHT
*ambientLight,
**sceneLight; // Array of all the lights
dpl_DCS
**sceneLightDCS; // Array of DCS's for Lights
int
sceneLightCount;
static UserHeap
*DPLHeap;
};
#endif
//===========================================================================//