2002-10-12 11:37:38 +00:00
/*
* Value . h : interface for the CValue class .
* $ Id $
* Copyright ( c ) 1996 - 2000 Erwin Coumans < coockie @ acm . org >
*
* Permission to use , copy , modify , distribute and sell this software
* and its documentation for any purpose is hereby granted without fee ,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation . Erwin Coumans makes no
* representations about the suitability of this software for any
* purpose . It is provided " as is " without express or implied warranty .
*
*/
2010-09-15 16:13:32 +00:00
# if defined(WIN32) && !defined(FREE_WINDOWS)
2002-10-12 11:37:38 +00:00
# pragma warning (disable:4786)
# endif //WIN32
/////////////////////////////////////////////////////////////////////////////////////
//// Baseclass CValue
//// Together with CExpression, CValue and it's derived classes can be used to
//// parse expressions into a parsetree with error detecting/correcting capabilities
//// also expandible by a CFactory pluginsystem
////
//// Features:
//// Reference Counting (AddRef() / Release())
//// Calculations (Calc() / CalcFinal())
//// Configuration (Configure())
//// Serialization (EdSerialize() / EdIdSerialize() / EdPtrSerialize() and macro PLUGIN_DECLARE_SERIAL
//// Property system (SetProperty() / GetProperty() / FindIdentifier())
//// Replication (GetReplica())
//// Flags (IsSelected() / IsModified() / SetSelected()...)
////
//// Some small editor-specific things added
//// A helperclass CompressorArchive handles the serialization
////
/////////////////////////////////////////////////////////////////////////////////////
# ifndef __VALUE_H__
# define __VALUE_H__
# include <map> // array functionality for the propertylist
# include "STR_String.h" // STR_String class
2009-08-18 15:37:31 +00:00
# ifdef WITH_CXX_GUARDEDALLOC
# include "MEM_guardedalloc.h"
# endif
2002-10-12 11:37:38 +00:00
# ifndef GEN_NO_ASSERT
# undef assert
# define assert(exp) ((void)NULL)
# endif
# ifndef GEN_NO_TRACE
# undef trace
# define trace(exp) ((void)NULL)
# endif
# ifndef GEN_NO_DEBUG
# undef debug
# define debug(exp) ((void)NULL)
# endif
# ifndef GEN_NO_ASSERTD
# undef assertd
# define assertd(exp) ((void)NULL)
# endif
# ifndef USE_PRAGMA_ONCE
# ifdef WIN32
# pragma once
# endif //WIN32
# endif
# define EDITOR_LEVEL_VERSION 0x06
enum VALUE_OPERATOR {
2009-03-11 22:11:52 +00:00
VALUE_MOD_OPERATOR , // %
2002-10-12 11:37:38 +00:00
VALUE_ADD_OPERATOR , // +
VALUE_SUB_OPERATOR , // -
VALUE_MUL_OPERATOR , // *
VALUE_DIV_OPERATOR , // /
VALUE_NEG_OPERATOR , // -
VALUE_POS_OPERATOR , // +
VALUE_AND_OPERATOR , // &&
VALUE_OR_OPERATOR , // ||
VALUE_EQL_OPERATOR , // ==
VALUE_NEQ_OPERATOR , // !=
VALUE_GRE_OPERATOR , // >
VALUE_LES_OPERATOR , // <
VALUE_GEQ_OPERATOR , // >=
VALUE_LEQ_OPERATOR , // <=
VALUE_NOT_OPERATOR , // !
VALUE_NO_OPERATOR // no operation at all
} ;
enum VALUE_DATA_TYPE {
VALUE_NO_TYPE , // abstract baseclass
VALUE_INT_TYPE ,
VALUE_FLOAT_TYPE ,
VALUE_STRING_TYPE ,
VALUE_BOOL_TYPE ,
VALUE_ERROR_TYPE ,
VALUE_EMPTY_TYPE ,
VALUE_SOLID_TYPE ,
VALUE_COMBISOLID_TYPE ,
VALUE_VECTOR_TYPE ,
VALUE_MENU_TYPE ,
VALUE_ACTOR_TYPE ,
VALUE_MAX_TYPE //only here to provide number of types
} ;
# ifdef _DEBUG
//extern int gRefCountValue; // debugonly variable to check if all CValue Refences are Dereferenced at programexit
# endif
struct HashableInt
{
HashableInt ( int id ) : mData ( id ) { }
unsigned long Hash ( ) const { return 0 ; } ////}gHash(&mData, sizeof(int));}
bool operator = = ( HashableInt rhs ) { return mData = = rhs . mData ; }
int mData ;
} ;
//
// Bitfield that stores the flags for each CValue derived class
//
struct ValueFlags {
ValueFlags ( ) :
Modified ( true ) ,
Selected ( false ) ,
Affected ( false ) ,
ReleaseRequested ( false ) ,
Error ( false ) ,
RefCountDisabled ( false ) ,
HasProperties ( false ) ,
HasName ( false ) ,
Visible ( true ) ,
CustomFlag1 ( false ) ,
CustomFlag2 ( false )
{
}
unsigned short Modified : 1 ;
unsigned short Selected : 1 ;
unsigned short Affected : 1 ;
unsigned short ReleaseRequested : 1 ;
unsigned short Error : 1 ;
unsigned short RefCountDisabled : 1 ;
unsigned short HasProperties : 1 ;
unsigned short HasName : 1 ;
unsigned short Visible : 1 ;
unsigned short CustomFlag1 : 1 ;
unsigned short CustomFlag2 : 1 ;
} ;
/**
* Base Class for all Actions performed on CValue ' s . Can be extended for undo / redo system in future .
*/
class CAction
{
public :
CAction ( ) {
} ;
virtual ~ CAction ( ) {
} ;
virtual void Execute ( ) const = 0 ;
2009-08-18 15:37:31 +00:00
# ifdef WITH_CXX_GUARDEDALLOC
public :
2010-06-06 01:15:44 +00:00
void * operator new ( size_t num_bytes ) { return MEM_mallocN ( num_bytes , " GE:CAction " ) ; }
2009-08-18 15:37:31 +00:00
void operator delete ( void * mem ) { MEM_freeN ( mem ) ; }
# endif
2002-10-12 11:37:38 +00:00
} ;
//
// CValue
//
// Base class for all editor functionality, flexible object type that allows
// calculations and uses reference counting for memory management.
//
//
2004-05-16 13:05:15 +00:00
2002-10-12 11:37:38 +00:00
2006-01-06 03:46:54 +00:00
2002-10-12 11:37:38 +00:00
# include "PyObjectPlus.h"
2010-10-31 04:11:39 +00:00
# ifdef WITH_PYTHON
2002-10-12 11:37:38 +00:00
# include "object.h"
2009-09-29 21:42:40 +00:00
# endif
2002-10-12 11:37:38 +00:00
class CValue : public PyObjectPlus
{
Py_Header ;
public :
enum AllocationTYPE {
STACKVALUE = 0 ,
HEAPVALUE = 1
} ;
enum DrawTYPE {
STARTFRAME = 0 ,
ENDFRAME = 1 ,
INTERFRAME = 2
} ;
// Construction / Destruction
2009-06-28 11:22:26 +00:00
CValue ( ) ;
2009-09-29 21:42:40 +00:00
2010-10-31 04:11:39 +00:00
# ifdef WITH_PYTHON
2002-10-12 11:37:38 +00:00
//static PyObject* PyMake(PyObject*,PyObject*);
2009-04-20 15:06:46 +00:00
virtual PyObject * py_repr ( void )
2002-10-12 11:37:38 +00:00
{
2009-06-29 02:25:54 +00:00
return PyUnicode_FromString ( ( const char * ) GetText ( ) ) ;
2002-10-12 11:37:38 +00:00
}
virtual PyObject * ConvertValueToPython ( ) {
return NULL ;
}
2009-06-08 20:08:19 +00:00
virtual CValue * ConvertPythonToValue ( PyObject * pyobj , const char * error_prefix ) ;
2002-10-12 11:37:38 +00:00
2009-06-08 20:08:19 +00:00
static PyObject * pyattr_get_name ( void * self , const KX_PYATTRIBUTE_DEF * attrdef ) ;
2008-06-26 12:39:06 +00:00
virtual PyObject * ConvertKeysToPython ( void ) ;
2010-10-31 04:11:39 +00:00
# endif // WITH_PYTHON
2002-10-12 11:37:38 +00:00
// Expression Calculation
virtual CValue * Calc ( VALUE_OPERATOR op , CValue * val ) = 0 ;
virtual CValue * CalcFinal ( VALUE_DATA_TYPE dtype , VALUE_OPERATOR op , CValue * val ) = 0 ;
virtual void SetOwnerExpression ( class CExpression * expr ) ;
void Execute ( const CAction & a )
{
a . Execute ( ) ;
} ;
/// Reference Counting
2009-06-08 20:08:19 +00:00
int GetRefCount ( )
{
return m_refcount ;
}
// Add a reference to this value
CValue * AddRef ( )
{
// Increase global reference count, used to see at the end of the program
// if all CValue-derived classes have been dereferenced to 0
//debug(gRefCountValue++);
# ifdef _DEBUG
//gRefCountValue++;
# endif
m_refcount + + ;
return this ;
}
// Release a reference to this value (when reference count reaches 0, the value is removed from the heap)
int Release ( )
{
// Decrease global reference count, used to see at the end of the program
// if all CValue-derived classes have been dereferenced to 0
//debug(gRefCountValue--);
# ifdef _DEBUG
//gRefCountValue--;
# endif
// Decrease local reference count, if it reaches 0 the object should be freed
if ( - - m_refcount > 0 )
{
// Reference count normal, return new reference count
return m_refcount ;
}
else
{
// Reference count reached 0, delete ourselves and return 0
// MT_assert(m_refcount==0, "Reference count reached sub-zero, object released too much");
delete this ;
return 0 ;
}
}
2002-10-12 11:37:38 +00:00
/// Property Management
virtual void SetProperty ( const STR_String & name , CValue * ioProperty ) ; // Set property <ioProperty>, overwrites and releases a previous property with the same name if needed
2009-04-20 15:06:46 +00:00
virtual void SetProperty ( const char * name , CValue * ioProperty ) ;
virtual CValue * GetProperty ( const char * inName ) ; // Get pointer to a property with name <inName>, returns NULL if there is no property named <inName>
virtual CValue * GetProperty ( const STR_String & inName ) ;
2009-06-08 20:08:19 +00:00
const STR_String & GetPropertyText ( const STR_String & inName ) ; // Get text description of property with name <inName>, returns an empty string if there is no property named <inName>
2002-10-12 11:37:38 +00:00
float GetPropertyNumber ( const STR_String & inName , float defnumber ) ;
2009-04-20 15:06:46 +00:00
virtual bool RemoveProperty ( const char * inName ) ; // Remove the property named <inName>, returns true if the property was succesfully removed, false if property was not found or could not be removed
2008-07-12 10:21:37 +00:00
virtual vector < STR_String > GetPropertyNames ( ) ;
2002-10-12 11:37:38 +00:00
virtual void ClearProperties ( ) ; // Clear all properties
virtual void SetPropertiesModified ( bool inModified ) ; // Set all properties' modified flag to <inModified>
virtual bool IsAnyPropertyModified ( ) ; // Check if any of the properties in this value have been modified
virtual CValue * GetProperty ( int inIndex ) ; // Get property number <inIndex>
virtual int GetPropertyCount ( ) ; // Get the amount of properties assiocated with this value
virtual CValue * FindIdentifier ( const STR_String & identifiername ) ;
/** Set the wireframe color of this value depending on the CSG
* operator type < op >
* @ attention : not implemented */
virtual void SetColorOperator ( VALUE_OPERATOR op ) ;
virtual const STR_String & GetText ( ) = 0 ;
2009-04-20 15:06:46 +00:00
virtual double GetNumber ( ) = 0 ;
2002-10-12 11:37:38 +00:00
double * ZeroVector ( ) { return m_sZeroVec ; } ;
virtual double * GetVector3 ( bool bGetTransformedVec = false ) ;
2009-06-08 20:08:19 +00:00
virtual STR_String & GetName ( ) = 0 ; // Retrieve the name of the value
virtual void SetName ( const char * name ) = 0 ; // Set the name of the value
2002-10-12 11:37:38 +00:00
/** Sets the value to this cvalue.
* @ attention this particular function should never be called . Why not abstract ? */
virtual void SetValue ( CValue * newval ) ;
virtual CValue * GetReplica ( ) = 0 ;
2009-06-08 20:08:19 +00:00
virtual void ProcessReplica ( ) ;
2002-10-12 11:37:38 +00:00
//virtual CValue* Copy() = 0;
STR_String op2str ( VALUE_OPERATOR op ) ;
// setting / getting flags
inline void SetSelected ( bool bSelected ) { m_ValFlags . Selected = bSelected ; }
virtual void SetModified ( bool bModified ) { m_ValFlags . Modified = bModified ; }
virtual void SetAffected ( bool bAffected = true ) { m_ValFlags . Affected = bAffected ; }
inline void SetReleaseRequested ( bool bReleaseRequested ) { m_ValFlags . ReleaseRequested = bReleaseRequested ; }
inline void SetError ( bool err ) { m_ValFlags . Error = err ; }
inline void SetVisible ( bool vis ) { m_ValFlags . Visible = vis ; }
virtual bool IsModified ( ) { return m_ValFlags . Modified ; }
inline bool IsError ( ) { return m_ValFlags . Error ; }
virtual bool IsAffected ( ) { return m_ValFlags . Affected | | m_ValFlags . Modified ; }
virtual bool IsSelected ( ) { return m_ValFlags . Selected ; }
inline bool IsReleaseRequested ( ) { return m_ValFlags . ReleaseRequested ; }
virtual bool IsVisible ( ) { return m_ValFlags . Visible ; }
virtual void SetCustomFlag1 ( bool bCustomFlag ) { m_ValFlags . CustomFlag1 = bCustomFlag ; } ;
virtual bool IsCustomFlag1 ( ) { return m_ValFlags . CustomFlag1 ; } ;
virtual void SetCustomFlag2 ( bool bCustomFlag ) { m_ValFlags . CustomFlag2 = bCustomFlag ; } ;
virtual bool IsCustomFlag2 ( ) { return m_ValFlags . CustomFlag2 ; } ;
2009-06-08 20:08:19 +00:00
2002-10-12 11:37:38 +00:00
protected :
virtual void DisableRefCount ( ) ; // Disable reference counting for this value
2009-06-08 20:08:19 +00:00
//virtual void AddDataToReplica(CValue* replica);
2002-10-12 11:37:38 +00:00
virtual ~ CValue ( ) ;
2006-01-06 03:46:54 +00:00
private :
2002-10-12 11:37:38 +00:00
// Member variables
2003-12-01 15:01:20 +00:00
std : : map < STR_String , CValue * > * m_pNamedPropertyArray ; // Properties for user/game etc
2002-10-12 11:37:38 +00:00
ValueFlags m_ValFlags ; // Frequently used flags in a bitfield (low memoryusage)
int m_refcount ; // Reference Counter
static double m_sZeroVec [ 3 ] ;
} ;
//
// Declare a CValue or CExpression or CWhatever to be serialized by the editor.
//
// This macro introduces the EdSerialize() function (which must be implemented by
// the client) and the EdIdSerialize() function (which is implemented by this macro).
//
// The generated Copy() function returns a pointer to <root_base_class_name> type
// of object. So, for *any* CValue-derived object this should be set to CValue,
// for *any* CExpression-derived object this should be set to CExpression.
//
# define PLUGIN_DECLARE_SERIAL(class_name, root_base_class_name) \
public : \
virtual root_base_class_name * Copy ( ) { return new class_name ; } \
virtual bool EdSerialize ( CompressorArchive & arch , class CFactoryManager * facmgr , bool bIsStoring ) ; \
virtual bool EdIdSerialize ( CompressorArchive & arch , class CFactoryManager * facmgr , bool bIsStoring ) \
{ \
if ( bIsStoring ) \
arch . StoreString ( # class_name ) ; \
\
return false ; \
} \
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// CPropValue is a CValue derived class, that implements the identification (String name)
// SetName() / GetName(),
// normal classes should derive from CPropValue, real lightweight classes straight from CValue
class CPropValue : public CValue
{
public :
2009-06-28 11:22:26 +00:00
CPropValue ( ) :
CValue ( ) ,
2009-06-08 20:08:19 +00:00
m_strNewName ( )
2002-10-12 11:37:38 +00:00
{
}
virtual ~ CPropValue ( )
{
}
2009-06-08 20:08:19 +00:00
virtual void SetName ( const char * name ) {
m_strNewName = name ;
2002-10-12 11:37:38 +00:00
}
2009-06-08 20:08:19 +00:00
virtual STR_String & GetName ( ) {
2002-10-12 11:37:38 +00:00
//STR_String namefromprop = GetPropertyText("Name");
//if (namefromprop.Length() > 0)
// return namefromprop;
2009-06-08 20:08:19 +00:00
return m_strNewName ;
2002-10-12 11:37:38 +00:00
} ; // name of Value
protected :
2009-06-08 20:08:19 +00:00
STR_String m_strNewName ; // Identification
2009-08-18 15:37:31 +00:00
# ifdef WITH_CXX_GUARDEDALLOC
public :
2010-06-06 01:15:44 +00:00
void * operator new ( size_t num_bytes ) { return MEM_mallocN ( num_bytes , " GE:CPropValue " ) ; }
2009-08-18 15:37:31 +00:00
void operator delete ( void * mem ) { MEM_freeN ( mem ) ; }
# endif
2002-10-12 11:37:38 +00:00
} ;
# endif // !defined _VALUEBASECLASS_H
2002-10-30 02:07:20 +00:00