root/OpenSceneGraph/trunk/src/osgPlugins/OpenFlight/AncillaryRecords.cpp @ 10283

Revision 10283, 10.3 kB (checked in by robert, 6 years ago)

From Gregory Jaegy and Robert Osfield, added support for static linking of OpenFlight? plugin

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
RevLine 
[7748]1/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2006 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
[5038]14//
15// OpenFlight® loader for OpenSceneGraph
16//
[7748]17//  Copyright (C) 2005-2007  Brede Johansen
[5038]18//
19
20#include <osg/MatrixTransform>
21#include <osg/Texture2D>
[6165]22#include <osg/TexEnv>
[5038]23
24#include "Registry.h"
25#include "Document.h"
26#include "RecordInputStream.h"
27
28namespace flt {
29
30/** Comment -
31  */
32class Comment : public Record
33{
34    public:
35
36        Comment() {}
37
38        META_Record(Comment)
39
40    protected:
41
42        virtual ~Comment() {}
43
[5222]44        virtual void readRecord(RecordInputStream& in, Document& /*document*/)
[5038]45        {
46            std::streamsize size = in.getRecordSize();
[9067]47            std::string commentfield = in.readString(size-4);
[5038]48
49            if (_parent.valid())
[9067]50            {
51#if 0           
52                _parent->setComment(commentfield);
53#else
54                unsigned int front_of_line = 0;
55                unsigned int end_of_line = 0;
56                while (end_of_line<commentfield.size())
57                {
58                    if (commentfield[end_of_line]=='\r')
59                    {
60                        _parent->setComment( std::string( commentfield, front_of_line, end_of_line-front_of_line) );
61
62                        if (end_of_line+1<commentfield.size() &&
63                            commentfield[end_of_line+1]=='\n') ++end_of_line;
64
65                        ++end_of_line;
66                        front_of_line = end_of_line;
67                    }
68                    else if (commentfield[end_of_line]=='\n')
69                    {
70                        _parent->setComment( std::string( commentfield, front_of_line, end_of_line-front_of_line) );
71                        ++end_of_line;
72                        front_of_line = end_of_line;
73                    }
74                    else ++end_of_line;
75                }
76                if (front_of_line<end_of_line)
77                {
78                    _parent->setComment( std::string( commentfield, front_of_line, end_of_line-front_of_line) );
79                }
80
81            }
82#endif
83
[5038]84        }
85};
86
[10283]87REGISTER_FLTRECORD(Comment, COMMENT_OP)
[5038]88
89
[10283]90
[5038]91/** LongID -
92  */
93class LongID : public Record
94{
95    public:
96
97        LongID() {}
98
99        META_Record(LongID)
100
101    protected:
102
103        virtual ~LongID() {}
104
[5222]105        virtual void readRecord(RecordInputStream& in, Document& /*document*/)
[5038]106        {
107            std::streamsize size = in.getRecordSize();
108            std::string id = in.readString(size-4);
109
110            if (_parent.valid())
111                _parent->setID(id);
112        }
113};
114
[10283]115REGISTER_FLTRECORD(LongID, LONG_ID_OP)
[5038]116
117
[10283]118
[5038]119/** Matrix -
120  */
121class Matrix : public Record
122{
123    public:
124
125        Matrix() {}
126
127        META_Record(Matrix)
128
129    protected:
130
131        virtual ~Matrix() {}
132
133        virtual void readRecord(RecordInputStream& in, Document& document)
134        {
135            osg::Matrix matrix;
136            for (int i=0; i<4; ++i)
137            {
138                for (int j=0; j<4; ++j)
139                {
140                    matrix(i,j) = in.readFloat32();
141                }
142            }
143
144            // scale position.
145            osg::Vec3 pos = matrix.getTrans();
146            matrix *= osg::Matrix::translate(-pos);
147            pos *= (float)document.unitScale();
148            matrix *= osg::Matrix::translate(pos);
149
150            if (_parent.valid())
151                _parent->setMatrix(matrix);
152        }
153};
154
[10283]155REGISTER_FLTRECORD(Matrix, MATRIX_OP)
[5038]156
157
[10283]158
[5038]159/** Multitexture -
160  */
161class Multitexture : public Record
162{
163    public:
164
165        Multitexture() {}
166
167        META_Record(Multitexture)
168
[6165]169        // Effect
170        enum EffectMode
171        {
172            TEXTURE_ENVIRONMENT = 0,
173            BUMP_MAP = 1
174        };
175
[5038]176    protected:
177
178        virtual ~Multitexture() {}
179
180        virtual void readRecord(RecordInputStream& in, Document& document)
181        {
182            osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet;
183
184            uint32 mask = in.readUInt32();
185            for (int layer=1; layer<8; layer++)
186            {
187                uint32 layerBit = 0x80000000u >> (layer-1);
188                if (mask & layerBit)
189                {
190                    int16 textureIndex = in.readInt16();
[6165]191                    int16 effect = in.readInt16();
192                    /*int16 mappingIndex =*/ in.readInt16();
193                    /*uint16 data =*/ in.readUInt16();
[5038]194
195                    osg::ref_ptr<osg::StateSet> texturePoolStateset = document.getOrCreateTexturePool()->get(textureIndex);
196                    if (stateset.valid() && texturePoolStateset.valid())
197                    {
[6165]198                        // Apply texture from texture pool.
199                        osg::Texture* texture = dynamic_cast<osg::Texture*>(texturePoolStateset->getTextureAttribute(0,osg::StateAttribute::TEXTURE));
[5038]200                        if (texture)
201                            stateset->setTextureAttributeAndModes(layer,texture,osg::StateAttribute::ON);
[6165]202
203                        // Apply texture environment
204                        switch (effect)
205                        {
206                        case TEXTURE_ENVIRONMENT:
207                            {
208                                // Use texture environment setting from .attr file.
209                                osg::TexEnv* texenv = dynamic_cast<osg::TexEnv*>(texturePoolStateset->getTextureAttribute(0,osg::StateAttribute::TEXENV));
210                                if (texenv)
211                                    stateset->setTextureAttribute(layer,texenv);
212                            }
213                            break;
214                        case BUMP_MAP:
215                            {
216                                // Dot3 bumpmap
217                                //osg::TexEnvCombine* texEnvCombine = new osg::TexEnvCombine;
218                                //texEnvCombine->setCombine_RGB(osg::TexEnvCombine::DOT3_RGB);
219                                //texEnvCombine->setSource0_RGB(osg::TexEnvCombine::PRIMARY_COLOR);
220                                //texEnvCombine->setSource1_RGB(osg::TexEnvCombine::TEXTURE);
221                                //stateset->setTextureAttribute(layer,texEnvCombine);
222                            }
223                            break;
224                        }
[5038]225                    }
226                }
227            }
228
229            if (_parent.valid())
230                _parent->setMultitexture(*stateset);
231        }
232};
233
[10283]234REGISTER_FLTRECORD(Multitexture, MULTITEXTURE_OP)
[5038]235
236
[10283]237
[5038]238/** UVList - Texture coordinates used with multitexture.
239    UVList is an ancillary to VertexList.
240  */
241class UVList : public Record
242{
243    public:
244
245        UVList() {}
246
247        META_Record(UVList)
248
249    protected:
250
251        virtual ~UVList() {}
252
253        // count number of 1's in mask.
254        int bitCount(uint32 mask)
255        {
256            int count = 0;
257            while (mask)
258            {
259                if (mask & 0x0001)
260                    ++count;
261                mask >>= 1;
262            }
263            return count;
264        }
265
[5229]266        virtual void readRecord(RecordInputStream& in, Document& /*document*/)
[5038]267        {
268            uint32 mask = in.readUInt32(0);
269
270            int numLayers = bitCount(mask);
271            int numVertices = (in.getRecordSize()-8) / (8 * numLayers);
272            for (int n=0; n < numVertices; ++n)
273            {
274                for (unsigned int layer=1; layer<8; layer++)
275                {
276                    uint32 layerBit = 0x80000000u >> (layer-1);
277                    if (mask & layerBit)
278                    {
[6165]279                        float32    u = in.readFloat32();
280                        float32    v = in.readFloat32();
[5038]281
[8563]282                        // Add texture coordinates to geometry.
[5038]283                        if (_parent.valid())
284                            _parent->addVertexUV(layer,osg::Vec2(u,v));
285                    }
286                }
287            }
288        }
289};
290
[10283]291REGISTER_FLTRECORD(UVList, UV_LIST_OP)
[5038]292
293
294/** Replicate -
295  */
296class Replicate : public Record
297{
298    public:
299
300        Replicate() {}
301
302        META_Record(Replicate)
303
304    protected:
305
306        virtual ~Replicate() {}
307
[5229]308        virtual void readRecord(RecordInputStream& in, Document& /*document*/)
[5038]309        {
310            int16 replicate = in.readInt16();
311
312            if (_parent.valid())
313                _parent->setNumberOfReplications((int)replicate);
314        }
315};
316
[10283]317REGISTER_FLTRECORD(Replicate, REPLICATE_OP)
[5038]318
319// Prevent "unknown record" message for the following ancillary records:
[10283]320REGISTER_FLTRECORD(DummyRecord, OLD_TRANSLATE2_OP)
321REGISTER_FLTRECORD(DummyRecord, OLD_ROTATE_ABOUT_POINT_OP)
322REGISTER_FLTRECORD(DummyRecord, OLD_ROTATE_ABOUT_EDGE_OP)
323REGISTER_FLTRECORD(DummyRecord, OLD_SCALE_OP)
324REGISTER_FLTRECORD(DummyRecord, OLD_TRANSLATE_OP)
325REGISTER_FLTRECORD(DummyRecord, OLD_NONUNIFORM_SCALE_OP)
326REGISTER_FLTRECORD(DummyRecord, OLD_ROTATE_ABOUT_POINT2_OP)
327REGISTER_FLTRECORD(DummyRecord, OLD_ROTATE_SCALE_TO_POINT_OP)
328REGISTER_FLTRECORD(DummyRecord, OLD_PUT_TRANSFORM_OP)
329REGISTER_FLTRECORD(DummyRecord, OLD_BOUNDING_BOX_OP)
330REGISTER_FLTRECORD(DummyRecord, INDEXED_STRING_OP)
331REGISTER_FLTRECORD(DummyRecord, ROAD_ZONE_OP)
332REGISTER_FLTRECORD(DummyRecord, ROTATE_ABOUT_EDGE_OP)
333REGISTER_FLTRECORD(DummyRecord, TRANSLATE_OP)
334REGISTER_FLTRECORD(DummyRecord, NONUNIFORM_SCALE_OP)
335REGISTER_FLTRECORD(DummyRecord, ROTATE_ABOUT_POINT_OP)
336REGISTER_FLTRECORD(DummyRecord, ROTATE_SCALE_TO_POINT_OP)
337REGISTER_FLTRECORD(DummyRecord, PUT_TRANSFORM_OP)
338REGISTER_FLTRECORD(DummyRecord, GENERAL_MATRIX_OP)
339REGISTER_FLTRECORD(DummyRecord, VECTOR_OP)
340REGISTER_FLTRECORD(DummyRecord, BOUNDING_BOX_OP)
341REGISTER_FLTRECORD(DummyRecord, BOUNDING_SPHERE_OP)
342REGISTER_FLTRECORD(DummyRecord, BOUNDING_CYLINDER_OP)
343REGISTER_FLTRECORD(DummyRecord, BOUNDING_CONVEX_HULL_OP)
344REGISTER_FLTRECORD(DummyRecord, BOUNDING_HISTOGRAM)
345REGISTER_FLTRECORD(DummyRecord, BOUNDING_VOLUME_CENTER_OP)
346REGISTER_FLTRECORD(DummyRecord, BOUNDING_VOLUME_ORIENTATION_OP)
347REGISTER_FLTRECORD(DummyRecord, HISTOGRAM_BOUNDING_VOLUME_OP)
[5038]348
[10283]349
[5038]350} // end namespace
Note: See TracBrowser for help on using the browser.