123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- //-----------------------------------------------------------------------------
- // 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.
- //-----------------------------------------------------------------------------
- #include "gfx/video/theoraTextureObject.h"
- #include "console/engineAPI.h"
- #include "platform/platform.h"
- #include "sfx/sfxTypes.h"
- #ifdef TORQUE_OGGTHEORA
- IMPLEMENT_CONOBJECT( TheoraTextureObject );
- ConsoleDocClass( TheoraTextureObject,
- "@brief Definition of a named texture target playing a Theora video.\n\n"
- "TheoraTextureObject defines a named texture target that may play back a Theora video. This texture "
- "target can, for example, be used by materials to texture objects with videos.\n\n"
- "@tsexample\n"
- "// The object that provides the video texture and controls its playback.\n"
- "singleton TheoraTextureObject( TheVideo )\n"
- "{\n"
- " // Unique name for the texture target for referencing in materials.\n"
- " texTargetName = \"video\";\n"
- "\n"
- " // Path to the video file.\n"
- " theoraFile = \"./MyVideo.ogv\";\n"
- "};\n"
- "\n"
- "// Material that uses the video texture.\n"
- "singleton Material( TheVideoMaterial )\n"
- "{\n"
- " // This has to reference the named texture target defined by the\n"
- " // TheoraTextureObject's 'texTargetName' property. Prefix with '#' to\n"
- " // identify as texture target reference.\n"
- " diffuseMap[ 0 ] = \"#video\";\n"
- "};\n"
- "@endtsexample\n"
- "\n"
- "@ingroup Rendering"
- );
- //-----------------------------------------------------------------------------
- TheoraTextureObject::TheoraTextureObject()
- : mSFXDescription( NULL )
- {
- mIsPlaying = false;
- mLoop = false;
- mTexTarget.getTextureDelegate().bind( this, &TheoraTextureObject::_texDelegate );
- }
- //-----------------------------------------------------------------------------
- void TheoraTextureObject::initPersistFields()
- {
- addGroup( "Theora" );
- addField( "theoraFile", TypeStringFilename, Offset( mFilename, TheoraTextureObject ),
- "Theora video file to play." );
- addField( "texTargetName", TypeRealString, Offset( mTexTargetName, TheoraTextureObject ),
- "Name of the texture target by which the texture can be referenced in materials." );
- addField( "sfxDescription", TypeSFXDescriptionName, Offset( mSFXDescription, TheoraTextureObject ),
- "Sound description to use for the video's audio channel.\n\n"
- "If not set, will use a default one." );
- addField( "loop", TypeBool, Offset( mLoop, TheoraTextureObject ),
- "Should the video loop." );
- endGroup( "Theora" );
- Parent::initPersistFields();
- }
- //-----------------------------------------------------------------------------
- GFXTextureObject* TheoraTextureObject::_texDelegate( U32 index )
- {
- // Refresh the video texture state.
- mTheoraTexture.refresh();
- // No texture if not playing.
- if( !mTheoraTexture.isPlaying() )
- {
- // Was this video playing and should it loop?
- if(mIsPlaying && mLoop)
- {
- play();
- // It won't be ready this frame
- return NULL;
- }
- else
- {
- mIsPlaying = false;
- return NULL;
- }
- }
- // Return the Theora video texture for the current frame.
- return mTheoraTexture.getTexture();
- }
- //-----------------------------------------------------------------------------
- bool TheoraTextureObject::onAdd()
- {
- if( !Parent::onAdd() )
- return false;
- if( mFilename == StringTable->EmptyString())
- {
- Con::errorf( "TheoraTextureObject::onAdd - 'filename' must be set" );
- return false;
- }
- if( mTexTargetName.isEmpty() )
- {
- Con::errorf( "TheoraTextureObject::onAdd - 'texTargetName' not set" );
- return false;
- }
- if( !mTexTarget.registerWithName( mTexTargetName ) )
- {
- Con::errorf( "TheoraTextureObject::onAdd - Could not register texture target '%s", mTexTargetName.c_str() );
- return false;
- }
- return true;
- }
- //-----------------------------------------------------------------------------
- void TheoraTextureObject::onRemove()
- {
- // Stop playback if it's running.
- mTheoraTexture.stop();
- // Unregister the texture target.
- mTexTarget.unregister();
- Parent::onRemove();
- }
- //-----------------------------------------------------------------------------
- void TheoraTextureObject::play()
- {
- if( mTheoraTexture.getFilename().isEmpty() || mTheoraTexture.getFilename() != String(mFilename) )
- {
- if( !mTheoraTexture.setFile( mFilename, mSFXDescription ) )
- {
- Con::errorf( "TheoraTextureObject::play - Could not load video '%s'", mFilename );
- return;
- }
- }
- mIsPlaying = true;
- mTheoraTexture.play();
- }
- //=============================================================================
- // Console API.
- //=============================================================================
- // MARK: ---- Console API ----
- //-----------------------------------------------------------------------------
- DefineEngineMethod( TheoraTextureObject, play, void, (),,
- "Start playback of the video." )
- {
- object->play();
- }
- //-----------------------------------------------------------------------------
- DefineEngineMethod( TheoraTextureObject, stop, void, (),,
- "Stop playback of the video." )
- {
- object->stop();
- }
- //-----------------------------------------------------------------------------
- DefineEngineMethod( TheoraTextureObject, pause, void, (),,
- "Pause playback of the video." )
- {
- object->pause();
- }
- #endif // TORQUE_OGGTHEORA
|