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>
638 lines
18 KiB
C++
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
|
|
|
|
//===========================================================================//
|
|
|