Smooth Levels of Detail
Programming Reference


Heinrich Hey



Bitstream & Packet Tags (Slod.h)

11110 header packet
11111 end packet
0     vertex packet
10    triangle packet
110   multi triangle packet
1110  extended packet



class SlodBitstream{
public:
   SlodBitstream* next;
   Unsigned32     noByte;
   Unsigned8*     byteList;

   void deleteBitstream();
};

Brep (Slod.h)

typedef Vector3D SlodVertex;

struct SlodTriangle{
   Unsigned32 vertexNo[4];
};

struct SlodColor{
   Float32 r,g,b;
};

typedef Vector3D SlodNormal;

struct SlodTextureCoord{
   Vector2D textureCoord[3];
};

struct SlodTexel{
   Unsigned8 r,g,b;
};



class SlodBrep{
public:
   SlodVertex*       vertexList;
   Unsigned32        noVertices;
   SlodTriangle*     triangleList;
   Unsigned32        noTriangles;
   SlodColor*        colorList;
   Unsigned32        colorType;
      #define slodBrepNoColor        0
      #define slodBrepUniformColor   1
      #define slodBrepColorPerVertex 2
   SlodNormal*       normalList;
   Boolean           withNormals;
   SlodTextureCoord* textureCoordList;
   Boolean           textured;
   Unsigned32        textureSizeX,
                     textureSizeY;
   SlodTexel*        texture;

   SlodBrep();

   void deleteLists();

   //get copy of brep corresponding to current lod
   SlodBrep* copyBrep();
};

Encoder (SlodEncoder.h, SlodEncoderIv.h)

class SlodEncoder{
public:
   SlodEncoder();
   ~SlodEncoder();

   //set brep to encode from
   void setBrep(SlodBrep& brep_);

   //encode brep to clustertree
   void generateClusterTree();

   //init decoder with brep, clustertree, parentclusterlist,
   //generate clustertree if not already done
   void initDecoder(SlodDecoder* decoder);

   //encode clustertree to bitstream with max. no. byte per bitstreampart,
   //generate clustertree if not already done         
   SlodBitstream* getBitstream(Unsigned32 maxNoByte);
};



class SlodEncoderIv:public SlodEncoder{
public:
   ~SlodEncoderIv();

   //set inventor object to encode from
   //returns if successfull
   Boolean setIvObject(SoSeparator* object);
};

Decoder (SlodDecoder.h, SlodDecoderIv.h)

class SlodDecoder{
public:
   SlodDecoder();
   ~SlodDecoder();

   //reset to empty bitstream, brep, clustertree
   void reset();

   //add bitstream to undecoded bitstream
   void addBitstream(SlodBitstream* bitstream);

   //decode all bitstream information into cluster tree
   void decodeBitstream();

   //decode bitstream up to max no. bit
   void decodeBitstream(Unsigned32 maxNoBit);



   //get internal cluster tree
   SlodDecoderCluster* getClusterTree();

   //get brep to currently selected lod
   SlodBrep* getBrep();



   //get no. triangles of original object
   Unsigned32 getMaxNoTriangles();

   //get no. triangles decoded so far
   Unsigned32 getAvailableNoTriangles();

   //set & get lod to no. triangles available
   Unsigned32 setAvailableNoTriangles();

   //set & get no. triangles or no. triangles available
   Unsigned32 setNoTriangles(Unsigned32 desiredNoTriangles);

   //increase/decrease & get no. triangles
   Unsigned32 changeNoTriangles(Unsigned32 deltaNoTriangles);

   //get currently selected no. triangles
   Unsigned32 getNoTriangles();

   //set min parent cluster size
   void setMinParentClusterSize(Float32 size);

   //get currently selected min parent cluster size
   Float32 getMinParentClusterSize();
};



class SlodDecoderIv:public SlodDecoder{
public:
   SlodDecoderIv();
   ~SlodDecoderIv();

   //get internal inventor object
   SoSeparator* getIvObject();
};


© Heinrich Hey