pxmlw6n2f/Gazebo_Distributed_TCP/gazebo/common/Mesh.hh

457 lines
16 KiB
C++

/*
* Copyright (C) 2012 Open Source Robotics Foundation
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#ifndef _GAZEBO_MESH_HH_
#define _GAZEBO_MESH_HH_
#include <vector>
#include <string>
#include <ignition/math/Vector3.hh>
#include <ignition/math/Vector2.hh>
#include "gazebo/math/Vector3.hh"
#include "gazebo/math/Vector2d.hh"
#include "gazebo/common/CommonTypes.hh"
#include "gazebo/util/system.hh"
namespace gazebo
{
namespace common
{
class Material;
class SubMesh;
class Skeleton;
/// \addtogroup gazebo_common Common
/// \{
/// \class Mesh Mesh.hh common/common.hh
/// \brief A 3D mesh
class GZ_COMMON_VISIBLE Mesh
{
/// \brief Constructor
public: Mesh();
/// \brief Destructor
public: virtual ~Mesh();
/// \brief Set the path which contains the mesh resource
/// \param[in] _path the file path
public: void SetPath(const std::string &_path);
/// \brief Get the path which contains the mesh resource
/// \return the path to the mesh resource
public: std::string GetPath() const;
/// \brief Set the name of this mesh
/// \param[in] _n the name to set
public: void SetName(const std::string &_n);
/// \brief Get the name of this mesh
/// \return the name
public: std::string GetName() const;
/// \brief Get the maximun X, Y, Z values
/// \return the upper bounds of the bounding box
public: ignition::math::Vector3d Max() const;
/// \brief Get the minimum X, Y, Z values
/// \return the lower bounds of the bounding box
public: ignition::math::Vector3d Min() const;
/// \brief Return the number of vertices
/// \return the count
public: unsigned int GetVertexCount() const;
/// \brief Return the number of normals
/// \return the count
public: unsigned int GetNormalCount() const;
/// \brief Return the number of indices
/// \return the count
public: unsigned int GetIndexCount() const;
/// \brief Return the number of texture coordinates
/// \return the count
public: unsigned int GetTexCoordCount() const;
/// \brief Add a submesh mesh.
/// The Mesh object takes ownership of the submesh.
/// \param[in] _child the submesh
public: void AddSubMesh(SubMesh *_child);
/// \brief Get the number of children
/// \return the count
public: unsigned int GetSubMeshCount() const;
/// \brief Add a material to the mesh
/// \param[in] _mat the material
/// \return Index of this material
public: int AddMaterial(Material *_mat);
/// \brief Get the number of materials
/// \return the count
public: unsigned int GetMaterialCount() const;
/// \brief Get a material
/// \param[in] _index the index
/// \return the material or NULL if the index is out of bounds
public: const Material *GetMaterial(int _index) const;
/// \brief Get the index of material
/// \param[in] _mat the material
/// \return the index of the material or -1 if not found.
public: int GetMaterialIndex(const Material *_mat) const;
/// \brief Get a child mesh
/// \param[in] _i the index
/// \return the submesh. An exception is thrown if the index is out of
/// bounds
public: const SubMesh *GetSubMesh(unsigned int _i) const;
/// \brief Get a child mesh by name.
/// \param[in] _name Name of the submesh.
/// \return The submesh, NULL if the _name is not found.
public: const SubMesh *GetSubMesh(const std::string &_name) const;
/// \brief Put all the data into flat arrays
/// \param[out] _vertArr the vertex array
/// \param[out] _indArr the index array
public: void FillArrays(float **_vertArr, int **_indArr) const;
/// \brief Recalculate all the normals of each face defined by three
/// indices.
public: void RecalculateNormals();
/// \brief Get AABB coordinate
/// \param[out] _center of the bounding box
/// \param[out] _minXYZ bounding box minimum values
/// \param[out] _maxXYZ bounding box maximum values
public: void GetAABB(ignition::math::Vector3d &_center,
ignition::math::Vector3d &_minXYZ,
ignition::math::Vector3d &_maxXYZ) const;
/// \brief Generate texture coordinates using spherical projection
/// from center
/// \param[in] _center the center of the projection
public: void GenSphericalTexCoord(
const ignition::math::Vector3d &_center);
/// \brief Get the skeleton to which this mesh is attached.
/// \return pointer to skeleton, or NULL if none is present.
public: Skeleton* GetSkeleton() const;
/// \brief Set the mesh skeleton
public: void SetSkeleton(Skeleton *_skel);
/// \brief Return true if mesh is attached to a skeleton.
public: bool HasSkeleton() const;
/// \brief Scale all vertices by _factor
/// \param _factor Scaling factor
public: void Scale(double _factor);
/// \brief Scale all vertices by the _factor vector
/// \param[in] _factor Scaling vector
public: void SetScale(const ignition::math::Vector3d &_factor);
/// \brief Move the center of the mesh to the given coordinate. This
/// will move all the vertices in all submeshes.
/// \param[in] _center Location of the mesh center.
public: void Center(const ignition::math::Vector3d &_center =
ignition::math::Vector3d::Zero);
/// \brief Move all vertices in all submeshes by _vec.
/// \param[in] _vec Amount to translate vertices.
public: void Translate(const ignition::math::Vector3d &_vec);
/// \brief The name of the mesh
private: std::string name;
/// \brief The path of the mesh resource
private: std::string path;
/// \brief The sub mesh array.
private: std::vector<SubMesh *> submeshes;
/// \brief The materials array.
private: std::vector<Material *> materials;
/// \brief The skeleton (for animation)
private: Skeleton *skeleton;
};
/// \brief Vertex to node weighted assignement for skeleton animation
/// visualization
class GZ_COMMON_VISIBLE NodeAssignment
{
/// \brief Constructor.
public: NodeAssignment();
/// \brief index of the vertex
public: unsigned int vertexIndex;
/// \brief node (or bone) index
public: unsigned int nodeIndex;
/// \brief the weight (between 0 and 1)
public: float weight;
};
/// \brief A child mesh
class GZ_COMMON_VISIBLE SubMesh
{
/// \brief An enumeration of the geometric mesh primitives
public: enum PrimitiveType {POINTS, LINES, LINESTRIPS, TRIANGLES,
TRIFANS, TRISTRIPS};
/// \brief Constructor
public: SubMesh();
/// \brief Copy Constructor
public: SubMesh(const SubMesh *_mesh);
/// \brief Destructor
public: virtual ~SubMesh();
/// \brief Set the name of this mesh
/// \param[in] _n the name to set
public: void SetName(const std::string &_n);
/// \brief Get the name of this mesh
/// \return the name
public: std::string GetName() const;
/// \brief Set the primitive type
/// \param[in] _type the type
public: void SetPrimitiveType(PrimitiveType _type);
/// \brief Get the primitive type
/// \return the primitive type
public: PrimitiveType GetPrimitiveType() const;
/// \brief Copy vertices from a vector
/// \param[in] _verts the vertices to copy from
public: void CopyVertices(
const std::vector<ignition::math::Vector3d> &_verts);
/// \brief Copy normals from a vector
/// \param[in] _norms to copy from
public: void CopyNormals(
const std::vector<ignition::math::Vector3d> &_norms);
/// \brief Resize the vertex array
/// \param[in] _count the new size of the array
public: void SetVertexCount(unsigned int _count);
/// \brief Resize the index array
/// \param[in] _count the new size of the array
public: void SetIndexCount(unsigned int _count);
/// \brief Resize the normal array
/// \param[in] _count the new size of the array
public: void SetNormalCount(unsigned int _count);
/// \brief Resize the texture coordinate array
/// \param[in] _count
public: void SetTexCoordCount(unsigned int _count);
/// \brief Add an index to the mesh
/// \param[in] _i the new vertex index
public: void AddIndex(unsigned int _i);
/// \brief Add a vertex to the mesh
/// \param[in] _v the new position
public: void AddVertex(const ignition::math::Vector3d &_v);
/// \brief Add a vertex to the mesh
/// \param[in] _x position along x
/// \param[in] _y position along y
/// \param[in] _z position along z
public: void AddVertex(double _x, double _y, double _z);
/// \brief Add a normal to the mesh
/// \param[in] _n the normal
public: void AddNormal(const ignition::math::Vector3d &_n);
/// \brief Add a normal to the mesh
/// \param[in] _x position along x
/// \param[in] _y position along y
/// \param[in] _z position along z
public: void AddNormal(double _x, double _y, double _z);
/// \brief Add a texture coord to the mesh
/// \param[in] _u position along u
/// \param[in] _v position along v
public: void AddTexCoord(double _u, double _v);
/// \brief Add a vertex - skeleton node assignment
/// \param[in] _vertex the vertex index
/// \param[in] _node the node index
/// \param[in] _weight the weight (between 0 and 1)
public: void AddNodeAssignment(unsigned int _vertex, unsigned int _node,
float _weight);
/// \brief Get a vertex
/// \param[in] _i the vertex index
/// \return the position or throws an exception
public: ignition::math::Vector3d Vertex(unsigned int _i) const;
/// \brief Set a vertex
/// \param[in] _i the index
/// \param[in] _v the position
public: void SetVertex(unsigned int _i,
const ignition::math::Vector3d &_v);
/// \brief Get a normal
/// \param[in] _i the normal index
/// \return the orientation of the normal, or throws an exception
public: ignition::math::Vector3d Normal(unsigned int _i) const;
/// \brief Set a normal
/// \param[in] _i the normal index
/// \param[in] _n the normal direction
public: void SetNormal(unsigned int _i,
const ignition::math::Vector3d &_n);
/// \brief Get a tex coord
/// \param[in] _i the texture index
/// \return the texture coordinates
public: ignition::math::Vector2d TexCoord(unsigned int _i) const;
/// \brief Get a vertex - skeleton node assignment
/// \param[in] _i the index of the assignment
public: NodeAssignment GetNodeAssignment(unsigned int _i) const;
/// \brief Set a tex coord
/// \param[in] _i
/// \param[in] _t
public: void SetTexCoord(unsigned int _i,
const ignition::math::Vector2d &_t);
/// \brief Get an index
/// \param[in] _i
public: unsigned int GetIndex(unsigned int _i) const;
/// \brief Get the maximum X, Y, Z values from all the vertices
/// \return Max X,Y,Z values from all vertices in submesh
public: ignition::math::Vector3d Max() const;
/// \brief Get the minimum X, Y, Z values from all the vertices
/// \return Min X,Y,Z values from all vertices in submesh
public: ignition::math::Vector3d Min() const;
/// \brief Return the number of vertices
public: unsigned int GetVertexCount() const;
/// \brief Return the number of normals
public: unsigned int GetNormalCount() const;
/// \brief Return the number of indicies
public: unsigned int GetIndexCount() const;
/// \brief Return the number of texture coordinates
public: unsigned int GetTexCoordCount() const;
/// \brief Return the number of vertex - skeleton node assignments
public: unsigned int GetNodeAssignmentsCount() const;
/// \brief Get the highest index value
public: unsigned int GetMaxIndex() const;
/// \brief Set the material index. Relates to the parent mesh material
/// list
/// \param[in] _index
public: void SetMaterialIndex(unsigned int _index);
/// \brief Get the material index
public: unsigned int GetMaterialIndex() const;
/// \brief Return true if this submesh has the vertex
/// \param[in] _v
/// \return Return true if this submesh has the vertex
public: bool HasVertex(const ignition::math::Vector3d &_v) const;
/// \brief Get the index of the vertex
/// \param[in] _v Vertex to check
/// \return Index of the vertex that matches _v.
public: unsigned int GetVertexIndex(
const ignition::math::Vector3d &_v) const;
/// \brief Put all the data into flat arrays
/// \param[in] _verArr
/// \param[in] _indArr
public: void FillArrays(float **_vertArr, int **_indArr) const;
/// \brief Recalculate all the normals.
public: void RecalculateNormals();
/// \brief Generate texture coordinates using spherical projection
/// from center
/// \param[in] _center
public: void GenSphericalTexCoord(
const ignition::math::Vector3d &_center);
/// \brief Scale all vertices by _factor
/// \param[in] _factor Scaling factor
public: void Scale(double _factor);
/// \brief Move the center of the submesh to the given coordinate. This
/// will move all the vertices.
/// \param[in] _center Location of the mesh center.
public: void Center(const ignition::math::Vector3d &_center =
ignition::math::Vector3d::Zero);
/// \brief Move all vertices by _vec.
/// \param[in] _vec Amount to translate vertices.
public: void Translate(const ignition::math::Vector3d &_vec);
/// \brief Scale all vertices by the _factor vector
/// \param[in] _factor Scaling vector
public: void SetScale(const ignition::math::Vector3d &_factor);
/// \brief the vertex array
private: std::vector<ignition::math::Vector3d> vertices;
/// \brief the normal array
private: std::vector<ignition::math::Vector3d> normals;
/// \brief the texture coordinate array
private: std::vector<ignition::math::Vector2d> texCoords;
/// \brief the vertex index array
private: std::vector<unsigned int> indices;
/// \brief node assignment array
private: std::vector<NodeAssignment> nodeAssignments;
/// \brief primitive type for the mesh
private: PrimitiveType primitiveType;
/// \brief The material index for this mesh. Relates to the parent
/// mesh material list.
private: int materialIndex;
/// \brief The name of the sub-mesh
private: std::string name;
};
/// \}
}
}
#endif