Main Page Class Hierarchy Compound List File List Compound Members File Members

Scene.h

Go to the documentation of this file.
00001 /*
00002 File: Scene.h
00003 
00004 Function: Basic definitions for a scene and its constituent objects:
00005 attributes (for setting state variables such as colour),
00006 primitives (drawing) and groups (aggregates of primitives).
00007 
00008 Author(s): Andrew Willmott
00009 
00010 Copyright: (c) 1995-2000, Andrew Willmott
00011 */
00012 
00013 #ifndef __Scene__
00014 #define __Scene__
00015 
00016 #include "cl/ObjArray.h"
00017 #include "gcl/Renderer.h"
00018 #include "gcl/SLContext.h"
00019 
00020 // --- Basic Object types -----------------------------------------------------
00021 
00022 
00023  enum scAttributeID
00024 {
00025 // -- attributes -------//
00026 aState = 1, // general state variables 
00027 aColour, // a colour/reflectance value
00028 aEmittance, // an emittance value
00029 
00030 aPoints, // a list of points
00031 aColours, // a list of colours
00032 aNormals, // a list of normals
00033 aCoords, // a list of texture coordinates
00034 
00035 aPointIndexes, // indexes into a point list.
00036 aNormalIndexes, // indexes into a normal list.
00037 aCoordIndexes, // indexes into a coord list.
00038 aColourIndexes, // indexes of vertex colour attributes.
00039 
00040 aFaceIndexes, // list of index ranges per face
00041 aMeshType, // are our faces polygons, triangle lists, tri strips...
00042 
00043 aTransform, // a transformation
00044 aCamera, // scene camera (i.e., projection kind)
00045 aTexture, // scene texture map
00046 aObjHide, // set if objects should be off
00047 aAvarList, // a list of avar values
00048 // -- end of list ------//
00049 aNumAttributes 
00050 };
00051 
00052  enum scPrimitiveID
00053 {
00054 // -- primitives -------//
00055 pGroup = 1,
00056 pPoly,
00057 pSphere,
00058 pCylinder,
00059 pCone,
00060 pTetrahedron,
00061 pMRModel, 
00062 pExtension, 
00063 // -- end of list ------//
00064 pNumPrimitives
00065 };
00066 
00067 class Avar;
00068 
00069 // --- Scene decimation -------------------------------------------------------
00070 
00071  enum DecFlags
00072 {
00073 DecTris = 0x0001, // triangulate polys
00074 DecQuads = 0x0002, // pass through parallelograms
00075 DecUseMaster = 0x0004, // generate a single, master point list
00076 DecIgnoreMRM = 0x0008, // ignore multiresolution models
00077 DecIsMRM = 0x0010 // this is a mr model triangle
00078 };
00079 
00080  enum DecStatus
00081 {
00082 DEC_Start = -1,
00083 DEC_End = -2
00084 };
00085 
00086  struct Decimator
00087 {
00088 virtual Void HandlePoly(
00089 Int numVertices, // # vertices in this polygon
00090 Int vertices[], // vertex indicies
00091 Int materialChanged // has the material changed
00092 ) = 0;
00093 
00094  Int decNum; // increases by 1 with each DecCallback
00095  Int pointsAccNum; // points offset
00096  Transform transAcc; // current model transform
00097  PointList *pointsAcc; // master points list if requested
00098  SLContext *context; // current context for this polygon
00099  Flags32 flags;
00100 };
00101 
00102  struct FindDecInfo : public Decimator
00103 {
00104 Void HandlePoly(Int numVerts, Int vertices[], Int materialChanged);
00105 
00106  Int numTris;
00107  Int numQuads;
00108  Int numPolys;
00109  Int numProps;
00110 };
00111 
00112 
00113 // --- Fundamental scene objects ----------------------------------------------
00114 
00115  #define SO_GET(X) ((sc ## X *) Get(a ## X)) 
00116 // shorthand for fetch & cast attribute...
00117 
00118 class scObject;
00119 class scGroup;
00120 class scSceneAction;
00121  typedef scObject *scObjectPtr;
00122 
00123  class scObject : public Object
00124 {
00125 public:
00126 
00127  scObject() : Object(), itsType(0) {};
00128  scObject(Int itsType) : Object(), itsType(itsType) {};
00129  scObject(const scObject &so) : Object(), itsType(so.itsType) {};
00130 virtual ~scObject();
00131 
00132 virtual Void Apply(const Transform &m);
00133 // Transform the object
00134 Void ApplyAction(scSceneAction &a);
00135 // Apply action to object
00136 virtual Void ApplyActionSelf(scSceneAction &a);
00137 // Internal routine for the above. 
00138 Void Print(ostream &s) const;
00139 virtual Void HierPrint(ostream &s, Int indent) const;
00140 
00141 Void Decimate(Decimator &dec, UInt32 flags);
00142  virtual Void DecimateSelf(Decimator &dec) {};
00143 
00144  Object *Clone() const { return new scObject(SELF); };
00145  Bool IsPrim() const { return(itsType > 0); };
00146  Bool IsAttr() const { return(itsType < 0); };
00147  Bool IsGroup() const { return(itsType == pGroup); };
00148  scPrimitiveID PrimID() const { return(scPrimitiveID) itsType; };
00149  scAttributeID AttrID() const { return(scAttributeID) -itsType; };
00150 
00151 protected:
00152  Int itsType;
00153 // -ve == attribute, +ve == primitive.
00154  static Int prIndent;
00155 // indent in printing
00156 };
00157 
00158  #define PrimCast(x) ((scPrimitive *) (scObject *) x)
00159  #define AttrCast(x) ((scAttribute *) (scObject *) x)
00160  #define GroupCast(x) ((scGroup *) x)
00161 
00162  class scAttribute : public scObject
00163 { 
00164 public:
00165  scAttribute(AttrType attrType) : scObject(-attrType) {};
00166  scAttribute(const scAttribute &sa) : scObject(sa) {};
00167 
00168 virtual Void AddToContext(SLContext *context);
00169 // Add this attribute to the context
00170 virtual Bool HasAvar(Avar &avar, Int slot);
00171 // returns true (and sets avar) if the attribute
00172 // is avar-controlled.
00173 Void Print(ostream &s) const;
00174 
00175  Object *Clone() const { return new scAttribute(SELF); };
00176 };
00177 
00178  class scClearAttr : public scAttribute
00179 // Signals end of influence of a particular attribute.
00180 { 
00181 public:
00182  scClearAttr(AttrType attrType) : scAttribute(attrType) {};
00183 
00184 Void AddToContext(SLContext *context);
00185 
00186 Void Print(ostream &s) const;
00187 
00188  Object *Clone() const { return new scClearAttr(SELF); };
00189 };
00190 
00191 
00192  class scPrimitive : public scObject, public Renderable
00193 { 
00194 public:
00195 
00196  scPrimitive(scPrimitiveID primType) : scObject(primType), parent(0) {};
00197  scPrimitive(const scPrimitive &sp) : scObject(sp), parent(sp.parent) {};
00198 
00199 Void Draw(Renderer &r); 
00200 virtual Void Draw(Renderer &r, SLContext *context);
00201 Void Print(ostream &s) const;
00202 
00203 Void Normalise();
00204 // re-scale scene to fit in unit cube.
00205 Void FindBounds(Point &min, Point &max);
00206 virtual Void UpdateBounds(Point &min, Point &max, 
00207 const Transform &t);
00208 
00209 Void Apply(const Transform &m);
00210 virtual Void Set(scAttribute *sa);
00211 virtual scAttribute *Get(scAttributeID id);
00212 virtual scAttribute *FindFirst(scAttributeID id);
00213 
00214  virtual StrConst Label() const { return "unknown primitive"; }; 
00215  Object *Clone() const { return new scPrimitive(SELF); };
00216  scGroup *parent;
00217 
00218 Void ExtDispatch(Int method, Void *data);
00219 // for later extensions
00220 
00221  static RenderStyle sRenderStyle;
00222  static Colour sDefaultColour;
00223 
00224 private:
00225 scPrimitive() {};
00226 Void *extData;
00227 };
00228 
00229 
00230 // --- Group object -----------------------------------------------------------
00231 
00232 
00233  class scGroup : public scPrimitive
00234 {
00235 public:
00236  scGroup() : scPrimitive(pGroup), children(), 
00237 name("unknown") {};
00238  scGroup(StrConst name) : scPrimitive(pGroup), children(), 
00239 name(name) {};
00240 scGroup(const scGroup &sg);
00241 
00242 Void Apply(const Transform &m);
00243 Void ApplyActionSelf(scSceneAction &a); 
00244 Void UpdateBounds(Point &min, Point &max,
00245 const Transform &t);
00246 
00247 Void Draw(Renderer &r, SLContext *context);
00248 Void Print(ostream &s) const;
00249 Void HierPrint(ostream &s, Int indent) const;
00250 Void Parse(istream &s);
00251 Void Set(scAttribute *sa);
00252 virtual scAttribute *FindFirst(scAttributeID id);
00253 
00254 Void DecimateSelf(Decimator &dec);
00255 
00256  scObject *Child(Int i) const 
00257 { return((scObject *) children[i]); };
00258  Int NumChildren() const 
00259 { return(children.NumItems()); };
00260 
00261 Void SetName(StrConst name);
00262 
00263 Void Add(scObject *so);
00264 scObject *Last();
00265 StrConst Label() const; 
00266 Object *Clone() const;
00267 
00268  String name;
00269  ObjArray children;
00270 };
00271 
00272 
00273 // --- Typedefs ---------------------------------------------------------------
00274 
00275 
00276  typedef scGroup scScene;
00277  typedef scScene *scScenePtr;
00278  typedef ObjArray scObjectList;
00279 
00280 ostream &operator << (ostream &s, const scScenePtr scene);
00281 
00282 // --- Actions ----------------------------------------------------------------
00283 
00284  class scSceneAction
00285 {
00286 public:
00287  scSceneAction() : context(0) {};
00288 
00289 virtual Void Start();
00290 virtual Void Stop();
00291 
00292 virtual Void Primitive(scPrimitive *sp);
00293 virtual Void Attribute(scAttribute *sa);
00294 
00295  SLContext *context;
00296  Transform transAcc; // XXX should be part of context one of these
00297 // days
00298 };
00299 
00300 #endif

Generated at Sat Aug 5 00:17:03 2000 for Graphics Class Library by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000

AltStyle によって変換されたページ (->オリジナル) /