mesh.h
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:6k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // mesh.h
  2. //
  3. // Copyright (C) 2004-2006, Chris Laurel <claurel@shatters.net>
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. #ifndef _CELENGINE_MESH_H_
  10. #define _CELENGINE_MESH_H_
  11. #include <celutil/basictypes.h>
  12. #include <celutil/color.h>
  13. #include <celutil/reshandle.h>
  14. #include <celmath/ray.h>
  15. #include <celmath/aabox.h>
  16. #include <vector>
  17. #include <string>
  18. #include "gl.h"
  19. class RenderContext;
  20. class Mesh
  21. {
  22.  public:
  23.     enum VertexAttributeSemantic
  24.     {
  25.         Position     = 0,
  26.         Color0       = 1,
  27.         Color1       = 2,
  28.         Normal       = 3,
  29.         Tangent      = 4,
  30.         Texture0     = 5,
  31.         Texture1     = 6,
  32.         Texture2     = 7,
  33.         Texture3     = 8,
  34.         PointSize    = 9,
  35.         SemanticMax  = 10,
  36.         InvalidSemantic  = -1,
  37.     };
  38.     enum VertexAttributeFormat
  39.     {
  40.         Float1    = 0,
  41.         Float2    = 1,
  42.         Float3    = 2,
  43.         Float4    = 3,
  44.         UByte4    = 4,
  45.         FormatMax = 5,
  46.         InvalidFormat = -1,
  47.     };
  48.     struct VertexAttribute
  49.     {
  50.         VertexAttribute() :
  51.             semantic(InvalidSemantic),
  52.             format(InvalidFormat),
  53.             offset(0)
  54.         {
  55.         }
  56.         VertexAttribute(VertexAttributeSemantic _semantic,
  57.                         VertexAttributeFormat _format,
  58.                         uint32 _offset) :
  59.             semantic(_semantic),
  60.             format(_format),
  61.             offset(_offset)
  62.         {
  63.         }
  64.         VertexAttributeSemantic semantic;
  65.         VertexAttributeFormat   format;
  66.         uint32                  offset;
  67.     };
  68.     struct VertexDescription
  69.     {
  70.         VertexDescription(uint32 _stride,
  71.                           uint32 _nAttributes,
  72.                           VertexAttribute* _attributes);
  73.         VertexDescription(const VertexDescription& desc);
  74.         ~VertexDescription();
  75.         const VertexAttribute& getAttribute(VertexAttributeSemantic semantic) const
  76.         {
  77.             return semanticMap[semantic];
  78.         }
  79.         bool validate() const;
  80.         VertexDescription& operator=(const VertexDescription&);
  81.         uint32 stride;
  82.         uint32 nAttributes;
  83.         VertexAttribute* attributes;
  84.     private:
  85.         void clearSemanticMap();
  86.         void buildSemanticMap();
  87.         
  88.         // Vertex attributes indexed by semantic
  89.         VertexAttribute semanticMap[SemanticMax];
  90.     };
  91.     enum TextureSemantic
  92.     {
  93.         DiffuseMap             =  0,
  94.         NormalMap              =  1,
  95.         SpecularMap            =  2,
  96.         EmissiveMap            =  3,
  97.         TextureSemanticMax     =  4,
  98.         InvalidTextureSemantic = -1,
  99.     };
  100.     enum BlendMode
  101.     {
  102.         NormalBlend             = 0,
  103.         AdditiveBlend           = 1,
  104.         PremultipliedAlphaBlend = 2,
  105.         BlendMax                = 3,
  106.         InvalidBlend            = -1,
  107.     };
  108.     class Material
  109.     {
  110.     public:
  111.         Material();
  112.         Color diffuse;
  113.         Color emissive;
  114.         Color specular;
  115.         float specularPower;
  116.         float opacity;
  117.         BlendMode blend;
  118.         ResourceHandle maps[TextureSemanticMax];
  119.     };
  120.     enum PrimitiveGroupType
  121.     {
  122.         TriList    = 0,
  123.         TriStrip   = 1,
  124.         TriFan     = 2,
  125.         LineList   = 3,
  126.         LineStrip  = 4,
  127.         PointList  = 5,
  128.         SpriteList = 6,
  129.         PrimitiveTypeMax = 7,
  130.         InvalidPrimitiveGroupType = -1
  131.     };
  132.     class PrimitiveGroup
  133.     {
  134.     public:
  135.         PrimitiveGroup();
  136.         ~PrimitiveGroup();
  137.         uint32 getPrimitiveCount() const;
  138.         
  139.         PrimitiveGroupType prim;
  140.         uint32 materialIndex;
  141.         uint32* indices;
  142.         uint32 nIndices;
  143.     };
  144.     Mesh();
  145.     ~Mesh();
  146.     void setVertices(uint32 _nVertices, void* vertexData);
  147.     bool setVertexDescription(const VertexDescription& desc);
  148.     const VertexDescription& getVertexDescription() const;
  149.     const PrimitiveGroup* getGroup(uint32) const;
  150.     uint32 addGroup(PrimitiveGroup* group);
  151.     uint32 addGroup(PrimitiveGroupType prim,
  152.                     uint32 materialIndex,
  153.                     uint32 nIndices,
  154.                     uint32* indices);
  155.     uint32 getGroupCount() const;
  156.     void remapIndices(const std::vector<uint32>& indexMap);
  157.     void clearGroups();
  158.     void remapMaterials(const std::vector<uint32>& materialMap);
  159.     /*! Reorder primitive groups so that groups with identical materials
  160.      *  appear sequentially in the primitive group list. This will reduce
  161.      *  the number of graphics state changes at render time.
  162.      */
  163.     void aggregateByMaterial();
  164.     const std::string& getName() const;
  165.     void setName(const std::string&);
  166.     bool pick(const Ray3d& r, double& distance) const;
  167.     void render(const std::vector<const Material*>& materials,
  168.                 RenderContext&) const;
  169.     AxisAlignedBox getBoundingBox() const;
  170.     void transform(Vec3f translation, float scale);
  171.     const void* getVertexData() const { return vertices; }
  172.     uint32 getVertexCount() const { return nVertices; }
  173.     uint32 getVertexStride() const { return vertexDesc.stride; }
  174.     uint32 getPrimitiveCount() const;
  175.     static PrimitiveGroupType      parsePrimitiveGroupType(const std::string&);
  176.     static VertexAttributeSemantic parseVertexAttributeSemantic(const std::string&);
  177.     static VertexAttributeFormat   parseVertexAttributeFormat(const std::string&);
  178.     static TextureSemantic         parseTextureSemantic(const std::string&);
  179.     static uint32                  getVertexAttributeSize(VertexAttributeFormat);
  180.  private:
  181.     void recomputeBoundingBox();
  182.  private:
  183.     VertexDescription vertexDesc;
  184.     uint32 nVertices;
  185.     void* vertices;
  186.     mutable GLuint vbObject;
  187.     mutable bool vbInitialized;
  188.     std::vector<PrimitiveGroup*> groups;
  189.     std::string name;
  190. };
  191. #endif // !_CELMESH_MESH_H_