root/OpenSceneGraph/trunk/src/osgPlugins/obj/obj.h @ 3325

Revision 3325, 4.9 kB (checked in by robert, 10 years ago)

Improvements to handling of winding of polygons.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2004 Robert Osfield
2 *
3 * This library is open source and may be redistributed and/or modified under 
4 * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or
5 * (at your option) any later version.  The full license is in LICENSE file
6 * included with this distribution, and on the openscenegraph.org website.
7 *
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 * OpenSceneGraph Public License for more details.
12*/
13
14#ifndef OBJ_H
15#define OBJ_H
16
17#include <string>
18#include <vector>
19#include <map>
20#include <istream>
21
22#include <osg/ref_ptr>
23#include <osg/Referenced>
24#include <osg/Vec2>
25#include <osg/Vec3>
26#include <osg/Vec4>
27
28
29namespace obj
30{
31
32class Material
33{
34public:
35    Material():
36        ambient(0.2f,0.2f,0.2f,1.0f),
37        diffuse(0.8f,0.8f,0.8f,1.0f),
38        specular(0.0f,0.0f,0.0f,1.0f),
39        emissive(0.0f,0.0f,0.0f,1.0f),
40        shininess(0.0f),
41        sharpness(0.0f),
42        illum(0),
43        Tf(0.0f,0.0f,0.0f,1.0f),
44        textureReflection(false),
45        alpha(1.0f),
46        uScale(1.0f),
47        vScale(1.0f),
48        uOffset(1.0f),
49        vOffset(1.0f) {}
50   
51    std::string name;
52   
53    osg::Vec4   ambient;
54    osg::Vec4   diffuse;
55    osg::Vec4   specular;
56    osg::Vec4   emissive;
57    float       shininess;
58    float       sharpness;
59    int         illum;
60   
61    osg::Vec4   Tf;
62    int         Ni;
63    int         Ns;
64
65    std::string map_Ka;
66    std::string map_Kd;
67    std::string map_Ks;
68    bool        textureReflection;
69    float       alpha;
70    float       uScale;
71    float       vScale;
72    float       uOffset;
73    float       vOffset;
74   
75protected:
76
77};
78
79class Element : public osg::Referenced
80{
81public:
82
83    typedef std::vector<int> IndexList;
84
85    enum DataType
86    {
87        POINTS,
88        POLYLINE,
89        POLYGON
90    };
91   
92    Element(DataType type):
93        dataType(type) {}
94       
95    enum CoordinateCombination
96    {
97        VERTICES,
98        VERTICES_NORMALS,
99        VERTICES_TEXCOORDS,
100        VERTICES_NORMALS_TEXCOORDS
101    };
102   
103    CoordinateCombination getCoordinateCombination() const
104    {
105        if (vertexIndices.size()==normalIndices.size())
106            return (vertexIndices.size()==texCoordIndices.size()) ? VERTICES_NORMALS_TEXCOORDS : VERTICES_NORMALS;
107        else 
108            return (vertexIndices.size()==texCoordIndices.size()) ?  VERTICES_TEXCOORDS : VERTICES;
109    }
110   
111    DataType  dataType; 
112    IndexList vertexIndices;
113    IndexList normalIndices;
114    IndexList texCoordIndices;
115};
116
117class ElementState
118{
119public:
120
121    ElementState():
122        coordinateCombination(Element::VERTICES),
123        smoothingGroup(0) {}
124       
125    bool operator < (const ElementState& rhs) const
126    {
127        if (materialName<rhs.materialName) return true;
128        else if (rhs.materialName<materialName) return false;
129
130        if (objectName<rhs.objectName) return true;
131        else if (rhs.objectName<objectName) return false;
132
133        if (groupName<rhs.groupName) return true;
134        else if (rhs.groupName<groupName) return false;
135
136        if (coordinateCombination<rhs.coordinateCombination) return true;
137        else if (rhs.coordinateCombination<coordinateCombination) return false;
138
139        return (smoothingGroup<rhs.smoothingGroup);
140    }
141
142
143    std::string                     objectName;
144    std::string                     groupName;
145    std::string                     materialName;
146    Element::CoordinateCombination  coordinateCombination;
147    int                             smoothingGroup;
148};
149
150class Model
151{
152public:
153    Model():
154        currentElementList(0) {}
155   
156    bool readMTL(std::istream& fin);
157    bool readOBJ(std::istream& fin);
158   
159    bool readline(std::istream& fin, char* line, const int LINE_SIZE);
160    void addElement(Element* element);
161   
162    osg::Vec3 averageNormal(const Element& element) const;
163    osg::Vec3 computeNormal(const Element& element) const;
164    bool needReverse(const Element& element) const;
165   
166    int remapVertexIndex(int vi) { return (vi<0) ? vertices.size()+vi : vi-1; }
167    int remapNormalIndex(int vi) { return (vi<0) ? normals.size()+vi : vi-1; }
168    int remapTexCoordIndex(int vi) { return (vi<0) ? texcoords.size()+vi : vi-1; }
169   
170    typedef std::map<std::string,Material>          MaterialMap;
171    typedef std::vector< osg::Vec2 >                Vec2Array;
172    typedef std::vector< osg::Vec3 >                Vec3Array;
173    typedef std::vector< osg::ref_ptr<Element> >    ElementList;
174    typedef std::map< ElementState,ElementList >    ElementStateMap;
175   
176    MaterialMap     materialMap;
177       
178    Vec3Array       vertices;
179    Vec3Array       normals;
180    Vec2Array       texcoords;
181   
182    ElementState    currentElementState;
183   
184    ElementStateMap elementStateMap;
185    ElementList*    currentElementList;
186
187};
188
189}
190
191
192
193
194
195#endif
Note: See TracBrowser for help on using the browser.