Files
OpenSceneGraph/src/osgPlugins/lwo/Unit.h
2004-01-03 15:20:33 +00:00

92 lines
3.0 KiB
C++

/*******************************************************
Lightwave Object Loader for OSG
Copyright (C) 2004 Marco Jez <marco.jez@poste.it>
OpenSceneGraph is (C) 2004 Robert Osfield
********************************************************/
#ifndef LWOSG_UNIT_
#define LWOSG_UNIT_
#include "Polygon.h"
#include "VertexMap.h"
#include <osg/ref_ptr>
#include <osg/Array>
#include <vector>
namespace lwosg
{
class Unit {
public:
typedef std::vector<Polygon> Polygon_list;
typedef std::vector<int> Index_list;
typedef std::vector<Index_list> Sharing_list;
Unit();
inline osg::Vec3Array *points() { return points_.get(); }
inline const osg::Vec3Array *points() const { return points_.get(); }
inline VertexMap *normals() { return normals_.get(); }
inline const VertexMap *normals() const { return normals_.get(); }
inline Polygon_list &polygons() { return polygons_; }
inline const Polygon_list &polygons() const { return polygons_; }
inline Sharing_list &shares() { return shares_; }
inline const Sharing_list &shares() const { return shares_; }
inline const VertexMap_map *weight_maps() const { return weight_maps_.get(); }
inline VertexMap_map *weight_maps() { return weight_maps_.get(); }
inline const VertexMap_map *subpatch_weight_maps() const { return subpatch_weight_maps_.get(); }
inline VertexMap_map *subpatch_weight_maps() { return subpatch_weight_maps_.get(); }
inline const VertexMap_map *texture_maps() const { return texture_maps_.get(); }
inline VertexMap_map *texture_maps() { return texture_maps_.get(); }
inline const VertexMap_map *rgb_maps() const { return rgb_maps_.get(); }
inline VertexMap_map *rgb_maps() { return rgb_maps_.get(); }
inline const VertexMap_map *rgba_maps() const { return rgba_maps_.get(); }
inline VertexMap_map *rgba_maps() { return rgba_maps_.get(); }
inline const VertexMap_map *displacement_maps() const { return displacement_maps_.get(); }
inline VertexMap_map *displacement_maps() { return displacement_maps_.get(); }
inline const VertexMap_map *spot_maps() const { return spot_maps_.get(); }
inline VertexMap_map *spot_maps() { return spot_maps_.get(); }
void flatten_maps();
void generate_normals();
void compute_vertex_remapping(const Surface *surf, Index_list &remap) const;
protected:
float angle_between_polygons(const Polygon &p1, const Polygon &p2) const;
void find_shared_polygons(int vertex_index, std::vector<int> &poly_indices);
void flatten_map(Polygon &poly, const VertexMap *local_map, VertexMap *global_map);
private:
osg::ref_ptr<osg::Vec3Array> points_;
Polygon_list polygons_;
Sharing_list shares_;
osg::ref_ptr<VertexMap> normals_;
osg::ref_ptr<VertexMap_map> weight_maps_;
osg::ref_ptr<VertexMap_map> subpatch_weight_maps_;
osg::ref_ptr<VertexMap_map> texture_maps_;
osg::ref_ptr<VertexMap_map> rgb_maps_;
osg::ref_ptr<VertexMap_map> rgba_maps_;
osg::ref_ptr<VertexMap_map> displacement_maps_;
osg::ref_ptr<VertexMap_map> spot_maps_;
};
}
#endif