/*==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==*/
//////////////////////////////////////////////////////////////////////////////
// //
// plPlates - Header file for the plates and plPlateManager //
// //
//////////////////////////////////////////////////////////////////////////////
#ifndef _plPlates_h
#define _plPlates_h
#include "hsTypes.h"
#include "hsStlUtils.h"
#include "hsColorRGBA.h"
#include "hsTemplates.h"
#include "hsUtils.h"
#include "hsMatrix44.h"
//// plPlate Class Definition ////////////////////////////////////////////////
// plPlate is the actual plate object that represents one plate on the
// screen. It has a transform matrix (which includes position, scale and
// rotation), a material, a depth value and a color that is applied to all
// four corners. All plates are parallelograms.
class plPlateManager;
class hsGMaterial;
class plMipmap;
class plBitmap;
class plPlate
{
friend class plPlateManager;
protected:
hsMatrix44 fXformMatrix;
hsGMaterial *fMaterial;
plMipmap *fMipmap;
hsScalar fDepth, fOpacity;
UInt32 fFlags;
char fTitle[ 64 ];
plPlate *fNext;
plPlate **fPrevPtr;
plPlate **fOwningHandle;
static UInt32 fMagicUniqueKeyInt;
plPlate( plPlate** owningHandle );
virtual ~plPlate();
void ILink( plPlate **back );
void IUnlink( void )
{
hsAssert( fPrevPtr, "Plate not in list" );
if( fNext )
fNext->fPrevPtr = fPrevPtr;
*fPrevPtr = fNext;
fNext = nil;
fPrevPtr = nil;
}
void ISetResourceAlphas(UInt32 colorKey);
public:
enum
{
kFlagVisible = 0x00000001,
kFlagLocalMaterial = 0x00000002,
kFlagIsAGraph = 0x00000004
};
/// Basic properties
void SetTransform( hsMatrix44 &matrix, hsBool reSort = true );
void SetMaterial( hsGMaterial *material );
void SetTexture(plBitmap *texture); // Creates a new single layer material to use the texture.
void SetTitle( const char *title ) { if( title != nil ) strncpy( fTitle, title, sizeof( fTitle ) ); else fTitle[ 0 ] = 0; }
hsGMaterial *GetMaterial( void ) { return fMaterial; }
hsMatrix44 &GetTransform( void ) { return fXformMatrix; }
const char *GetTitle( void ) { return fTitle; }
UInt32 GetFlags( void ) { return fFlags; }
const plMipmap *GetMipmap( void ) { return fMipmap; }
void SetVisible( hsBool vis ) { if( vis ) fFlags |= kFlagVisible; else fFlags &= ~kFlagVisible; }
hsBool IsVisible( void );
void SetOpacity( hsScalar opacity = 1.f );
plPlate *GetNext( void ) { return fNext; }
/// Helper functions
void SetDepth( hsScalar depth) { fDepth = depth; }
void SetPosition( hsScalar x, hsScalar y, hsScalar z = -1.0f );
void SetSize( hsScalar width, hsScalar height, bool adjustByAspectRatio = false );
plMipmap *CreateMaterial( UInt32 width, UInt32 height, hsBool withAlpha, plMipmap* texture = NULL );
void CreateFromResource( const char *resName );
void ReloadFromResource( const char *resName );
};
//// plGraphPlate Class Definition ///////////////////////////////////////////
// A derivation of plPlate that maintains a procedural texture which displays
// a scrolling graph of data.
class plGraphPlate : public plPlate
{
protected:
UInt32 fBGHexColor, fAxesHexColor, fGraphHexColor;
std::vector fDataHexColors;
UInt32 fMin, fMax, fLabelMin, fLabelMax;
std::vector fLastValues;
std::vector fLabelText;
UInt32 IMakePow2( UInt32 value );
void IDrawNumber( UInt32 number, UInt32 *dataPtr, UInt32 stride, UInt32 color );
void IDrawDigit( char digit, UInt32 *dataPtr, UInt32 stride, UInt32 color );
public:
plGraphPlate( plPlate **owningHandle );
virtual ~plGraphPlate();
void SetDataRange( UInt32 min, UInt32 max, UInt32 width );
void SetDataLabels( UInt32 min, UInt32 max );
void SetLabelText( char *text1, char *text2 = nil, char *text3 = nil, char *text4 = nil );
void SetLabelText( const std::vector & text );
void ClearData( void );
void AddData( Int32 value, Int32 value2 = -1, Int32 value3 = -1, Int32 value4 = -1 );
void AddData( std::vector values );
void SetColors( UInt32 bgHexColor = 0x80000000, UInt32 axesHexColor = 0xffffffff, UInt32 dataHexColor = 0xff00ff00, UInt32 graphHexColor = 0x80ff0000 );
void SetDataColors( UInt32 hexColor1 = 0xff00ff00, UInt32 hexColor2 = 0xff0000ff, UInt32 hexColor3 = 0xffffff00, UInt32 hexColor4 = 0xffff00ff );
void SetDataColors( const std::vector & hexColors );
const char *GetLabelText( int i ) { return fLabelText[ i ].c_str(); }
const UInt32 GetDataColor( int i ) { return fDataHexColors[ i ]; }
const UInt32 GetNumLabels() { return fLabelText.size(); }
const UInt32 GetNumColors() { return fDataHexColors.size(); }
};
//// plPlateManager Class Definition /////////////////////////////////////////
// This class handles all the plates--it keeps track of all the plates,
// creates and destroys them, and draws them when the pipeline tells it to.
class plPipeline;
class plPlateManager
{
friend class plPlate;
private:
static plPlateManager *fInstance;
protected:
plPlate *fPlates;
plPipeline *fOwner;
hsBool fCreatedSucessfully;
plPlateManager( plPipeline *pipe )
{
fInstance = this;
fPlates = nil;
fOwner = pipe;
fCreatedSucessfully = true;
}
virtual void IDrawToDevice( plPipeline *pipe ) = 0;
void IResortPlate( plPlate *plate, bool fromCurrent );
public:
virtual ~plPlateManager();
static plPlateManager &Instance( void ) { return *fInstance; }
static bool InstanceValid( void ) { return fInstance != nil; }
void CreatePlate( plPlate **handle );
void CreatePlate( plPlate **handle, hsScalar width, hsScalar height );
void CreatePlate( plPlate **handle, hsScalar x, hsScalar y, hsScalar width, hsScalar height );
void CreateGraphPlate( plGraphPlate **handle );
void DestroyPlate( plPlate *plate );
void SetPlateScreenPos( plPlate *plate, UInt32 x, UInt32 y );
void SetPlatePixelSize( plPlate *plate, UInt32 pWidth, UInt32 pHeight );
UInt32 GetPipeWidth( void );
UInt32 GetPipeHeight( void );
void DrawToDevice( plPipeline *pipe );
hsBool IsValid( void ) { return fCreatedSucessfully; }
};
// Sets the hInstance that we load our resources from. A SceneViewer hack.
void SetHInstance(void *instance);
#endif //_plPlates_h