Files
firestorm/Gameleap/code/mw4/Libraries/Adept/SpatializedChannel.cpp
T
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

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;
}