mirror of
https://github.com/TorqueGameEngines/Torque3D.git
synced 2026-01-20 12:44:46 +00:00
163 lines
5.5 KiB
C++
163 lines
5.5 KiB
C++
//-----------------------------------------------------------------------------
|
|
// Copyright (c) 2012 GarageGames, LLC
|
|
//
|
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
// of this software and associated documentation files (the "Software"), to
|
|
// deal in the Software without restriction, including without limitation the
|
|
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
|
// sell copies of the Software, and to permit persons to whom the Software is
|
|
// furnished to do so, subject to the following conditions:
|
|
//
|
|
// The above copyright notice and this permission notice shall be included in
|
|
// all copies or substantial portions of the Software.
|
|
//
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
|
// IN THE SOFTWARE.
|
|
//-----------------------------------------------------------------------------
|
|
|
|
#ifndef _SFXFMODPROJECT_H_
|
|
#define _SFXFMODPROJECT_H_
|
|
|
|
#ifndef _SIMDATABLOCK_H_
|
|
#include "console/simDatablock.h"
|
|
#endif
|
|
#ifndef _CONSOLETYPES_H_
|
|
#include "console/consoleTypes.h"
|
|
#endif
|
|
#ifndef _TVECTOR_H_
|
|
#include "core/util/tVector.h"
|
|
#endif
|
|
#ifndef _SFXSYSTEM_H_
|
|
#include "sfx/sfxSystem.h"
|
|
#endif
|
|
|
|
#include "fmod_event.h"
|
|
|
|
|
|
class SFXFMODEvent;
|
|
class SFXFMODEventGroup;
|
|
class SimGroup;
|
|
|
|
|
|
|
|
/// Datablock that loads an FMOD Designer project.
|
|
///
|
|
/// All events in the project are automatically made available as SFXFMODEvent track
|
|
/// datablock instances. Each event object is automatically named by substituting
|
|
/// the slashes in its fully qualified name with underscores and preprending the project
|
|
/// name to this; event 'group1/group2/event' in the SFXFMODProject instance called
|
|
/// 'project', for example, will be available as a TorqueScript object called
|
|
/// 'project_group1_group2_event'.
|
|
///
|
|
/// This class also works in a client-server environment where the server is
|
|
/// not running FMOD. The event objects are cached in an auto-generated TorqueScript
|
|
/// file alongside the .fev project file (x/y.fev -> x/y.fev.cs) which, when available
|
|
/// and up-to-date, does not require FMOD for the server-side objects to correctly
|
|
/// initialize.
|
|
///
|
|
/// To establish good loading behavior and for good memory management, it is necessary to
|
|
/// wisely distribute events to groups and to manually pre-load groups. The best solution
|
|
/// probably is to have one group of common events that is loaded during game startup and
|
|
/// then have one event group for each level in the game that is only loaded for the
|
|
/// duration of its particular level.
|
|
///
|
|
/// SFXFMODProject will propagate it's networking model to all its contents. This means
|
|
/// that if the project is a non-networked datablock, then all event groups, events, and
|
|
/// descriptions contained in the project will also be non-networked datablocks.
|
|
///
|
|
/// It usually makes the most sense to use non-networked ("client-only") datablocks as
|
|
/// otherwise the FMOD datablocks will be purged on each mission load.
|
|
///
|
|
/// @note Only one project's music data can ever be loaded at any one time.
|
|
/// Usually you wouldn't want more than a single SFXFMODProject instance in your game
|
|
/// data. Also, only a single media path can be set through the designer API so when
|
|
/// loading multiple projects, note that each project will set the media path to its
|
|
/// own directory. For data loading to work, all project thus need to be placed in
|
|
/// the same directory.
|
|
///
|
|
class SFXFMODProject : public SimDataBlock
|
|
{
|
|
public:
|
|
|
|
typedef SimDataBlock Parent;
|
|
friend class SFXFMODEventGroup; // _addGroup
|
|
friend class SFXFMODEvent; // _addEvent
|
|
|
|
protected:
|
|
|
|
///
|
|
String mFileName;
|
|
|
|
///
|
|
String mMediaPath;
|
|
|
|
///
|
|
SFXFMODEventGroup* mRootGroups;
|
|
|
|
/// A flat list of all the groups in this projet.
|
|
Vector< SFXFMODEventGroup* > mGroups;
|
|
|
|
/// A flat list of all the events in the project.
|
|
Vector< SFXFMODEvent* > mEvents;
|
|
|
|
///
|
|
FMOD_EVENTPROJECT* mHandle;
|
|
|
|
///
|
|
void _onSystemEvent( SFXSystemEventType event );
|
|
|
|
///
|
|
void _clear();
|
|
|
|
///
|
|
bool _load();
|
|
|
|
///
|
|
void _addEvent( SFXFMODEvent* event );
|
|
|
|
///
|
|
void _addGroup( SFXFMODEventGroup* group );
|
|
|
|
///
|
|
void _removeEvent( SFXFMODEvent* event );
|
|
|
|
///
|
|
void _removeGroup( SFXFMODEventGroup* group );
|
|
|
|
public:
|
|
|
|
///
|
|
SFXFMODProject();
|
|
|
|
virtual ~SFXFMODProject();
|
|
|
|
///
|
|
void acquire( bool recursive = false );
|
|
|
|
///
|
|
void release();
|
|
|
|
///
|
|
const String& getFileName() const { return mFileName; }
|
|
|
|
// SimDataBlock.
|
|
virtual bool onAdd();
|
|
virtual void onRemove();
|
|
virtual bool preload( bool server, String& errorStr );
|
|
virtual void packData( BitStream* stream );
|
|
virtual void unpackData( BitStream* stream );
|
|
|
|
static void initPersistFields();
|
|
|
|
DECLARE_CONOBJECT( SFXFMODProject );
|
|
DECLARE_CATEGORY( "SFX FMOD" );
|
|
DECLARE_DESCRIPTION( "An FMOD Designer project." );
|
|
};
|
|
|
|
#endif // !_SFXFMODPROJECT_H_
|