CEL

Public API Reference

celtool/stdpcimp.h
00001 /*
00002     Crystal Space Entity Layer
00003     Copyright (C) 2001 by Jorrit Tyberghein
00004   
00005     This library is free software; you can redistribute it and/or
00006     modify it under the terms of the GNU Library General Public
00007     License as published by the Free Software Foundation; either
00008     version 2 of the License, or (at your option) any later version.
00009   
00010     This library is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013     Library General Public License for more details.
00014   
00015     You should have received a copy of the GNU Library General Public
00016     License along with this library; if not, write to the Free
00017     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00018 */
00019 
00020 #ifndef __CEL_CELTOOL_STDPC__
00021 #define __CEL_CELTOOL_STDPC__
00022 
00023 #include "cstypes.h"
00024 #include "iutil/comp.h"
00025 #include "iutil/objreg.h"
00026 #include "ivaria/reporter.h"
00027 #include "csutil/csobject.h"
00028 #include "csutil/scf.h"
00029 #include "csutil/scf_implementation.h"
00030 #include "csutil/refarr.h"
00031 #include "csutil/weakref.h"
00032 
00033 #include "celtool/celtoolextern.h"
00034 
00035 #include "physicallayer/propchg.h"
00036 #include "physicallayer/propclas.h"
00037 #include "physicallayer/propfact.h"
00038 #include "physicallayer/pl.h"
00039 #include "physicallayer/messaging.h"
00040 
00041 struct iCelEntity;
00042 struct iObjectRegistry;
00043 
00044 
00045 struct Property
00046 {
00047   csStringID            id;
00048   celDataType           datatype;
00049   bool                  readonly;
00050   const char*           desc;
00051   Property () : id (csInvalidStringID) { }
00052 };
00053 
00059 struct PropertyHolder
00060 {
00061   Property* properties;
00062   size_t propertycount;
00063   // Set to true if we have done an action.
00064   bool actions_done;
00065   // The mask that we will use to listen for messages.
00066   csString mask;
00067 
00072   csHash<int, csStringID> constants;
00073 
00078   csHash<int, csStringID> new_constants;
00079 
00080   PropertyHolder () : properties (0), propertycount (0), actions_done (false)
00081   { }
00082   ~PropertyHolder () { delete[] properties; }
00083   void SetCount (int cnt)
00084   {
00085     if (properties) return;
00086     propertycount = cnt;
00087     properties = new Property[cnt];
00088   }
00089 };
00090 
00096 class CEL_CELTOOL_EXPORT celPcCommon
00097   : public scfImplementation4<celPcCommon, iCelPropertyClass, iCelTimerListener,
00098     iMessageSender,iMessageReceiver>
00099 {
00100 private:
00101   csRefArray<iCelPropertyChangeCallback> callbacks;
00102   // This flag is true if we currently don't know the state of
00103   // the sibling property classes (property classes in the same
00104   // entity). It is set to true by PropertyClassesHaveChanged()
00105   // and cleared by HavePropertyClassesChanged().
00106   bool propclasses_dirty;
00107   csString tag;
00108   // the name of the property class stored in the iObject
00109   csObject csobj;
00110 
00111   static csStringID id_tag;
00112   static csStringID id_name;
00113   static csStringID id_value;
00114 
00115 protected:
00116   iCelEntity* entity;
00117   iObjectRegistry* object_reg;
00118   csWeakRef<iCelPlLayer> pl;
00119 
00120 protected:
00121   void FirePropertyChangeCallback (int propertyId);
00122 
00126   void SetActionMask (const char* mask);
00127 
00131   void AddAction (int idx, const char* id)
00132   {
00133     propholder->actions_done = true;
00134     propholder->constants.Put (pl->FetchStringID (id), idx);
00135     csString newid = propholder->mask;
00136     CS_ASSERT (newid.Length () > 0);
00137     newid += id;
00138     propholder->new_constants.Put (pl->FetchStringID (newid), idx);
00139   }
00140 
00152   void AddProperty (size_t idx, const char* id,
00153         celDataType type, bool readonly, const char* desc,
00154         void* prop)
00155   {
00156     // return if an invalid index was specified
00157     if (idx >= propholder->propertycount)
00158     {
00159       csRef<iReporter> rep = csQueryRegistry<iReporter>(object_reg);
00160       if (rep)
00161         rep->ReportError("crystalspace.cel.physicallayer",
00162             "celPcCommon::AddProperty out of bounds %zu >= %zu!",
00163             idx, propholder->propertycount);
00164       else
00165         csPrintf("Error: celPcCommon::AddProperty out of bounds %zu >= %zu!",
00166             idx, propholder->propertycount);
00167       return;
00168     }
00169     if (propdata == 0)
00170     {
00171       propdata = new void* [propholder->propertycount];
00172     }
00173     Property& pr = propholder->properties[idx];
00174     if (pr.id == csInvalidStringID)
00175     {
00176       pr.id = pl->FetchStringID (id);
00177       pr.datatype = type;
00178       pr.readonly = readonly;
00179       pr.desc = desc;
00180       propholder->constants.Put (pr.id, (int)idx);
00181     }
00182     propdata[idx] = prop;
00183   }
00184 
00185   void** propdata;
00186   PropertyHolder* propholder;
00187 
00188 private:
00189   template <class T>
00190   bool SetPropertyTemplated (csStringID propertyId, T l,
00191     celDataType type);
00192   template <class T>
00193   T GetPropertyTemplated (csStringID propertyId, celDataType type);
00194   template <class T>
00195   bool GetPropertyTemplated (csStringID propertyId, celDataType type, T& v);
00196 
00197 public:
00198   celPcCommon (iObjectRegistry* object_reg);
00199   virtual ~celPcCommon ();
00200 
00201   bool HavePropertyClassesChanged ()
00202   {
00203     if (!propclasses_dirty) return false;
00204     propclasses_dirty = false;
00205     return true;
00206   }
00207 
00208   virtual void SetTag (const char* tagname);
00209   virtual const char* GetTag () const { return tag; }
00210 
00211   virtual const char* GetName () const;
00212   virtual void SetName (const char* pcname);
00213 
00214   iObject *QueryObject ();
00215 
00216   virtual iCelEntity* GetEntity () { return entity; }
00217   virtual void SetEntity (iCelEntity* entity);
00218   virtual bool AddPropertyChangeCallback (iCelPropertyChangeCallback* cb);
00219   virtual bool RemovePropertyChangeCallback (
00220         iCelPropertyChangeCallback* cb);
00221 
00222   virtual bool SetPropertyIndexed (int, long) { return false; }
00223   virtual bool SetPropertyIndexed (int, float) { return false; }
00224   virtual bool SetPropertyIndexed (int, bool) { return false; }
00225   virtual bool SetPropertyIndexed (int, const char*) { return false; }
00226   virtual bool SetPropertyIndexed (int, const csVector2&) { return false; }
00227   virtual bool SetPropertyIndexed (int, const csVector3&) { return false; }
00228   virtual bool SetPropertyIndexed (int, const csColor&) { return false; }
00229   virtual bool SetPropertyIndexed (int, iCelPropertyClass* pclass)
00230   { return false; }
00231   virtual bool SetPropertyIndexed (int, iCelEntity* entity) { return false; }
00232   virtual bool SetPropertyIndexed (int, iBase* ibase) { return false; }
00233 
00234   virtual bool SetProperty (csStringID, long);
00235   virtual bool SetProperty (csStringID, float);
00236   virtual bool SetProperty (csStringID, bool);
00237   virtual bool SetProperty (csStringID, const char*);
00238   virtual bool SetProperty (csStringID, const csVector2&);
00239   virtual bool SetProperty (csStringID, const csVector3&);
00240   virtual bool SetProperty (csStringID, const csColor&);
00241   virtual bool SetProperty (csStringID, iCelPropertyClass* pclass);
00242   virtual bool SetProperty (csStringID, iCelEntity* entity);
00243   virtual bool SetProperty (csStringID, iBase* ibase);
00244 
00245   virtual bool GetPropertyIndexed (int, long& l) { return false; }
00246   virtual bool GetPropertyIndexed (int, float& f) { return false; }
00247   virtual bool GetPropertyIndexed (int, bool& b) { return false; }
00248   virtual bool GetPropertyIndexed (int, const char*&) { return false; }
00249   virtual bool GetPropertyIndexed (int, csVector2&) { return false; }
00250   virtual bool GetPropertyIndexed (int, csVector3&) { return false; }
00251   virtual bool GetPropertyIndexed (int, csColor&) { return false; }
00252   virtual bool GetPropertyIndexed (int, iCelPropertyClass*&) { return false; }
00253   virtual bool GetPropertyIndexed (int, iCelEntity*&) { return false; }
00254   virtual bool GetPropertyIndexed (int, iBase*&) { return false; }
00255 
00256   virtual long GetPropertyLongByID (csStringID);
00257   virtual float GetPropertyFloatByID (csStringID);
00258   virtual bool GetPropertyBoolByID (csStringID);
00259   virtual const char* GetPropertyStringByID (csStringID);
00260   virtual bool GetPropertyVectorByID (csStringID, csVector2&);
00261   virtual bool GetPropertyVectorByID (csStringID, csVector3&);
00262   virtual bool GetPropertyColorByID (csStringID, csColor&);
00263   virtual iCelPropertyClass* GetPropertyPClassByID (csStringID);
00264   virtual iCelEntity* GetPropertyEntityByID (csStringID);
00265   virtual iBase* GetPropertyIBaseByID (csStringID);
00266 
00267   virtual bool PerformAction (csStringID, iCelParameterBlock*, celData& ret);
00268   virtual bool PerformActionIndexed (int, iCelParameterBlock*, celData& ret)
00269   { return false; }
00270   virtual const char* GetPropertyOrActionDescription (csStringID);
00271   virtual size_t GetPropertyAndActionCount ();
00272   virtual csStringID GetPropertyOrActionID (size_t);
00273   virtual void PropertyClassesHaveChanged ()
00274   {
00275     propclasses_dirty = true;
00276   }
00277   virtual celDataType GetPropertyOrActionType (csStringID);
00278   virtual bool IsPropertyReadOnly (csStringID);
00279 
00280   virtual csPtr<iCelDataBuffer> SaveFirstPass () { return 0; }
00281   virtual bool LoadFirstPass (iCelDataBuffer*) { return false; }
00282 
00283   virtual csPtr<iCelDataBuffer> Save () { return 0; }
00284   virtual bool Load (iCelDataBuffer* databuf) { return false; }
00285 
00286   virtual csPtr<iCelDataBuffer> GetPersistentData (
00287         celPersistenceType persistence_type)
00288     { return 0; }
00289   virtual celPersistenceResult SetPersistentData (csTicks data_time, 
00290         iCelDataBuffer* data, celPersistenceType persistence_type)
00291     { return CEL_PERSIST_RESULT_OK; };
00292 
00293   // --- For iCelTimerListener -----------------------------------------
00294   virtual void TickEveryFrame () { }
00295   virtual void TickOnce () { }
00296 
00297   // --- For iMessageSender --------------------------------------------
00298   virtual void MessageDispatcherRemoved (iMessageDispatcher* dispatcher) { }
00299 
00300   // --- For iMessageReceiver ------------------------------------------
00301   virtual bool ReceiveMessage (csStringID msg_id, iMessageSender* sender,
00302       celData& ret, iCelParameterBlock* params);
00303 };
00304 
00305 #endif // __CEL_CELTOOL_STDPC__
00306 

Generated for CEL: Crystal Entity Layer 2.0 by doxygen 1.7.6.1