home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 5164 / miletos.7z / meshobj.h < prev    next >
Encoding:
C/C++ Source or Header  |  2011-04-02  |  4.5 KB  |  186 lines

  1. #ifndef __MILETOS_MESHOBJ_H__
  2. #define __MILETOS_MESHOBJ_H__
  3.  
  4. //
  5. // Libmiletos
  6. //
  7. // Copyright (C) Lauris Kaplinski 2008
  8. //
  9.  
  10. #include <string>
  11. #include <vector>
  12.  
  13. #include <miletos/uri.h>
  14. #include <miletos/geometry.h>
  15. #include <miletos/helpers/datablock.h>
  16.  
  17. namespace Miletos {
  18.  
  19. #ifndef __MILETOS_MESHOBJ_CPP__
  20. extern Elea::Matrix4x4f OBJTransform;
  21. extern float OBJScale;
  22. #endif
  23.  
  24. class OBJData : public DataBlock {
  25. public:
  26.     // Parser temporaries
  27.     struct BuildData;
  28.     BuildData *bdata;
  29.     unsigned int invalid;
  30. private:
  31.     OBJData (const char *url);
  32.     OBJData (const unsigned char *cdata, size_t csize, const char *url);
  33.     virtual ~OBJData (void);
  34.  
  35.     // Helper
  36.     void parse (const unsigned char *cdata, size_t csize);
  37.     int readVertex (const char *cdata, size_t csize, int normalindex);
  38. public:
  39.     std::string mtllib;
  40.  
  41.     // Static constructor
  42.     static OBJData *getOBJData (const char *url, unsigned int create);
  43.     static OBJData *getOBJData (const unsigned char *cdata, size_t csize, const char *url);
  44.  
  45.     // Parsing
  46.     void startParser (void);
  47.     void parseLine (const char *cdata, size_t csize);
  48.     void finishParser (void);
  49. };
  50.  
  51. // This is processed OBJ mesh with normals calculated ant vertices welded
  52.  
  53. class OBJMesh {
  54. private:
  55.     OBJData *objdata;
  56.  
  57.     // Welded vindices
  58.     std::vector<int> vindices;
  59.     // Map from original vertex index to welded vertex index
  60.     std::vector<int> vorig2welded;
  61.     // Map from welded vertex index to collated vertex index
  62.     std::vector<int> vwelded2collated;
  63. public:
  64.     char *url;
  65.     char *mtllib;
  66.  
  67.     struct Fragment {
  68.         // Name of material from usemtl tag
  69.         std::string usemtl;
  70.         int materialidx;
  71.         // Pointers to main index array
  72.         u32 firstindex;
  73.         u32 nindices;
  74.     };
  75.  
  76.     struct Group {
  77.         std::string name;
  78.         // Original vertex indices of this group
  79.         std::vector<int> vorig;
  80.         // Collated vertex indices of this group
  81.         std::vector<int> vnew;
  82.     };
  83.  
  84.     std::vector<Elea::Vector3f> vcollated;
  85.     std::vector<Elea::Vector2f> xcollated;
  86.     std::vector<Elea::Vector3f> ncollated;
  87.     std::vector<int> icollated;
  88.     // Mappings from original vertex indices to collated indices
  89.     std::vector<int> vpos;
  90.     std::vector<int> vlen;
  91.     // Preferred group for each new vertex
  92.     std::vector<int> vgroup;
  93.  
  94.     std::vector<Fragment> fragments;
  95.     std::vector<Group> groups;
  96.  
  97.     std::vector<std::string> materials;
  98.  
  99.     OBJMesh (OBJData *objdata, unsigned int build);
  100.     ~OBJMesh (void);
  101.  
  102.     // Helpers
  103.     int lookupGroupIdx (const char *name);
  104.     // Weld vertices between specific groups
  105.     // This has to be done bofore building
  106.     void weld (const char *parent, const char *child);
  107.     // Build all required data
  108.     // If requested autoweld all coincident vertices
  109.     void build (unsigned int weld);
  110. };
  111.  
  112. class GeometryOBJ : public StaticGeometry {
  113. private:
  114.     OBJMesh *obj;
  115.  
  116.     struct Texture {
  117.         unsigned int refcount;
  118.         std::string path;
  119.         std::string id;
  120.         NR::PixBlock pixels;
  121.     };
  122.     std::vector<Texture *> textures;
  123.     struct Material {
  124.         // OBJ usemtl tag
  125.         std::string usemtl;
  126.         int diffusetexture;
  127.         int normaltexture;
  128.         int speculartexture;
  129.         std::string diffusemap;
  130.         std::string normalmap;
  131.         std::string specularmap;
  132.     };
  133.     std::vector<Material> materials;
  134.  
  135.     // Object implementation
  136.     virtual const Type *objectType (void);
  137.     virtual void build (Thera::Node *pnode, Document *doc, BuildCtx *ctx);
  138.     virtual void release (void);
  139.     virtual void set (const char *attrid, const char *val);
  140.     // Geometry implementation
  141.     virtual TextureInfo *getTextureInfo (unsigned int matidx, unsigned int texidx, unsigned int getimage);
  142.     virtual u32 getMaterialInfo (MaterialInfo *mat, u32 matidx);
  143.     // StaticGeometry implementation
  144.     virtual Sehle::Material *getMaterial (int matidx, Sehle::Engine *engine);
  145.  
  146.     // Helpers
  147.     void clear (void);
  148.     void loadData (void);
  149.     int loadTexture (URI::URLHandler *handler, const char *path);
  150.     bool readVertex (const char *cdata, size_t csize);
  151. public:
  152.     GeometryOBJ (void);
  153.  
  154.     // Type system
  155.     static const Type *type (void);
  156. };
  157.  
  158. #if 0
  159. class MeshOBJ : public SMesh {
  160. private:
  161.     GeometryOBJ *_geometry;
  162.     // Object implementation
  163.     virtual const Type *objectType (void);
  164.     virtual void build (Thera::Node *pnode, Document *doc, BuildCtx *ctx);
  165.     virtual void release (void);
  166.     virtual void set (const char *attrid, const char *val);
  167.     virtual void update (UpdateCtx *ctx, unsigned int flags);
  168.     // Item implementation
  169.     // SMesh implementation
  170.     virtual void buildMesh (Sehle::StaticMesh *mesh);
  171.     // Slots
  172.     void geometryModified (Object *object, unsigned int flags);
  173.     void geometryReleased (Object *object);
  174. public:
  175.     // Constructor
  176.     MeshOBJ (void);
  177.     // Type system
  178.     static const Type *type (void);
  179. };
  180. #endif
  181.  
  182. } // Namespace Miletos
  183.  
  184. #endif
  185.  
  186.