/*==LICENSE==*
CyanWorlds.com Engine - MMOG client, server and tools
Copyright (C) 2011 Cyan Worlds, Inc.
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
You can contact Cyan Worlds, Inc. by email legal@cyan.com
or by snail mail at:
Cyan Worlds, Inc.
14617 N Newport Hwy
Mead, WA 99021
*==LICENSE==*/
#ifndef plMovieMsg_inc
#define plMovieMsg_inc
#include "../pnMessage/plMessage.h"
#include "../pnKeyedObject/plFixedKey.h"
#include "hsPoint2.h"
#include "hsTemplates.h"
class plMovieMsg : public plMessage
{
public:
enum
{
kIgnore = 0x0,
kStart = 0x1,
kPause = 0x2,
kResume = 0x4,
kStop = 0x8,
kMove = 0x10, // Call SetCenter() or default is 0,0
kScale = 0x20, // Call SetScale() or default is 1,1
kColor = 0x40, // Call SetColor() or default is 1,1,1
kVolume = 0x80, // Call SetVolume() or default is 1
kOpacity = 0x100, // Call SetOpacity() or default is 1
kColorAndOpacity = 0x200, // Call SetColor() or default is 1,1,1,1
kMake = 0x400, //Installs, but doesn't play until kStart
kAddCallbacks = 0x800, // Call AddCallback() for each callback message
kFadeIn = 0x1000, // Call SetFadeInSecs() and SetFadeInColor() or defs are 0 and 0,0,0,0
kFadeOut = 0x2000 // Call SetFadeOutSecs() and SetFadeOutColor() or defs are 0 and 0,0,0,0
};
protected:
hsPoint2 fCenter;
hsPoint2 fScale;
hsColorRGBA fColor;
hsColorRGBA fFadeInColor;
hsScalar fFadeInSecs;
hsColorRGBA fFadeOutColor;
hsScalar fFadeOutSecs;
hsScalar fVolume;
char* fFileName;
UInt16 fCmd;
hsTArray fCallbacks;
public:
plMovieMsg(const char* n, UInt16 cmd)
: plMessage(nil, nil, nil)
{
fFileName = hsStrcpy(n);
SetCmd(cmd).MakeDefault();
}
plMovieMsg() : fFileName(nil), fCmd(kIgnore)
{
MakeDefault();
}
virtual ~plMovieMsg()
{
delete [] fFileName;
int i;
for( i = 0; i < fCallbacks.GetCount(); i++ )
{
hsRefCnt_SafeUnRef(fCallbacks[i]);
}
}
CLASSNAME_REGISTER( plMovieMsg );
GETINTERFACE_ANY( plMovieMsg, plMessage );
plMovieMsg& MakeDefault()
{
SetCenter(0,0);
SetScale(1.f,1.f);
SetColor(1.f, 1.f, 1.f, 1.f);
SetFadeInSecs(0);
SetFadeInColor(0, 0, 0, 0);
SetFadeOutSecs(0);
SetFadeOutColor(0, 0, 0, 0);
SetVolume(1.f);
SetBCastFlag(kBCastByType);
return *this;
}
// Make sure you set at least one command, and set appropriate params for the command
UInt16 GetCmd() const { return fCmd; }
plMovieMsg& SetCmd(UInt16 c) { fCmd = c; return *this; }
// Center 0,0 is center of screen, 1,1 is Upper-Right, -1,-1 is Lower-Left, etc.
const hsPoint2& GetCenter() const { return fCenter; }
hsScalar GetCenterX() const { return fCenter.fX; }
hsScalar GetCenterY() const { return fCenter.fY; }
plMovieMsg& SetCenter(const hsPoint2& p) { fCenter = p; return *this; }
plMovieMsg& SetCenter(hsScalar x, hsScalar y) { fCenter.Set(x, y); return *this; }
plMovieMsg& SetCenterX(hsScalar x) { fCenter.fX = x; return *this; }
plMovieMsg& SetCenterY(hsScalar y) { fCenter.fY = y; return *this; }
// Scale of 1.0 matches movie pixel to screen pixel (whatever the resolution).
// Scale of 2.0 doubles each movie pixel across 2 screen pixels.
// Etc.
const hsPoint2& GetScale() const { return fScale; }
hsScalar GetScaleX() const { return fScale.fX; }
hsScalar GetScaleY() const { return fScale.fY; }
plMovieMsg& SetScale(const hsPoint2& p) { fScale = p; return *this; }
plMovieMsg& SetScale(hsScalar x, hsScalar y) { fScale.Set(x, y); return *this; }
plMovieMsg& SetScaleX(hsScalar x) { fScale.fX = x; return *this; }
plMovieMsg& SetScaleY(hsScalar y) { fScale.fY = y; return *this; }
// Include the movie folder, e.g. "avi/porno.bik"
// String is copied, not pointer copy.
const char* GetFileName() const { return fFileName; }
plMovieMsg& SetFileName(const char* n) { delete [] fFileName; fFileName = hsStrcpy(n); return *this; }
// Color is mostly useful for alpha fade up and down.
const hsColorRGBA& GetColor() const { return fColor; }
plMovieMsg& SetColor(const hsColorRGBA& c) { fColor = c; return *this; }
plMovieMsg& SetColor(hsScalar r, hsScalar g, hsScalar b, hsScalar a) { fColor.Set(r,g,b,a); return *this; }
plMovieMsg& SetOpacity(hsScalar a) { return SetColor(1.f, 1.f, 1.f, a); }
// Or the auto matic fades
const hsColorRGBA& GetFadeInColor() const { return fFadeInColor; }
plMovieMsg& SetFadeInColor(const hsColorRGBA& c) { fFadeInColor = c; return *this; }
plMovieMsg& SetFadeInColor(hsScalar r, hsScalar g, hsScalar b, hsScalar a) { fFadeInColor.Set(r,g,b,a); return *this; }
hsScalar GetFadeInSecs() const { return fFadeInSecs; }
plMovieMsg& SetFadeInSecs(hsScalar s) { fFadeInSecs = s; return *this; }
const hsColorRGBA& GetFadeOutColor() const { return fFadeOutColor; }
plMovieMsg& SetFadeOutColor(const hsColorRGBA& c) { fFadeOutColor = c; return *this; }
plMovieMsg& SetFadeOutColor(hsScalar r, hsScalar g, hsScalar b, hsScalar a) { fFadeOutColor.Set(r,g,b,a); return *this; }
hsScalar GetFadeOutSecs() const { return fFadeOutSecs; }
plMovieMsg& SetFadeOutSecs(hsScalar s) { fFadeOutSecs = s; return *this; }
// Volume is on scale of 0=muted to 1=full
hsScalar GetVolume() const { return fVolume; }
plMovieMsg& SetVolume(hsScalar v) { fVolume = v; return *this; }
plMovieMsg& AddCallback(plMessage* msg) { hsRefCnt_SafeRef(msg); fCallbacks.Append(msg); return *this; }
UInt32 GetNumCallbacks() const { return fCallbacks.GetCount(); }
plMessage* GetCallback(int i) const { return fCallbacks[i]; }
virtual void Read(hsStream* s, hsResMgr* mgr) { hsAssert(false, "Not for I/O"); plMessage::IMsgRead(s, mgr); }
virtual void Write(hsStream* s, hsResMgr* mgr) { hsAssert(false, "Not for I/O"); plMessage::IMsgWrite(s, mgr); }
};
#endif // plMovieMsg_inc