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

Revision 9067, 10.9 kB (checked in by robert, 6 years ago)

Merged in comment split code from the old flt plugin so that FLT comments string with returns
in them are put into separate description entries.

  • 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
87RegisterRecordProxy<Comment>    g_Comment(COMMENT_OP);
88
89
90/** LongID -
91  */
92class LongID : public Record
93{
94    public:
95
96        LongID() {}
97
98        META_Record(LongID)
99
100    protected:
101
102        virtual ~LongID() {}
103
[5222]104        virtual void readRecord(RecordInputStream& in, Document& /*document*/)
[5038]105        {
106            std::streamsize size = in.getRecordSize();
107            std::string id = in.readString(size-4);
108
109            if (_parent.valid())
110                _parent->setID(id);
111        }
112};
113
114RegisterRecordProxy<LongID> g_LongID(LONG_ID_OP);
115
116
117/** Matrix -
118  */
119class Matrix : public Record
120{
121    public:
122
123        Matrix() {}
124
125        META_Record(Matrix)
126
127    protected:
128
129        virtual ~Matrix() {}
130
131        virtual void readRecord(RecordInputStream& in, Document& document)
132        {
133            osg::Matrix matrix;
134            for (int i=0; i<4; ++i)
135            {
136                for (int j=0; j<4; ++j)
137                {
138                    matrix(i,j) = in.readFloat32();
139                }
140            }
141
142            // scale position.
143            osg::Vec3 pos = matrix.getTrans();
144            matrix *= osg::Matrix::translate(-pos);
145            pos *= (float)document.unitScale();
146            matrix *= osg::Matrix::translate(pos);
147
148            if (_parent.valid())
149                _parent->setMatrix(matrix);
150        }
151};
152
153RegisterRecordProxy<Matrix> g_Matrix(MATRIX_OP);
154
155
156/** Multitexture -
157  */
158class Multitexture : public Record
159{
160    public:
161
162        Multitexture() {}
163
164        META_Record(Multitexture)
165
[6165]166        // Effect
167        enum EffectMode
168        {
169            TEXTURE_ENVIRONMENT = 0,
170            BUMP_MAP = 1
171        };
172
[5038]173    protected:
174
175        virtual ~Multitexture() {}
176
177        virtual void readRecord(RecordInputStream& in, Document& document)
178        {
179            osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet;
180
181            uint32 mask = in.readUInt32();
182            for (int layer=1; layer<8; layer++)
183            {
184                uint32 layerBit = 0x80000000u >> (layer-1);
185                if (mask & layerBit)
186                {
187                    int16 textureIndex = in.readInt16();
[6165]188                    int16 effect = in.readInt16();
189                    /*int16 mappingIndex =*/ in.readInt16();
190                    /*uint16 data =*/ in.readUInt16();
[5038]191
192                    osg::ref_ptr<osg::StateSet> texturePoolStateset = document.getOrCreateTexturePool()->get(textureIndex);
193                    if (stateset.valid() && texturePoolStateset.valid())
194                    {
[6165]195                        // Apply texture from texture pool.
196                        osg::Texture* texture = dynamic_cast<osg::Texture*>(texturePoolStateset->getTextureAttribute(0,osg::StateAttribute::TEXTURE));
[5038]197                        if (texture)
198                            stateset->setTextureAttributeAndModes(layer,texture,osg::StateAttribute::ON);
[6165]199
200                        // Apply texture environment
201                        switch (effect)
202                        {
203                        case TEXTURE_ENVIRONMENT:
204                            {
205                                // Use texture environment setting from .attr file.
206                                osg::TexEnv* texenv = dynamic_cast<osg::TexEnv*>(texturePoolStateset->getTextureAttribute(0,osg::StateAttribute::TEXENV));
207                                if (texenv)
208                                    stateset->setTextureAttribute(layer,texenv);
209                            }
210                            break;
211                        case BUMP_MAP:
212                            {
213                                // Dot3 bumpmap
214                                //osg::TexEnvCombine* texEnvCombine = new osg::TexEnvCombine;
215                                //texEnvCombine->setCombine_RGB(osg::TexEnvCombine::DOT3_RGB);
216                                //texEnvCombine->setSource0_RGB(osg::TexEnvCombine::PRIMARY_COLOR);
217                                //texEnvCombine->setSource1_RGB(osg::TexEnvCombine::TEXTURE);
218                                //stateset->setTextureAttribute(layer,texEnvCombine);
219                            }
220                            break;
221                        }
[5038]222                    }
223                }
224            }
225
226            if (_parent.valid())
227                _parent->setMultitexture(*stateset);
228        }
229};
230
231RegisterRecordProxy<Multitexture> g_Multitexture(MULTITEXTURE_OP);
232
233
234/** UVList - Texture coordinates used with multitexture.
235    UVList is an ancillary to VertexList.
236  */
237class UVList : public Record
238{
239    public:
240
241        UVList() {}
242
243        META_Record(UVList)
244
245    protected:
246
247        virtual ~UVList() {}
248
249        // count number of 1's in mask.
250        int bitCount(uint32 mask)
251        {
252            int count = 0;
253            while (mask)
254            {
255                if (mask & 0x0001)
256                    ++count;
257                mask >>= 1;
258            }
259            return count;
260        }
261
[5229]262        virtual void readRecord(RecordInputStream& in, Document& /*document*/)
[5038]263        {
264            uint32 mask = in.readUInt32(0);
265
266            int numLayers = bitCount(mask);
267            int numVertices = (in.getRecordSize()-8) / (8 * numLayers);
268            for (int n=0; n < numVertices; ++n)
269            {
270                for (unsigned int layer=1; layer<8; layer++)
271                {
272                    uint32 layerBit = 0x80000000u >> (layer-1);
273                    if (mask & layerBit)
274                    {
[6165]275                        float32    u = in.readFloat32();
276                        float32    v = in.readFloat32();
[5038]277
[8563]278                        // Add texture coordinates to geometry.
[5038]279                        if (_parent.valid())
280                            _parent->addVertexUV(layer,osg::Vec2(u,v));
281                    }
282                }
283            }
284        }
285};
286
287RegisterRecordProxy<UVList> g_UVList(UV_LIST_OP);
288
289
290/** Replicate -
291  */
292class Replicate : public Record
293{
294    public:
295
296        Replicate() {}
297
298        META_Record(Replicate)
299
300    protected:
301
302        virtual ~Replicate() {}
303
[5229]304        virtual void readRecord(RecordInputStream& in, Document& /*document*/)
[5038]305        {
306            int16 replicate = in.readInt16();
307
308            if (_parent.valid())
309                _parent->setNumberOfReplications((int)replicate);
310        }
311};
312
313RegisterRecordProxy<Replicate> g_Replicate(REPLICATE_OP);
314
315
316// Prevent "unknown record" message for the following ancillary records:
317RegisterRecordProxy<DummyRecord> g_OldTranslate(OLD_TRANSLATE2_OP);
318RegisterRecordProxy<DummyRecord> g_OldRotateAboutPoint(OLD_ROTATE_ABOUT_POINT_OP);
319RegisterRecordProxy<DummyRecord> g_OldRotateAboutEdge(OLD_ROTATE_ABOUT_EDGE_OP);
320RegisterRecordProxy<DummyRecord> g_OldScale(OLD_SCALE_OP);
321RegisterRecordProxy<DummyRecord> g_OldTranslate2(OLD_TRANSLATE_OP);
322RegisterRecordProxy<DummyRecord> g_OldNonuniformScale(OLD_NONUNIFORM_SCALE_OP);
323RegisterRecordProxy<DummyRecord> g_OldRotateAboutPoint2(OLD_ROTATE_ABOUT_POINT2_OP);
324RegisterRecordProxy<DummyRecord> g_OldRotateScaleToPoint(OLD_ROTATE_SCALE_TO_POINT_OP);
325RegisterRecordProxy<DummyRecord> g_OldPutTransform(OLD_PUT_TRANSFORM_OP);
326RegisterRecordProxy<DummyRecord> g_OldBoundingBox(OLD_BOUNDING_BOX_OP);
327RegisterRecordProxy<DummyRecord> g_IndexedString(INDEXED_STRING_OP);
328RegisterRecordProxy<DummyRecord> g_RoadZone(ROAD_ZONE_OP);
329RegisterRecordProxy<DummyRecord> g_RotateAboutEdge(ROTATE_ABOUT_EDGE_OP);
330RegisterRecordProxy<DummyRecord> g_Translate(TRANSLATE_OP);
331RegisterRecordProxy<DummyRecord> g_Scale(NONUNIFORM_SCALE_OP);
332RegisterRecordProxy<DummyRecord> g_RotateAboutPoint(ROTATE_ABOUT_POINT_OP);
333RegisterRecordProxy<DummyRecord> g_RotateScaleToPoint(ROTATE_SCALE_TO_POINT_OP);
334RegisterRecordProxy<DummyRecord> g_PutTransform(PUT_TRANSFORM_OP);
335RegisterRecordProxy<DummyRecord> g_GeneralMatrix(GENERAL_MATRIX_OP);
336RegisterRecordProxy<DummyRecord> g_Vector(VECTOR_OP);
337RegisterRecordProxy<DummyRecord> g_BoundingBox(BOUNDING_BOX_OP);
338RegisterRecordProxy<DummyRecord> g_BoundingSphere(BOUNDING_SPHERE_OP);
339RegisterRecordProxy<DummyRecord> g_BoundingCylinder(BOUNDING_CYLINDER_OP);
340RegisterRecordProxy<DummyRecord> g_BoundingConvexHull(BOUNDING_CONVEX_HULL_OP);
341RegisterRecordProxy<DummyRecord> g_BoundingHistogram(BOUNDING_HISTOGRAM);
342RegisterRecordProxy<DummyRecord> g_BoundingVolumeCenter(BOUNDING_VOLUME_CENTER_OP);
343RegisterRecordProxy<DummyRecord> g_BoundingVolumeOrientation(BOUNDING_VOLUME_ORIENTATION_OP);
344RegisterRecordProxy<DummyRecord> g_HistogramBoundingVolume(HISTOGRAM_BOUNDING_VOLUME_OP);
345
346} // end namespace
Note: See TracBrowser for help on using the browser.