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

OpenGL

开发平台:

Visual C++

  1. // model.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_MODEL_H_
  10. #define _CELENGINE_MODEL_H_
  11. #include "mesh.h"
  12. class Geometry
  13. {
  14. public:
  15.     Geometry() {};
  16.     virtual ~Geometry() {};
  17.     //! Render the geometry in the specified OpenGL context
  18.     virtual void render(RenderContext& rc, double t = 0.0) = 0;
  19.     /*! Find the closest intersection between the ray and the
  20.      *  model.  If the ray intersects the model, return true
  21.      *  and set distance; otherwise return false and leave
  22.      *  distance unmodified.
  23.      */
  24.     virtual bool pick(const Ray3d& r, double& distance) const = 0;
  25.     
  26.     virtual bool isOpaque() const = 0;
  27.     virtual bool isNormalized() const
  28.     {
  29.         return true;
  30.     }
  31.     
  32.     /*! Return true if the specified texture map type is used at
  33.      *  all within this geometry object. This information is used
  34.      *  to decide whether multiple rendering passes are required.
  35.      */
  36.     virtual bool usesTextureType(Mesh::TextureSemantic) const
  37.     {
  38.         return false;
  39.     }
  40. };
  41. /*!
  42.  * Model is the standard geometry object in Celestia.  A Model
  43.  * consists of a library of materials together with a list of
  44.  * meshes.  Each mesh object contains a pool of vertices and a
  45.  * set of primitive groups.  A primitive groups consists of a
  46.  * a primitive group type and a list of vertex indices.  This
  47.  * structure is exactly the one used in Celestia model (.cmod)
  48.  * files.
  49.  */
  50. class Model : public Geometry
  51. {
  52.  public:
  53.     Model();
  54.     ~Model();
  55.     /*! Return the material with the specified index, or NULL if
  56.      *  the index is out of range.
  57.      */
  58.     const Mesh::Material* getMaterial(uint32) const;
  59.     /*! Add a new material to the model's material library; the
  60.      *  return value is the number of materials in the model.
  61.      */
  62.     uint32 addMaterial(const Mesh::Material*);
  63.     /*! Return the number of materials in the model
  64.      */
  65.     uint32 getMaterialCount() const;
  66.     /*! Return the total number of vertices in the model
  67.      */
  68.     uint32 getVertexCount() const;
  69.     /*! Return the total number of primitives in the model
  70.      */
  71.     uint32 getPrimitiveCount() const;
  72.     /*! Return the mesh with the specified index, or NULL if the
  73.      *  index is out of range.
  74.      */
  75.     Mesh* getMesh(uint32) const;
  76.     /*! Add a new mesh to the model; the return value is the
  77.      *  total number of meshes in the model.
  78.      */
  79.     uint32 addMesh(Mesh*);
  80.     /*! Find the closest intersection between the ray and the
  81.      *  model.  If the ray intersects the model, return true
  82.      *  and set distance; otherwise return false and leave
  83.      *  distance unmodified.
  84.      */
  85.     virtual bool pick(const Ray3d& r, double& distance) const;
  86.     //! Render the model in the current OpenGL context
  87.     virtual void render(RenderContext&, double t = 0.0);
  88.     void transform(const Vec3f& translation, float scale);
  89.     /*! Apply a uniform scale to the model so that it fits into
  90.      *  a box with a center at centerOffset and a maximum side
  91.      *  length of one.
  92.      */
  93.     void normalize(const Vec3f& centerOffset);
  94.     /*! Return true if the specified texture map type is used at
  95.      *  all within a mesh. This information is used to decide
  96.      *  if multiple rendering passes are required.
  97.      */
  98.     virtual bool usesTextureType(Mesh::TextureSemantic) const;
  99.     /*! Return true if the model has no translucent components. */
  100.     virtual bool isOpaque() const
  101.     {
  102.         return opaque;
  103.     }
  104.     virtual bool isNormalized() const
  105.     {
  106.         return normalized;
  107.     }
  108.     /*! Set the opacity flag based on material usage within the model */
  109.     void determineOpacity();
  110.     class MeshComparator
  111.     {
  112.      public:
  113.         virtual ~MeshComparator() {};
  114.         virtual bool operator()(const Mesh&, const Mesh&) const = 0;
  115.     };
  116.     /*! Sort the model's meshes in place. */
  117.     void sortMeshes(const MeshComparator&);
  118.     /*! Optimize the model by eliminating all duplicated materials */
  119.     void uniquifyMaterials();
  120.     /*! This comparator will roughly sort the model's meshes by
  121.      *  opacity so that transparent meshes are rendered last.  It's far
  122.      *  from perfect, but covers a lot of cases.  A better method of
  123.      *  opacity sorting would operate at the primitive group level, or
  124.      *  even better at the triangle level.
  125.      *
  126.      *  Standard usage for this class is:
  127.      *     model->sortMeshes(Model::OpacityComparator());
  128.      *
  129.      *  uniquifyMaterials() should be used before sortMeshes(), since
  130.      *  the opacity comparison depends on material indices being ordered
  131.      *  by opacity.
  132.      */
  133.     class OpacityComparator : public MeshComparator
  134.     {
  135.      public:
  136.         OpacityComparator();
  137.         virtual ~OpacityComparator() {};
  138.         virtual bool operator()(const Mesh&, const Mesh&) const;
  139.      private:
  140.         int unused;
  141.     };
  142.  private:
  143.     std::vector<const Mesh::Material*> materials;
  144.     std::vector<Mesh*> meshes;
  145.     bool textureUsage[Mesh::TextureSemanticMax];
  146.     bool opaque;
  147.     bool normalized;
  148. };
  149. #endif // !_CELENGINE_MODEL_H_