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.
146 lines
4.5 KiB
C++
146 lines
4.5 KiB
C++
//===========================================================================//
|
|
// File: AudioRenderer.cpp //
|
|
// Project: MUNGA Brick: Video Renderer //
|
|
// Contents: Abstracted Base Video Renderer //
|
|
//---------------------------------------------------------------------------//
|
|
// Date Who Modification //
|
|
// -------- --- ---------------------------------------------------------- //
|
|
// 03/04/97 JTR Initial coding. //
|
|
//---------------------------------------------------------------------------//
|
|
// Copyright (C) 1997, Virtual World Entertainment, Inc. //
|
|
// All Rights reserved worldwide //
|
|
// This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL //
|
|
//===========================================================================//
|
|
|
|
#include "AdeptHeaders.hpp"
|
|
#include "SpatializedChannel.hpp"
|
|
#include "SpatializedCommand.hpp"
|
|
#include "AudioRenderer.hpp"
|
|
#include "Interface.hpp"
|
|
|
|
//##########################################################################
|
|
//############################ SpatializedChannel ##########################
|
|
//##########################################################################
|
|
|
|
SpatializedChannel::ClassData* SpatializedChannel::DefaultData = NULL;
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void SpatializedChannel::InitializeClass()
|
|
{
|
|
Verify(!DefaultData);
|
|
DefaultData =
|
|
new ClassData(
|
|
SpatializedChannelClassID,
|
|
"Adept::SpatializedChannel",
|
|
BaseClass::DefaultData
|
|
);
|
|
Register_Object(DefaultData);
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void SpatializedChannel::TerminateClass()
|
|
{
|
|
Unregister_Object(DefaultData);
|
|
delete DefaultData;
|
|
DefaultData = NULL;
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void SpatializedChannel::TestInstance() const
|
|
{
|
|
Verify(IsDerivedFrom(DefaultData));
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
SpatializedChannel::SpatializedChannel(ClassData *class_data, int channel, int type):
|
|
AudioChannel(class_data, channel, type, SpatializedProperties)
|
|
{
|
|
Check_Object(this);
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
SpatializedChannel::~SpatializedChannel()
|
|
{
|
|
Check_Object(this);
|
|
Stop();
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void SpatializedChannel::Activate(AudioCommand *command)
|
|
{
|
|
Check_Object(this);
|
|
Verify(m_sample->m_3D);
|
|
|
|
//
|
|
//------------------------------
|
|
// Set the position and velocity
|
|
//------------------------------
|
|
//
|
|
SetPosition(Cast_Object(SpatializedCommand*, command)->GetPosition());
|
|
SetBearing();
|
|
BaseClass::Activate(command);
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void SpatializedChannel::Execute(Stuff::Time till)
|
|
{
|
|
Check_Object(this);
|
|
Verify(m_playMode != gosAudio_Stop);
|
|
Verify(m_sample->m_3D);
|
|
AUDIO_RENDER("Execute::SpatializedChannel");
|
|
|
|
//
|
|
//-----------------------------------------
|
|
// If we have stopped, deactivate the sound
|
|
//-----------------------------------------
|
|
//
|
|
gosAudio_PlayMode play_mode = gosAudio_GetChannelPlayMode(m_channel);
|
|
switch (play_mode)
|
|
{
|
|
case gosAudio_Pause:
|
|
return;
|
|
|
|
case gosAudio_Stop:
|
|
if (m_playMode == gosAudio_Loop)
|
|
{
|
|
gosAudio_SetChannelPlayMode(m_channel, m_playMode);
|
|
goto Still_Playing;
|
|
}
|
|
Deactivate();
|
|
break;
|
|
|
|
//
|
|
//----------------------------------------------
|
|
// Otherwise, compute our new bearing to the ear
|
|
//----------------------------------------------
|
|
//
|
|
default:
|
|
Verify(m_playMode == play_mode);
|
|
Still_Playing:
|
|
SetBearing();
|
|
SpatializedCommand *command = Cast_Object(SpatializedCommand*, m_command);
|
|
if (m_bearing.range<command->m_nearClip || m_bearing.range>command->m_farClip)
|
|
Stop();
|
|
}
|
|
}
|
|
|
|
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
//
|
|
void SpatializedChannel::SetBearing()
|
|
{
|
|
Check_Object(this);
|
|
|
|
LinearMatrix4D ear_to_world = AudioRenderer::Instance->GetInterface()->GetLocalToWorld();
|
|
Point3D ear_in_world(ear_to_world);
|
|
Vector3D ear_to_command;
|
|
ear_to_command.Subtract(m_position, ear_in_world);
|
|
m_bearing = ear_to_command;
|
|
}
|