pxmlw6n2f/Gazebo_Distributed_TCP/gazebo/common/ColladaLoader.hh

234 lines
9.7 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_COLLADALOADER_HH_
#define _GAZEBO_COLLADALOADER_HH_
#include <string>
#include <vector>
#include <map>
#include <ignition/math/Matrix4.hh>
#include <ignition/math/Vector3.hh>
#include <ignition/math/Vector2.hh>
#include "gazebo/common/MeshLoader.hh"
#include "gazebo/util/system.hh"
class TiXmlElement;
namespace gazebo
{
namespace common
{
class Material;
class ColladaLoaderPrivate;
/// \addtogroup gazebo_common Common
/// \{
/// \class ColladaLoader ColladaLoader.hh common/common.hh
/// \brief Class used to load Collada mesh files
class GZ_COMMON_VISIBLE ColladaLoader : public MeshLoader
{
/// \brief Constructor
public: ColladaLoader();
/// \brief Destructor
public: virtual ~ColladaLoader();
/// \brief Load a mesh
/// \param[in] _filename Collada file to load
/// \return Pointer to a new Mesh
public: virtual Mesh *Load(const std::string &_filename);
/// \brief Load a controller instance
/// \param[in] _contrXml Pointer to the control XML instance
/// \param[in] _skelXml Pointer the skeleton xml instance
/// \param[in] _transform A tranform to apply
/// \param[in,out] _mesh The mesh being loaded
private: void LoadController(TiXmlElement *_contrXml,
TiXmlElement *_skelXml,
const ignition::math::Matrix4d &_transform, Mesh *_mesh);
/// \brief Load animations for a skeleton
/// \param[in] _xml Animation XML instance
/// \param[in,out] _skel Pointer to the skeleton
private: void LoadAnimations(TiXmlElement *_xml, Skeleton *_skel);
/// \brief Load a set of animations for a skeleton
/// \param[in] _xml Pointer to the animation set XML instance
/// \param[in,out] _skel Pointer to the skeleton
private: void LoadAnimationSet(TiXmlElement *_xml, Skeleton *_skel);
/// \brief Load skeleton nodes
/// \param[in] _xml Pointer to the XML instance
/// \param[in,out] _xml Pointer to the Skeleton node parent
private: SkeletonNode* LoadSkeletonNodes(TiXmlElement *_xml,
SkeletonNode *_parent);
/// \brief Set the tranform for a skeleton node
/// \param[in] _xml Pointer to the XML instance
/// \param[in,out] _node The skeleton node
private: void SetSkeletonNodeTransform(TiXmlElement *_elem,
SkeletonNode *_node);
/// \brief Load geometry elements
/// \param[in] _xml Pointer to the XML instance
/// \param[in] _tranform Transform to apply to the loaded geometry
/// \param[in,out] _mesh Pointer to the mesh currently being loaded
private: void LoadGeometry(TiXmlElement *_xml,
const ignition::math::Matrix4d &_transform, Mesh *_mesh);
/// \brief Get an XML element by ID
/// \param[in] _parent The parent element
/// \param[in] _name String name of the element
/// \param[out] _id String ID of the element
private: TiXmlElement *GetElementId(TiXmlElement *_parent,
const std::string &_name,
const std::string &_id);
/// \brief Get an XML element by ID
/// \param[in] _name String name of the element
/// \param[out] _id String ID of the element
private: TiXmlElement *GetElementId(const std::string &_name,
const std::string &_id);
/// \brief Load a node
/// \param[in] _elem Pointer to the node XML instance
/// \param[in,out] _mesh Pointer to the current mesh
/// \param[out] _transform Transform to apply to the node
private: void LoadNode(TiXmlElement *_elem, Mesh *_mesh,
const ignition::math::Matrix4d &_transform);
/// \brief Load a transform
/// \param[in] _elem Pointer to the transform XML instance
/// \return A Matrix4 transform
private: ignition::math::Matrix4d LoadNodeTransform(TiXmlElement *_elem);
/// \brief Load vertices
/// \param[in] _id String id of the vertices XML node
/// \param[in] _transform Transform to apply to all vertices
/// \param[out] _verts Holds the resulting vertices
/// \param[out] _norms Holds the resulting normals
private: void LoadVertices(const std::string &_id,
const ignition::math::Matrix4d &_transform,
std::vector<ignition::math::Vector3d> &_verts,
std::vector<ignition::math::Vector3d> &_norms);
/// \brief Load vertices
/// \param[in] _id String id of the vertices XML node
/// \param[in] _transform Transform to apply to all vertices
/// \param[out] _verts Holds the resulting vertices
/// \param[out] _norms Holds the resulting normals
/// \param[out] _vertDup Holds a map of duplicate position indices
/// \param[out] _normDup Holds a map of duplicate normal indices
private: void LoadVertices(const std::string &_id,
const ignition::math::Matrix4d &_transform,
std::vector<ignition::math::Vector3d> &_verts,
std::vector<ignition::math::Vector3d> &_norms,
std::map<unsigned int, unsigned int> &_vertDup,
std::map<unsigned int, unsigned int> &_normDup);
/// \brief Load positions
/// \param[in] _id String id of the XML node
/// \param[in] _transform Transform to apply to all positions
/// \param[out] _values Holds the resulting position values
/// \param[out] _values Holds a map of duplicate position indices
private: void LoadPositions(const std::string &_id,
const ignition::math::Matrix4d &_transform,
std::vector<ignition::math::Vector3d> &_values,
std::map<unsigned int, unsigned int> &_duplicates);
/// \brief Load normals
/// \param[in] _id String id of the XML node
/// \param[in] _transform Transform to apply to all normals
/// \param[out] _values Holds the resulting normal values
/// \param[out] _values Holds a map of duplicate normal indices
private: void LoadNormals(const std::string &_id,
const ignition::math::Matrix4d &_transform,
std::vector<ignition::math::Vector3d> &_values,
std::map<unsigned int, unsigned int> &_duplicates);
/// \brief Load texture coordinates
/// \param[in] _id String id of the XML node
/// \param[out] _values Holds the resulting uv values
/// \param[out] _values Holds a map of duplicate uv indices
private: void LoadTexCoords(const std::string &_id,
std::vector<ignition::math::Vector2d> &_values,
std::map<unsigned int, unsigned int> &_duplicates);
/// \brief Load a material
/// \param _name Name of the material XML element
/// \return A pointer to the new material
private: Material *LoadMaterial(const std::string &_name);
/// \brief Load a color or texture
/// \param[in] _eleme Pointer to the XML element
/// \param[in] _type One of {diffuse, ambient, emission}
/// \param[out] _mat Material to load the texture or color into
private: void LoadColorOrTexture(TiXmlElement *_elem,
const std::string &_type,
Material *_mat);
/// \brief Load triangles
/// \param[in] _trianglesXml Pointer the triangles XML instance
/// \param[in] _transform Transform to apply to all triangles
/// \param[out] _mesh Mesh that is currently being loaded
private: void LoadTriangles(TiXmlElement *_trianglesXml,
const ignition::math::Matrix4d &_transform,
Mesh *_mesh);
/// \brief Load a polygon list
/// \param[in] _polylistXml Pointer to the XML element
/// \param[in] _transform Transform to apply to each polygon
/// \param[out] _mesh Mesh that is currently being loaded
private: void LoadPolylist(TiXmlElement *_polylistXml,
const ignition::math::Matrix4d &_transform,
Mesh *_mesh);
/// \brief Load lines
/// \param[in] _xml Pointer to the XML element
/// \param[in] _transform Transform to apply
/// \param[out] _mesh Mesh that is currently being loaded
private: void LoadLines(TiXmlElement *_xml,
const ignition::math::Matrix4d &_transform,
Mesh *_mesh);
/// \brief Load an entire scene
/// \param[out] _mesh Mesh that is currently being loaded
private: void LoadScene(Mesh *_mesh);
/// \brief Load a float value
/// \param[out] _elem Pointer to the XML element
/// \return The float value
private: float LoadFloat(TiXmlElement *_elem);
/// \brief Load a transparent material. NOT IMPLEMENTED
/// \param[in] _elem Pointer to the XML element
/// \param[out] _mat Material to hold the transparent properties
private: void LoadTransparent(TiXmlElement *_elem, Material *_mat);
/// \internal
/// \brief Pointer to private data.
private: ColladaLoaderPrivate *dataPtr;
};
/// \}
}
}
#endif