Files
CydandClaude Opus 4.8 4abbf8879f Initial import of Red Planet v4.10 Win32 source
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>
2026-06-30 07:59:51 -05:00

802 lines
16 KiB
C++

#pragma once
#include "l4audhdw.h"
#include "..\munga\audio.h"
#include "..\munga\audloc.h"
#include "..\munga\audsrc.h"
//##########################################################################
//####################### L4AudioSpatialization ######################
//##########################################################################
class L4AudioSpatialization SIGNATURED
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Public types
//
public:
enum Quadrant
{
Quadrant1,
Quadrant2,
Quadrant3,
Quadrant4
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Contstruction, Destruction, & Testing
//
public:
L4AudioSpatialization();
~L4AudioSpatialization();
Logical
TestInstance() const;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Spatialization calculations & results
//
public:
void
CalculateSpatialization(Radian azimuth_of_source);
Radian
azimuthOfSource;
Scalar
frontLeftScale,
frontRightScale,
rearLeftScale,
rearRightScale;
Scalar
frontLeftDelay,
frontRightDelay,
rearLeftDelay,
rearRightDelay;
Quadrant
quadrant;
};
//~~~~~~~~~~~~~~~~~~~~~~~ L4AudioSpatialization inlines ~~~~~~~~~~~~~~~~~~~~
inline MemoryStream&
MemoryStream_Read(
MemoryStream* stream,
L4AudioSpatialization::Quadrant *ptr
)
{
return stream->ReadBytes(ptr, sizeof(*ptr));
}
inline MemoryStream&
MemoryStream_Write(
MemoryStream* stream,
const L4AudioSpatialization::Quadrant *ptr
)
{
return stream->WriteBytes(ptr, sizeof(*ptr));
}
//##########################################################################
//######################### L4AudioLocation ##########################
//##########################################################################
class L4AudioLocation:
public AudioLocation
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Construction, Destruction, Testing
//
public:
L4AudioLocation(
PlugStream *stream,
Entity *entity
);
void
L4AudioLocationX();
~L4AudioLocation();
Logical
TestInstance() const;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Spatialization Accessors
//
public:
void
GetSpatialization(L4AudioSpatialization *the_spatialization)
{*the_spatialization = spatialization;}
L4AudioSpatialization::Quadrant
GetQuadrant()
{return spatialization.quadrant;}
Scalar
GetFrontLeftScale()
{return spatialization.frontLeftScale;}
Scalar
GetFrontRightScale()
{return spatialization.frontRightScale;}
Scalar
GetRearLeftScale()
{return spatialization.rearLeftScale;}
Scalar
GetRearRightScale()
{return spatialization.rearRightScale;}
Scalar
GetFrontLeftITDPitchOffset()
{return frontLeftITDPitchOffset;}
Scalar
GetFrontRightITDPitchOffset()
{return frontRightITDPitchOffset;}
Scalar
GetRearLeftITDPitchOffset()
{return rearLeftITDPitchOffset;}
Scalar
GetRearRightITDPitchOffset()
{return rearRightITDPitchOffset;}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Spatialization Implementation
//
public:
void
UpdateSpatialModelImplementation(AudioHead *audio_head);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Private data
//
private:
L4AudioSpatialization
spatialization;
Time
lastITDFrameTime;
Scalar
currentFrontLeftDelay,
currentFrontRightDelay,
currentRearLeftDelay,
currentRearRightDelay;
AudioPitchCents
frontLeftITDPitchOffset,
frontRightITDPitchOffset,
rearLeftITDPitchOffset,
rearRightITDPitchOffset;
};
//##########################################################################
//######################### AudioChannelSet ##########################
//##########################################################################
/*#define AUDIO_CHANNEL_SET_LENGTH (4)
typedef int AudioChannelSetIndex;
const AudioChannelSetIndex AudioChannelSetSize = AUDIO_CHANNEL_SET_LENGTH;
class AudioChannelSet SIGNATURED
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Construction, Destruction, & Testing
//
public:
AudioChannelSet();
~AudioChannelSet() {}
Logical
TestInstance() const;
static void
BuildFromPage(
PlugStream *stream,
NameList *name_list,
RegisteredClass::ClassID class_ID,
ObjectID object_ID
);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Channel accesors
//
public:
void
SetFrontLeft(AudioChannel *audio_channel);
void
SetFrontRight(AudioChannel *audio_channel);
void
SetRearLeft(AudioChannel *audio_channel);
void
SetRearRight(AudioChannel *audio_channel);
AudioChannel*
GetFrontLeft();
AudioChannel*
GetFrontRight();
AudioChannel*
GetRearLeft();
AudioChannel*
GetRearRight();
void
SetNth(
AudioChannelSetIndex index,
AudioChannel *audio_channel
);
AudioChannel*
GetNth(AudioChannelSetIndex index);
void
ReleaseAll();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Enable accesors
//
public:
void
EnableFrontLeft(Logical flag);
void
EnableFrontRight(Logical flag);
void
EnableRearLeft(Logical flag);
void
EnableRearRight(Logical flag);
Logical
IsFrontLeftEnabled();
Logical
IsFrontRightEnabled();
Logical
IsRearLeftEnabled();
Logical
IsRearRightEnabled();
void
EnableNth(
AudioChannelSetIndex index,
Logical flag
);
void
EnableAll();
Logical
IsNthEnabled(AudioChannelSetIndex index);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Null channel set
//
public:
static AudioChannelSet
Null;
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Private data
//
private:
AudioChannel
*channels[AUDIO_CHANNEL_SET_LENGTH];
Logical
enables[AUDIO_CHANNEL_SET_LENGTH];
};*/
//##########################################################################
//########################## L4AudioSource ###########################
//##########################################################################
class L4AudioSource:
public AudioSource
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Destruction, Testing
//
public:
~L4AudioSource();
Logical
TestInstance() const;
static void
BuildFromPage(
PlugStream *stream,
NameList *name_list,
ClassID class_ID,
ObjectID object_ID
);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// AudioChannelSet methods
//
public:
/* void
SetAudioChannelSet(const AudioChannelSet &audio_channel_set);
const AudioChannelSet*
GetAudioChannelSet();
void
ReleaseChannels();*/
void SetAudioChannelSet(const SourceSet &source_set);
SourceSet *GetAudioChannelSet();
void ReleaseChannels();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Protected Constuction
//
protected:
L4AudioSource(
PlugStream *stream,
Entity *entity
);
void
L4AudioSourceX();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Protected Implementations
//
protected:
void
StopMessageImplementation();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Protected Data
//
protected:
/*AudioChannelSet
channelSet;*/
SourceSet channelSet;
};
//##########################################################################
//######################## DirectPatchSource #########################
//##########################################################################
enum DirectPatchPosition
{
FrontDirectPatchPosition = 0,
RearDirectPatchPosition = 1,
FrontLeftDirectPatchPosition = 2,
FrontRightDirectPatchPosition = 3,
RearLeftDirectPatchPosition = 4,
RearRightDirectPatchPosition = 5
};
class DirectPatchSource:
public L4AudioSource
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Construction, Destruction, Testing
//
public:
DirectPatchSource(
PlugStream *stream,
Entity *entity
);
~DirectPatchSource();
Logical
TestInstance() const;
static void
BuildFromPage(
PlugStream *stream,
NameList *name_list,
ClassID class_ID,
ObjectID object_ID
);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// State implementations
//
public:
void
StartImplementation();
void
StopImplementation();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Protected Implementations
//
protected:
void
StartMessageImplementation();
void
ExecuteModel(Logical force_update);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Private data
//
private:
DirectPatchPosition
audioPosition;
/* AudioChannel
*channel;*/
MIDIValue
lastMIDIVolume;
MIDIPitchBend
lastMIDIPitchBend;
MIDINRPNValue
lastMIDIFilterCutoff;
};
//~~~~~~~~~~~~~~~~~~~~~~~~~~~ DirectPatchSource inlines ~~~~~~~~~~~~~~~~~~~~
inline MemoryStream&
MemoryStream_Read(
MemoryStream *stream,
DirectPatchPosition *ptr
)
{
return stream->ReadBytes(ptr, sizeof(*ptr));
}
inline MemoryStream&
MemoryStream_Write(
MemoryStream *stream,
const DirectPatchPosition *ptr
)
{
return stream->WriteBytes(ptr, sizeof(*ptr));
}
//##########################################################################
//###################### Dynamic3DPatchSource ########################
//##########################################################################
class Dynamic3DPatchSource:
public L4AudioSource
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Construction, Destruction, Testing
//
public:
Dynamic3DPatchSource(
PlugStream *stream,
Entity *entity
);
~Dynamic3DPatchSource();
Logical
TestInstance() const;
virtual Logical IsAudioSourceClipped(AudioHead *audio_head);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Mix levels
//
public:
AudioControlValue
CalculateSourceVolumeScale();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// State implementations
//
public:
void
StartImplementation();
void
StopImplementation();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Protected implementations
//
protected:
void
StartMessageImplementation();
void
ExecuteModel(Logical force_update);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Private data
//
private:
MIDIValue
lastFrontLeftMIDIVolume,
lastFrontRightMIDIVolume,
lastRearLeftMIDIVolume,
lastRearRightMIDIVolume;
MIDIPitchBend
lastFrontLeftMIDIPitchBend,
lastFrontRightMIDIPitchBend,
lastRearLeftMIDIPitchBend,
lastRearRightMIDIPitchBend;
MIDINRPNValue
lastMIDIFilterCutoff;
};
//##########################################################################
//####################### Static3DPatchSource ########################
//##########################################################################
class Static3DPatchSource:
public L4AudioSource
{
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Construction, Destruction, Testing
//
public:
Static3DPatchSource(
PlugStream *stream,
Entity *entity
);
~Static3DPatchSource();
Logical
TestInstance() const;
static void
BuildFromPage(
PlugStream *stream,
NameList *name_list,
ClassID class_ID,
ObjectID object_ID
);
virtual Logical IsAudioSourceClipped(AudioHead *audio_head);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// SetPosition
//
public:
void
SetPosition(const Vector3D &vector3D);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// State implementations
//
public:
void
StartImplementation();
void
StopImplementation();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Protected implementations
//
protected:
void
StartMessageImplementation();
void
ExecuteModel(Logical force_update);
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Private Methods
//
private:
L4AudioSpatialization::Quadrant
GetQuadrant();
Radian
GetAzimuthOfSource();
Scalar
GetFrontLeftScale();
Scalar
GetFrontRightScale();
Scalar
GetRearLeftScale();
Scalar
GetRearRightScale();
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Private data
//
private:
Vector3D
position;
Logical
useInternalSpatialization;
L4AudioSpatialization
internalSpatialization;
MIDIValue
lastFrontLeftMIDIVolume,
lastFrontRightMIDIVolume,
lastRearLeftMIDIVolume,
lastRearRightMIDIVolume;
MIDIPitchBend
lastMIDIPitchBend;
MIDINRPNValue
lastMIDIFilterCutoff;
};
//~~~~~~~~~~~~~~~~~~~~~~~~ Static3DPatchSource inlines ~~~~~~~~~~~~~~~~~~~~~
inline L4AudioSpatialization::Quadrant
Static3DPatchSource::GetQuadrant()
{
return internalSpatialization.quadrant;
}
inline Radian
Static3DPatchSource::GetAzimuthOfSource()
{
return internalSpatialization.azimuthOfSource;
}
inline Scalar
Static3DPatchSource::GetFrontLeftScale()
{
return internalSpatialization.frontLeftScale;
}
inline Scalar
Static3DPatchSource::GetFrontRightScale()
{
return internalSpatialization.frontRightScale;
}
inline Scalar
Static3DPatchSource::GetRearLeftScale()
{
return internalSpatialization.rearLeftScale;
}
inline Scalar
Static3DPatchSource::GetRearRightScale()
{
return internalSpatialization.rearRightScale;
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~ AudioChannelSet inlines ~~~~~~~~~~~~~~~~~~~~~~
/*inline void
AudioChannelSet::SetFrontLeft(AudioChannel *audio_channel)
{
Check(this);
channels[0] = audio_channel;
}
inline void
AudioChannelSet::SetFrontRight(AudioChannel *audio_channel)
{
Check(this);
channels[1] = audio_channel;
}
inline void
AudioChannelSet::SetRearLeft(AudioChannel *audio_channel)
{
Check(this);
channels[2] = audio_channel;
}
inline void
AudioChannelSet::SetRearRight(AudioChannel *audio_channel)
{
Check(this);
channels[3] = audio_channel;
}
inline AudioChannel*
AudioChannelSet::GetFrontLeft()
{
Check(this);
return channels[0];
}
inline AudioChannel*
AudioChannelSet::GetFrontRight()
{
Check(this);
return channels[1];
}
inline AudioChannel*
AudioChannelSet::GetRearLeft()
{
Check(this);
return channels[2];
}
inline AudioChannel*
AudioChannelSet::GetRearRight()
{
Check(this);
return channels[3];
}
inline void
AudioChannelSet::SetNth(
AudioChannelSetIndex index,
AudioChannel *audio_channel
)
{
Check(this);
Verify(index >=0 && index < AUDIO_CHANNEL_SET_LENGTH);
channels[index] = audio_channel;
}
inline AudioChannel*
AudioChannelSet::GetNth(AudioChannelSetIndex index)
{
Check(this);
Verify(index >=0 && index < AUDIO_CHANNEL_SET_LENGTH);
return channels[index];
}
inline void
AudioChannelSet::EnableFrontLeft(Logical flag)
{
Check(this);
enables[0] = flag;
}
inline void
AudioChannelSet::EnableFrontRight(Logical flag)
{
Check(this);
enables[1] = flag;
}
inline void
AudioChannelSet::EnableRearLeft(Logical flag)
{
Check(this);
enables[2] = flag;
}
inline void
AudioChannelSet::EnableRearRight(Logical flag)
{
Check(this);
enables[3] = flag;
}
inline Logical
AudioChannelSet::IsFrontLeftEnabled()
{
Check(this);
return enables[0];
}
inline Logical
AudioChannelSet::IsFrontRightEnabled()
{
Check(this);
return enables[1];
}
inline Logical
AudioChannelSet::IsRearLeftEnabled()
{
Check(this);
return enables[2];
}
inline Logical
AudioChannelSet::IsRearRightEnabled()
{
Check(this);
return enables[3];
}
inline void
AudioChannelSet::EnableNth(
AudioChannelSetIndex index,
Logical flag
)
{
Check(this);
Verify(index >=0 && index < AUDIO_CHANNEL_SET_LENGTH);
enables[index] = flag;
}
inline Logical
AudioChannelSet::IsNthEnabled(AudioChannelSetIndex index)
{
Check(this);
Verify(index >=0 && index < AUDIO_CHANNEL_SET_LENGTH);
return enables[index];
}*/