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

Revision 13041, 10.8 kB (checked in by robert, 2 years ago)

Ran script to remove trailing spaces and tabs

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
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
14//
15// OpenFlight® loader for OpenSceneGraph
16//
17//  Copyright (C) 2005-2007  Brede Johansen
18//
19
20#include <osg/MatrixTransform>
21#include <osg/Texture2D>
22#include <osg/TexEnv>
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
44        virtual void readRecord(RecordInputStream& in, Document& /*document*/)
45        {
46            std::streamsize size = in.getRecordSize();
47            std::string commentfield = in.readString(size-4);
48
49            if (_parent.valid())
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
84        }
85};
86
87REGISTER_FLTRECORD(Comment, COMMENT_OP)
88
89
90
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
105        virtual void readRecord(RecordInputStream& in, Document& /*document*/)
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
115REGISTER_FLTRECORD(LongID, LONG_ID_OP)
116
117
118
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
155REGISTER_FLTRECORD(Matrix, MATRIX_OP)
156
157
158
159/** Multitexture -
160  */
161class Multitexture : public Record
162{
163    public:
164
165        Multitexture() {}
166
167        META_Record(Multitexture)
168
169        // Effect
170        enum EffectMode
171        {
172            TEXTURE_ENVIRONMENT = 0,
173            BUMP_MAP = 1
174        };
175
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();
191                    int16 effect = in.readInt16();
192                    /*int16 mappingIndex =*/ in.readInt16();
193                    /*uint16 data =*/ in.readUInt16();
194
195                    osg::ref_ptr<osg::StateSet> texturePoolStateset = document.getOrCreateTexturePool()->get(textureIndex);
196                    if (stateset.valid() && texturePoolStateset.valid())
197                    {
198                        // Apply texture from texture pool.
199                        osg::Texture* texture = dynamic_cast<osg::Texture*>(texturePoolStateset->getTextureAttribute(0,osg::StateAttribute::TEXTURE));
200                        if (texture)
201                            stateset->setTextureAttributeAndModes(layer,texture,osg::StateAttribute::ON);
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                        }
225                    }
226                }
227            }
228
229            if (_parent.valid())
230                _parent->setMultitexture(*stateset);
231        }
232};
233
234REGISTER_FLTRECORD(Multitexture, MULTITEXTURE_OP)
235
236
237
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
266        virtual void readRecord(RecordInputStream& in, Document& /*document*/)
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                    {
279                        float32    u = in.readFloat32();
280                        float32    v = in.readFloat32();
281
282                        // Add texture coordinates to geometry.
283                        if (_parent.valid())
284                            _parent->addVertexUV(layer,osg::Vec2(u,v));
285                    }
286                }
287            }
288        }
289};
290
291REGISTER_FLTRECORD(UVList, UV_LIST_OP)
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
308        virtual void readRecord(RecordInputStream& in, Document& /*document*/)
309        {
310            int16 replicate = in.readInt16();
311
312            if (_parent.valid())
313                _parent->setNumberOfReplications((int)replicate);
314        }
315};
316
317REGISTER_FLTRECORD(Replicate, REPLICATE_OP)
318
319
320/** IndexedString -
321  */
322class IndexedString : public Record
323{
324    public:
325
326        IndexedString() {}
327
328        META_Record(IndexedString)
329
330    protected:
331
332        virtual ~IndexedString() {}
333
334        virtual void readRecord(RecordInputStream& in, Document& /*document*/)
335        {
336            std::streamsize size = in.getRecordSize();
337            uint32 index = in.readUInt32();
338            std::string name = in.readString(size-8);
339
340            if (_parent.valid())
341                _parent->setMultiSwitchValueName(index, name);
342        }
343};
344
345REGISTER_FLTRECORD(IndexedString, INDEXED_STRING_OP)
346
347
348// Prevent "unknown record" message for the following ancillary records:
349REGISTER_FLTRECORD(DummyRecord, OLD_TRANSLATE2_OP)
350REGISTER_FLTRECORD(DummyRecord, OLD_ROTATE_ABOUT_POINT_OP)
351REGISTER_FLTRECORD(DummyRecord, OLD_ROTATE_ABOUT_EDGE_OP)
352REGISTER_FLTRECORD(DummyRecord, OLD_SCALE_OP)
353REGISTER_FLTRECORD(DummyRecord, OLD_TRANSLATE_OP)
354REGISTER_FLTRECORD(DummyRecord, OLD_NONUNIFORM_SCALE_OP)
355REGISTER_FLTRECORD(DummyRecord, OLD_ROTATE_ABOUT_POINT2_OP)
356REGISTER_FLTRECORD(DummyRecord, OLD_ROTATE_SCALE_TO_POINT_OP)
357REGISTER_FLTRECORD(DummyRecord, OLD_PUT_TRANSFORM_OP)
358REGISTER_FLTRECORD(DummyRecord, OLD_BOUNDING_BOX_OP)
359REGISTER_FLTRECORD(DummyRecord, ROAD_ZONE_OP)
360REGISTER_FLTRECORD(DummyRecord, ROTATE_ABOUT_EDGE_OP)
361REGISTER_FLTRECORD(DummyRecord, TRANSLATE_OP)
362REGISTER_FLTRECORD(DummyRecord, NONUNIFORM_SCALE_OP)
363REGISTER_FLTRECORD(DummyRecord, ROTATE_ABOUT_POINT_OP)
364REGISTER_FLTRECORD(DummyRecord, ROTATE_SCALE_TO_POINT_OP)
365REGISTER_FLTRECORD(DummyRecord, PUT_TRANSFORM_OP)
366REGISTER_FLTRECORD(DummyRecord, GENERAL_MATRIX_OP)
367REGISTER_FLTRECORD(DummyRecord, VECTOR_OP)
368REGISTER_FLTRECORD(DummyRecord, BOUNDING_BOX_OP)
369REGISTER_FLTRECORD(DummyRecord, BOUNDING_SPHERE_OP)
370REGISTER_FLTRECORD(DummyRecord, BOUNDING_CYLINDER_OP)
371REGISTER_FLTRECORD(DummyRecord, BOUNDING_CONVEX_HULL_OP)
372REGISTER_FLTRECORD(DummyRecord, BOUNDING_HISTOGRAM)
373REGISTER_FLTRECORD(DummyRecord, BOUNDING_VOLUME_CENTER_OP)
374REGISTER_FLTRECORD(DummyRecord, BOUNDING_VOLUME_ORIENTATION_OP)
375REGISTER_FLTRECORD(DummyRecord, HISTOGRAM_BOUNDING_VOLUME_OP)
376
377
378} // end namespace
Note: See TracBrowser for help on using the browser.