00001 /* 00002 File: SLContext.h 00003 00004 Function: State machine for rendering a scene. You can add attributes 00005 to the context, and also push & pop the current context. 00006 00007 Author(s): Andrew Willmott 00008 00009 Copyright: (c) 1995-2000, Andrew Willmott 00010 */ 00011 00012 #ifndef __SLContext__ 00013 #define __SLContext__ 00014 00015 00016 #include "cl/NArray.h" 00017 #include <iostream.h> 00018 00019 00020 #define SC_GET(X) ((sc ## X *) context->Get(a ## X)) 00021 // shorthand for fetch & cast: assumes existance of a local variable 00022 // context pointing to the current context. 00023 00024 00025 // --- Attribute types & definition ------------------------------------------- 00026 00027 // We don't store the attributes themselves. Instead we store pointers 00028 // to attributes that reside in the scene tree. 00029 // We also define daemons that can be installed to process attributes as they 00030 // are encountered. 00031 00032 typedef Int AttrType; 00033 typedef Void *AttrPtr; 00034 00035 class AttrDaemon 00036 { 00037 public: 00038 00039 virtual Void Set(AttrPtr attrPtr) = 0; 00040 virtual AttrPtr Get() = 0; 00041 virtual Void Save() = 0; 00042 virtual Void Restore() = 0; 00043 }; 00044 00045 class AttrRec 00046 { 00047 public: 00048 union 00049 { 00050 AttrPtr data; 00051 AttrDaemon *daemon; 00052 }; 00053 UInt16 level; // level at which it was last set 00054 }; 00055 00056 class AttrStackRec 00057 { 00058 public: 00059 AttrRec attrRec; 00060 AttrType attrType; 00061 }; 00062 00063 ostream &operator << (ostream &s, const AttrRec &ar); 00064 ostream &operator << (ostream &s, const AttrStackRec &asr); 00065 00066 typedef NArray<AttrRec> AttrList; 00067 typedef NArray<AttrStackRec> AttrStackList; 00068 00069 00070 // --- The SLContext class ---------------------------------------------------- 00071 00072 00073 class SLContext 00074 { 00075 public: 00076 SLContext(Int maxAttributes); 00077 00078 AttrPtr Get(AttrType attrType); 00080 Void Set(AttrType attrType, AttrPtr attrPtr); 00082 Void SetDaemon(AttrType attrType, AttrDaemon *daemon); 00083 00084 Bool IsCurrent(AttrType attrType); 00085 00086 Void Push(); 00087 Void Pop(); 00088 Void Clear(); 00089 00090 protected: 00091 AttrList attributeList; 00092 AttrStackList attributeStack; 00093 Int level; // Current size of the (pseudo) stack 00094 00095 friend ostream &operator << (ostream &s, const SLContext &ctx); 00096 }; 00097 00098 00099 #endif