root/OpenSceneGraph/trunk/src/osgPlugins/flt/ReaderWriterATTR.cpp @ 3527

Revision 3527, 29.1 kB (checked in by robert, 10 years ago)

From Fred Mammond, fixes for x86_64 build

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
Line 
1
2//
3// OpenFlight® texture attribute loader for Open Scene Graph
4//
5//  Copyright (C) 2001  Brede Johansen
6//
7//  This software is provided 'as-is', without any express or implied
8//  warranty.  In no event will the authors be held liable for any damages
9//  arising from the use of this software.
10//
11//  Permission is granted to anyone to use this software for any purpose,
12//  including commercial applications, and to alter it and redistribute it
13//  freely, subject to the following restrictions:
14//
15//  1. The origin of this software must not be misrepresented; you must not
16//     claim that you wrote the original software. If you use this software
17//     in a product, an acknowledgment in the product documentation would be
18//     appreciated but is not required.
19//  2. Altered source versions must be plainly marked as such, and must not be
20//     misrepresented as being the original software.
21//  3. This notice may not be removed or altered from any source distribution.
22//
23//  The Open Scene Graph (OSG) is a cross platform C++/OpenGL library for
24//  real-time rendering of large 3D photo-realistic models.
25//  The OSG homepage is http://www.openscenegraph.org/
26//
27//  MultiGen, OpenFlight, and Flight Format are registered trademarks of MultiGen Inc.
28//
29
30#include <stdio.h>
31#include <string.h>
32
33#include <osg/Notify>
34#include <osg/TexEnv>
35#include <osg/Texture2D>
36#include <osg/StateSet>
37#include <osg/GL>
38
39#include <osgDB/FileNameUtils>
40#include <osgDB/FileUtils>
41#include <osgDB/Registry>
42
43#include <iostream>
44#include <fstream>
45
46#include "AttrData.h"
47
48typedef signed char     int8;
49typedef unsigned char   uint8;
50typedef signed short    int16;
51typedef unsigned short  uint16;
52typedef signed int      int32;
53typedef unsigned int    uint32;
54typedef float           float32;
55typedef double          float64;
56
57#define READ(DST) readField(file, (void*)&(DST), sizeof(DST))
58
59
60static int isLittleEndianMachine()
61{
62    int a = 1;
63    return (int)(*(char*)&a);
64}
65
66
67static void endian2(void* pSrc, int nSrc, void* pDst)
68{
69    if (nSrc == 2)
70    {
71        short tmp1;
72        tmp1 = *(short *)pSrc;
73        tmp1 = (tmp1 << 8) | ((tmp1 >> 8) & 0xff);
74        *(short *)pDst = tmp1;
75    }
76    else if (nSrc == 4)
77    {
78        uint32 tmp1;
79        tmp1 = *(uint32 *)pSrc;
80        tmp1 = (tmp1 << 24) | ((tmp1 << 8) & 0xff0000) | ((tmp1 >> 8) & 0xff00) | ((tmp1 >> 24) & 0xff);
81        *(uint32 *)pDst = tmp1;
82    }
83    else if (nSrc == 8)
84    {
85        uint32 tmp1, tmp2;
86        tmp1 = *(uint32 *)pSrc;
87        tmp2 = *(1 + (uint32 *)pSrc);
88        tmp1 = (tmp1 << 24) | ((tmp1 << 8) & 0xff0000) | ((tmp1 >> 8) & 0xff00) | ((tmp1 >> 24) & 0xff);
89        tmp2 = (tmp2 << 24) | ((tmp2 << 8) & 0xff0000) | ((tmp2 >> 8) & 0xff00) | ((tmp2 >> 24) & 0xff);
90        *(uint32 *)pDst = tmp2;
91        *(1 + (uint32 *)pDst) = tmp1;
92    }
93}
94
95
96using namespace osg;
97
98class Attr
99{
100    public :
101
102        enum MinFilterMode {
103            MIN_FILTER_POINT = 0,
104            MIN_FILTER_BILINEAR = 1,
105            MIN_FILTER_MIPMAP = 2,                      // (Obsolete)
106            MIN_FILTER_MIPMAP_POINT = 3,
107            MIN_FILTER_MIPMAP_LINEAR = 4,
108            MIN_FILTER_MIPMAP_BILINEAR = 5,
109            MIN_FILTER_MIPMAP_TRILINEAR = 6,
110            MIN_FILTER_NONE = 7,
111            MIN_FILTER_BICUBIC = 8,
112            MIN_FILTER_BILINEAR_GEQUAL = 9,
113            MIN_FILTER_BILINEAR_LEQUAL = 10,
114            MIN_FILTER_BICUBIC_GEQUAL = 11,
115            MIN_FILTER_BICUBIC_LEQUAL = 12
116        };
117
118        enum MagFilterMode {
119            MAG_FILTER_POINT = 0,
120            MAG_FILTER_BILINEAR = 1,
121            MAG_FILTER_NONE = 2,
122            MAG_FILTER_BICUBIC = 3,
123            MAG_FILTER_SHARPEN = 4,
124            MAG_FILTER_ADD_DETAIL = 5,
125            MAG_FILTER_MODULATE_DETAIL = 6,
126            MAG_FILTER_BILINEAR_GEQUAL = 7,
127            MAG_FILTER_BILINEAR_LEQUAL = 8,
128            MAG_FILTER_BICUBIC_GEQUAL = 9,
129            MAG_FILTER_BICUBIC_LEQUAL = 10
130        };
131
132        enum WrapMode {
133            WRAP_REPEAT = 0,
134            WRAP_CLAMP = 1
135        };
136
137        enum TexEnvMode {
138            TEXENV_MODULATE = 0,
139            TEXENV_BLEND = 1,
140            TEXENV_DECAL = 2,
141            TEXENV_COLOR = 3
142        };
143
144        enum Projection {
145            PROJECTION_FLAT = 0,
146            PROJECTION_LAMBERT_CONIC = 3,
147            PROJECTION_UTM = 4,
148            PROJECTION_UNDEFINED = 7
149        };
150
151        enum Datum {
152            DATUM_WGS84 = 0,
153            DATUM_WGS72 = 1,
154            DATUM_BESSEL = 2,
155            DATUM_CLARK_1866 = 3,
156            DATUM_NAD27 = 4
157        };
158
159
160        Attr(int version) : _flt_version(version) { init(); }
161        void    init();
162        void    readField(std::ifstream& file, void* buf, size_t size);
163        bool    readAttrFile(const char* szName);
164        flt::AttrData* createOsgStateSet();
165
166
167   
168        int32   texels_u;               // Number of texels in u direction
169        int32   textel_v;               // Number of texels in v direction
170        int32   direction_u;            // Real world size u direction
171        int32   direction_v;            // Real world size v direction
172        int32   x_up;                   // x component of up vector
173        int32   y_up;                   // y component of up vector
174        int32   fileFormat;             // File format type
175                                        //   -1 Not used
176                                        //    0 AT&T image 8 pattern
177                                        //    1 AT&T image 8 template
178                                        //    2 SGI intensity modulation
179                                        //    3 SGI intensity w/ alpha
180                                        //    4 SGI RGB
181                                        //    5 SGI RGB w/ alpha
182        int32   minFilterMode;          // Minification filter type
183                                        //    0 - TX_POINT
184                                        //    1 - TX_BILINEAR
185                                        //    2 - TX_MIPMAP (Obsolete)
186                                        //    3 - TX_MIPMAP_POINT
187                                        //    4 - TX_MIPMAP_LINEAR
188                                        //    5 - TX_MIPMAP_BILINEAR
189                                        //    6 - TX_MIPMAP_TRILINEAR
190                                        //    7 - None
191                                        //    8 - TX_BICUBIC
192                                        //    9 - TX_BILINEAR_GEQUAL
193                                        //   10 - TX_BILINEAR_LEQUAL
194                                        //   11 - TX_BICUBIC_GEQUAL
195                                        //   12 - TX_BICUBIC_LEQUAL
196        int32   magFilterMode;          // Magnification filter type
197                                        //    0 - TX_POINT
198                                        //    1 - TX_BILINEAR
199                                        //    2 - None
200                                        //    3 - TX_BICUBIC
201                                        //    4 - TX_SHARPEN
202                                        //    5 - TX_ADD_DETAIL
203                                        //    6 - TX_MODULATE_DETAIL
204                                        //    7 - TX_BILINEAR_GEQUAL
205                                        //    8 - TX_BILINEAR_LEQUAL
206                                        //    9 - TX_BICUBIC_GEQUAL
207                                        //   10 - TX_BICUBIC_LEQUAL
208        int32   wrapMode;               // Repetition type
209                                        //    0 - TX_REPEAT
210                                        //    1 - TX_CLAMP
211                                        //    2 - (Obsolete)
212        int32   wrapMode_u;             // Repetition type in u direction (see above)
213        int32   wrapMode_v;             // Repetition type in v direction (see above)
214        int32   modifyFlag;             // Modify flag (for internal use)
215        int32   pivot_x;                // x pivot point for rotating textures
216        int32   pivot_y;                // y pivot point for rotating textures
217
218        // --------------
219        // v11 ends here
220        // --------------
221
222        int32   texEnvMode;             // Environment type
223                                        //    0 - TV_MODULATE
224                                        //    1 - TV_BLEND
225                                        //    2 - TV_DECAL
226                                        //    3 - TV_COLOR
227        int32   intensityAsAlpha;       // TRUE if intensity pattern to be loaded in alpha with white in color
228        int32   spare1[8];              // 8 words of spare
229        float64 size_u;                 // Real world size u for floating point databases
230        float64 size_v;                 // Real world size v for floating point databases
231        int32   originCode;             // Code for origin of imported texture
232        int32   kernelVersion;          // Kernel version number
233        int32   intFormat;              // Internal format type
234                                        //    0 - Default
235                                        //    1 - TX_I_12A_4
236                                        //    2 - TX_IA_8
237                                        //    3 - TX_RGB_5
238                                        //    4 - TX_RGBA_4
239                                        //    5 - TX_IA_12
240                                        //    6 - TX_RGBA_8
241                                        //    7 - TX_RGBA_12
242                                        //    8 - TX_I_16 (shadow mode only)
243                                        //    9 - TX_RGB_12
244        int32   extFormat;              // External format type
245                                        //    0 - Default
246                                        //    1 - TX_PACK_8
247                                        //    2 - TX_PACK_16
248        int32   useMips;                // TRUE if using following 8 floats for MIPMAP kernel
249        float32 _mipMapKernel[8];                // 8 floats for kernel of separable symmetric filter
250        int32   useLodScale;            // Boolean if TRUE send:
251        float32 lod0;                   // LOD0 for TX_CONTROL_POINT
252        float32 scale0;                 // SCALE0 for TX_CONTROL_POINT
253        float32 lod1;                   // LOD1 for TX_CONTROL_POINT
254        float32 scale1;                 // SCALE1 for TX_CONTROL_POINT
255        float32 lod2;                   // LOD2 for TX_CONTROL_POINT
256        float32 scale2;                 // SCALE2 for TX_CONTROL_POINT
257        float32 lod3;                   // LOD3 for TX_CONTROL_POINT
258        float32 scale3;                 // SCALE3 for TX_CONTROL_POINT
259        float32 lod4;                   // LOD4 for TX_CONTROL_POINT
260        float32 scale4;                 // SCALE4 for TX_CONTROL_POINT
261        float32 lod5;                   // LOD5 for TX_CONTROL_POINT
262        float32 scale5;                 // SCALE5 for TX_CONTROL_POINT
263        float32 lod6;                   // LOD6 for TX_CONTROL_POINT
264        float32 scale6;                 // SCALE6 for TX_CONTROL_POINT
265        float32 lod7;                   // LOD7 for TX_CONTROL_POINT
266        float32 scale7;                 // SCALE7 for TX_CONTROL_POINT
267
268        float32 clamp;                  // Clamp
269        int32   magFilterAlpha;         // magfilteralpha:
270                                        //    0 = TX_POINT
271                                        //    1 = TX_BILINEAR
272                                        //    2 = None
273                                        //    3 = TX_BICUBIC
274                                        //    4 = TX_SHARPEN
275                                        //    5 = TX_ADD_DETAIL
276                                        //    6 = TX_MODULATE_DETAIL
277                                        //    7 = TX_BILINEAR_GEQUAL
278                                        //    8 = TX_BILINEAR_LEQUAL
279                                        //    9 = TX_BICUBIC_GEQUAL
280                                        //    10 = TX_BIBICUBIC_LEQUAL
281        int32   magFilterColor;         // magfiltercolor:
282                                        //    0 = TX_POINT
283                                        //    1 = TX_BILINEAR
284                                        //    2 = None
285                                        //    3 = TX_BICUBIC
286                                        //    4 = TX_SHARPEN
287                                        //    5 = TX_ADD_DETAIL
288                                        //    6 = TX_MODULATE_DETAIL
289                                        //    7 = TX_BILINEAR_GEQUAL
290                                        //    8 = TX_BILINEAR_LEQUAL
291                                        //    9 = TX_BICUBIC_GEQUAL
292                                        //   10 = TX_BIBICUBIC_LEQUAL
293        float32 reserved1;              // Reserved
294        float32 reserved2[8];           // Reserved
295        float64 lambertMeridian;        // Lambert conic projection central meridian
296        float64 lambertUpperLat;        // Lambert conic projection upper latitude
297        float64 lambertlowerLat;        // Lambert conic projection lower latitude
298        float64 reserved3;              // Reserved
299        float32 spare2[5];              // Spare
300        int32   useDetail;              // TRUE if using next 5 integers for detail texture
301        int32   txDetail_j;             // J argument for TX_DETAIL
302        int32   txDetail_k;             // K argument for TX_DETAIL
303        int32   txDetail_m;             // M argument for TX_DETAIL
304        int32   txDetail_n;             // N argument for TX_DETAIL
305        int32   txDetail_s;             // Scramble argument for TX_DETAIL
306        int32   useTile;                // TRUE if using next for floats for TX_TILE
307        float32 txTile_ll_u;            // Lower-left u value for TX_TILE
308        float32 txTile_ll_v;            // Lower-left v value for TX_TILE
309        float32 txTile_ur_u;            // Upper-right u value for TX_TILE
310        float32 txTile_ur_v;            // Upper-right v value for TX_TILE
311        int32   projection;             // Projection
312                                        //    0 = Flat earth
313                                        //    3 = Lambert conic
314                                        //    4 = UTM
315                                        //    7 = Undefined projection
316        int32   earthModel;             // Earth model
317                                        //    0 = WGS84
318                                        //    1 = WGS72
319                                        //    2 = Bessel
320                                        //    3 = Clark 1866
321                                        //    4 = NAD27
322        int32   reserved4;              // Reserved
323        int32   utmZone;                // UTM zone
324        int32   imageOrigin;            // Image origin
325                                        //    0 = Lower-left
326                                        //    1 = Upper-left
327        int32   geoUnits;               // Geospecific points units
328                                        //    0 = Degrees
329                                        //    1 = Meters
330                                        //    2 = Pixels
331        int32   reserved5;              // Reserved
332        int32   reserved6;              // Reserved
333        int32   hemisphere;             // Hemisphere for geospecific points units
334                                        //    0 = Southern
335                                        //    1 = Northern
336        int32   reserved7;              // Reserved
337        int32   reserved8;              // Reserved
338        int32   spare3[149];            // Spare
339        char    comments[512];          // Comments
340
341        // --------------
342        // v12 ends here
343        // --------------
344
345        int32   reserved9[13];          // Reserved
346        int32   attrVersion;            // Attribute file version number
347
348        int32   controlPoints;          // Number of geospecific control points
349        // If the number of geospecific control points is > 0,
350        // the following fields are also in the attribute file:
351        int32   reserved10;             // Reserved
352    #if 0
353        // For each geospecific control point:
354        {
355            float64 texel_u;            // Texel u of geospecific control point
356            float64 texel_v;            // Texel v of geospecific control point
357            float64 geoPoint[2];        // Real earth coordinate of geospecific control point
358                                        // (this value depends on the projection, earth model,
359                                        // and geospecific points units)
360        }                               
361
362        // ----------------
363        // v15.6 ends here
364        // ----------------
365
366        // After all geospecific control points are listed, the following subtexture
367        // information appears:
368        int32   subtextures;            // Number of subtexture definitions contained in the
369                                        // texture attribute file
370        // If the number of subtexture definitions is >0,
371        // the following fields are repeated for each subtexture definition:
372        {
373            char    name[32];           // name of subtexture definition
374            int32   left;               // Coordinate of left edge of subtexture
375                                        // definition measured in texels.
376            int32   bottom;             // Coordinate of bottom edge of subtexture
377                                        // definition measured in texels.
378            int32   right;              // Coordinate of right edge of subtexture
379                                        // definition measured in texels.
380            int32   top;                // Coordinate of top edge of subtexture
381                                        // definition measured in texels.
382        }
383    #endif
384
385        void read();
386
387    private :
388
389        int _flt_version;
390};
391
392
393
394void Attr::init()
395{
396    texels_u = 0;
397    textel_v = 0;
398    direction_u = 0;
399    direction_v = 0;
400    x_up = 0;
401    y_up = 0;
402    fileFormat = -1;                //   -1 Not used
403    minFilterMode = MIN_FILTER_NONE;
404    magFilterMode = MAG_FILTER_POINT;
405    wrapMode = WRAP_REPEAT;
406    wrapMode_u = WRAP_REPEAT;
407    wrapMode_v = WRAP_REPEAT;
408    modifyFlag = 0;
409    pivot_x = 0;
410    pivot_y = 0;
411    texEnvMode = TEXENV_MODULATE;
412    intensityAsAlpha = 0;
413    size_u = 0;
414    size_v = 0;
415    originCode = 0;
416    kernelVersion = 0;
417    intFormat = 0;                  //    0 - Default
418    extFormat = 0;                  //    0 - Default
419    useMips = 0;
420    // float32 _mipMapKernel[8];
421    useLodScale = 0;
422    // float32 lod0;
423    // float32 scale0;
424    // ...
425    // float32 lod7;
426    // float32 scale7;
427    clamp = 0;
428    magFilterAlpha = 2;             //    2 = None
429    magFilterColor = 2;             //    2 = None
430    lambertMeridian = 0;
431    lambertUpperLat = 0;
432    lambertlowerLat = 0;
433    useDetail = 0;
434    txDetail_j = 0;
435    txDetail_k = 0;
436    txDetail_m = 0;
437    txDetail_n = 0;
438    txDetail_s = 0;
439    useTile = 0;
440    txTile_ll_u = 0;
441    txTile_ll_v = 0;
442    txTile_ur_u = 0;
443    txTile_ur_v = 0;
444    projection = PROJECTION_UNDEFINED;
445    earthModel = DATUM_WGS84;
446    utmZone = 0;
447    imageOrigin = 0;
448    geoUnits = 0;
449    hemisphere = 1;
450    comments[0] = '\0';
451    attrVersion = 0;
452    controlPoints = 0;
453    // TODO:
454}                               
455
456
457void Attr::readField(std::ifstream& file, void* buf, size_t size)
458{
459    if (file.eof()) return;
460    file.read((char*)buf, size);
461    if(::isLittleEndianMachine())
462        ::endian2(buf, size, buf);
463}
464
465
466bool Attr::readAttrFile(const char* szName)
467{
468    int n;
469    std::ifstream file;
470
471    file.open (szName, std::ios::in | std::ios::binary);   
472
473    READ( texels_u );
474    READ( textel_v );
475    READ( direction_u );
476    READ( direction_v );
477    READ( x_up );
478    READ( y_up );
479    READ( fileFormat );
480    READ( minFilterMode );
481    READ( magFilterMode );
482    READ( wrapMode );
483    READ( wrapMode_u );
484    READ( wrapMode_v );
485    READ( modifyFlag );
486    READ( pivot_x );
487    READ( pivot_y );
488
489    // v11 ends here
490    if (_flt_version <= 11) return true;
491
492    READ( texEnvMode );
493    READ( intensityAsAlpha );
494    for (n=0; n<8; n++) {
495        READ(spare1[n]); }
496    READ( size_u );
497    READ( size_v );
498    READ( originCode );
499    READ( kernelVersion );
500    READ( intFormat );
501    READ( extFormat );
502    READ( useMips );
503    for (n=0; n<8; n++) {
504        READ(_mipMapKernel[n]); }
505    READ( useLodScale );
506    READ( lod0 );
507    READ( scale0 );
508    READ( lod1 );
509    READ( scale1 );
510    READ( lod2 );
511    READ( scale2 );
512    READ( lod3 );
513    READ( scale3 );
514    READ( lod4 );
515    READ( scale4 );
516    READ( lod5 );
517    READ( scale5 );
518    READ( lod6 );
519    READ( scale6 );
520    READ( lod7 );
521    READ( scale7 );
522    READ( clamp );
523    READ( magFilterAlpha );
524    READ( magFilterColor );
525    READ( reserved1 );
526    for (n=0; n<8; n++) {
527        READ(reserved2[n]); }
528    READ( lambertMeridian );
529    READ( lambertUpperLat );
530    READ( lambertlowerLat );
531    READ( reserved3 );
532   
533    for (n=0; n<5; n++) {
534        READ(spare2[n]); }
535
536    // I don't know why I get a 4 bytes displacement before reading Detail Texture parameters
537    // My ATTR files have been created with Creator 2.5.1
538    // Julian Ortiz, June 18th 2003.   
539    int32 dummyAjust;
540    READ( dummyAjust);   
541
542    READ( useDetail );   
543    READ( txDetail_j );
544    READ( txDetail_k );
545    READ( txDetail_m );
546    READ( txDetail_n );
547    READ( txDetail_s );
548    READ( useTile );
549    READ( txTile_ll_u );
550    READ( txTile_ll_v );
551    READ( txTile_ur_u );
552    READ( txTile_ur_v );
553    READ( projection );
554    READ( earthModel );
555    READ( reserved4 );
556    READ( utmZone );
557    READ( imageOrigin);
558    READ( geoUnits );
559    READ( reserved5 );
560    READ( reserved6 );
561    READ( hemisphere );
562    READ( reserved7 );
563    READ( reserved8 );
564    for (n=0; n<149; n++) {
565        READ(spare3[n]); }
566    file.read(comments, sizeof(comments));
567
568    // v12 ends here
569    if (_flt_version <= 12) return true;
570
571    for (n=0; n<13; n++) {
572        READ(reserved9[n]); }
573    READ( attrVersion );
574    READ( controlPoints);
575    READ( reserved10 );
576
577    file.close();
578    return true;
579}
580
581
582flt::AttrData* Attr::createOsgStateSet()
583{   
584    TexEnv* osgTexEnv = new TexEnv;
585    Texture2D* osgTexture = new Texture2D;
586    flt::AttrData* attrdata = new flt::AttrData;   
587
588    if ((wrapMode_u != WRAP_CLAMP) && ((wrapMode_u != WRAP_REPEAT)))
589        wrapMode_u = wrapMode;
590    if ((wrapMode_v != WRAP_CLAMP) && ((wrapMode_v != WRAP_REPEAT)))
591        wrapMode_v = wrapMode;
592
593    if (wrapMode_u == WRAP_CLAMP) osgTexture->setWrap(Texture2D::WRAP_S,Texture2D::CLAMP);
594    else osgTexture->setWrap(Texture2D::WRAP_S,Texture2D::REPEAT);
595
596    if (wrapMode_v == WRAP_CLAMP) osgTexture->setWrap(Texture2D::WRAP_T,Texture2D::CLAMP);
597    else osgTexture->setWrap(Texture2D::WRAP_T,Texture2D::REPEAT);
598
599
600    switch (texEnvMode)
601    {
602    case TEXENV_MODULATE:
603        osgTexEnv->setMode(TexEnv::MODULATE);
604        break;
605    case TEXENV_BLEND:
606        osgTexEnv->setMode(TexEnv::BLEND);
607        break;
608    case TEXENV_DECAL:
609        osgTexEnv->setMode(TexEnv::DECAL);
610        break;
611    case TEXENV_COLOR:
612        osgTexEnv->setMode(TexEnv::REPLACE);
613        break;
614    }
615
616/*  An email on ATTR mappings to OpenGL : "[osg-news] OpenFlight Texture Filter Modes"
617    from Joseph Steel:
618   
619
620    I posted a query on a forum on the Multigen web site re. the OpenFlight
621    texture filer modes. This is the reply:
622
623    Here are the mappings used by Creator under OpenGL:
624    For Minification:
625    Point (0): GL_NEAREST
626    Bilinear (1): GL_LINEAR
627    Mipmap Point (3): GL_NEAREST_MIPMAP_NEAREST
628    Mipmap Linear (4): GL_NEAREST_MIPMAP_LINEAR
629    Mipmap Bilinear (5): GL_LINEAR_MIPMAP_NEAREST
630    Mipmap Trilinear (6): GL_LINEAR_MIPMAP_LINEAR
631    Bicubic (8): GL_LINEAR_MIPMAP_NEAREST
632    Bilinear Greater/Equal (9): GL_LINEAR_MIPMAP_NEAREST
633    Bilinear Less/Equal (10): GL_LINEAR_MIPMAP_NEAREST
634    Bicubic Greater/Equal (11): GL_LINEAR_MIPMAP_NEAREST
635    Bicubic Less/Equal (12): GL_LINEAR_MIPMAP_NEAREST
636    For Magnification:
637    Point (0): GL_NEAREST
638    Bilinear (1): GL_LINEAR
639    Bicubic (3): GL_LINEAR
640    Sharpen (4): GL_LINEAR
641    Add Detail (5): GL_LINEAR
642    Modulate Detail (6): GL_LINEAR
643    Bilinear Greater/Equal (7): GL_LINEAR
644    Bilinear Less/Equal (8): GL_LINEAR
645    Bicubic Greater/Equal (9): GL_LINEAR
646    Bicubic Less/Equal (10): GL_LINEAR
647
648    Note that mode 2 for both minification & magnification are no longer
649    supported.
650*/
651
652    // -----------
653    // Min filter
654    // -----------
655
656    switch (minFilterMode)
657    {
658    case MIN_FILTER_POINT:
659        osgTexture->setFilter(osg::Texture2D::MIN_FILTER, Texture2D::NEAREST);
660        break;
661    case MIN_FILTER_BILINEAR:
662        osgTexture->setFilter(osg::Texture2D::MIN_FILTER, Texture2D::LINEAR);
663        break;
664    case MIN_FILTER_MIPMAP_POINT:
665        osgTexture->setFilter(osg::Texture2D::MIN_FILTER, Texture2D::NEAREST_MIPMAP_NEAREST);
666        break;
667    case MIN_FILTER_MIPMAP_LINEAR:
668        osgTexture->setFilter(osg::Texture2D::MIN_FILTER, Texture2D::NEAREST_MIPMAP_LINEAR);
669        break;
670    case MIN_FILTER_MIPMAP_BILINEAR:
671        osgTexture->setFilter(osg::Texture2D::MIN_FILTER, Texture2D::LINEAR_MIPMAP_NEAREST);
672        break;
673    case MIN_FILTER_MIPMAP_TRILINEAR:
674        osgTexture->setFilter(osg::Texture2D::MIN_FILTER, Texture2D::LINEAR_MIPMAP_LINEAR);
675        break;
676    case MIN_FILTER_BICUBIC:
677    case MIN_FILTER_BILINEAR_GEQUAL:
678    case MIN_FILTER_BILINEAR_LEQUAL:
679    case MIN_FILTER_BICUBIC_GEQUAL:
680    case MIN_FILTER_BICUBIC_LEQUAL:
681        osgTexture->setFilter(osg::Texture2D::MIN_FILTER, Texture2D::LINEAR_MIPMAP_NEAREST);
682        break;
683    default:
684        osgTexture->setFilter(osg::Texture2D::MIN_FILTER, Texture2D::LINEAR_MIPMAP_LINEAR);
685        break;
686          break;
687    }
688
689
690    // -----------
691    // Mag filter
692    // -----------
693
694    switch (magFilterMode)
695    {
696    case MAG_FILTER_POINT:
697        osgTexture->setFilter(osg::Texture2D::MAG_FILTER, Texture2D::NEAREST);
698        break;
699    case MAG_FILTER_BILINEAR:
700    case MAG_FILTER_BILINEAR_GEQUAL:
701    case MAG_FILTER_BILINEAR_LEQUAL:
702    case MAG_FILTER_SHARPEN:
703    case MAG_FILTER_BICUBIC:
704    case MAG_FILTER_BICUBIC_GEQUAL:
705    case MAG_FILTER_BICUBIC_LEQUAL:
706    case MAG_FILTER_ADD_DETAIL:
707    case MAG_FILTER_MODULATE_DETAIL:
708        osgTexture->setFilter(osg::Texture2D::MAG_FILTER, Texture2D::LINEAR);
709        break;
710    }
711
712    // I have just ported the two below set*Attribute lines to use the new
713    // texture attribute methods, however this tieing to the texture unit 0
714    // is probably inappropriate.  Perhaps it would be better to create a
715    // StateSet to store the texture an modes, it is probably best
716    // to use an intermediate data structure for the flt loader to use to
717    // encapsulate ATTR files. Need to speak to Brede about this issue.
718    // Robert Osfield, July 9th 2002.
719   
720    // This is now a bit diferrent. We create a new AttrData object, and StateSet object
721    // is instead with attribute information needed to setup detail texutre
722    //
723    // Julian Ortiz, June 18th 2003.   
724    attrdata->stateset = new StateSet;
725    attrdata->stateset->setTextureAttribute( 0, osgTexEnv );
726    attrdata->stateset->setTextureAttributeAndModes( 0, osgTexture, StateAttribute::ON );
727    attrdata->useDetail    = useDetail;
728    attrdata->txDetail_j  = txDetail_j;
729    attrdata->txDetail_k  = txDetail_k;
730    attrdata->txDetail_m  = txDetail_m;
731    attrdata->txDetail_n  = txDetail_n;
732    attrdata->txDetail_s  = txDetail_s;
733    if (magFilterMode == MAG_FILTER_MODULATE_DETAIL)
734     attrdata->modulateDetail = true;
735    else
736     attrdata->modulateDetail = false;
737   
738    return attrdata;
739}
740
741
742class ReaderWriterATTR : public osgDB::ReaderWriter
743{
744    public:
745        virtual const char* className() { return "ATTR Image Attribute Reader/Writer"; }
746       
747        virtual bool acceptsExtension(const std::string& extension)
748        {
749            return osgDB::equalCaseInsensitive(extension,"attr");
750        }
751
752        virtual ReadResult readObject(const std::string& file, const osgDB::ReaderWriter::Options*)
753        {
754            std::string ext = osgDB::getLowerCaseFileExtension(file);
755            if (!acceptsExtension(ext)) return ReadResult::FILE_NOT_HANDLED;
756
757            std::string fileName = osgDB::findDataFile( file );
758            if (fileName.empty()) return ReadResult::FILE_NOT_FOUND;
759
760            // options
761            char buf[256];
762            int version=0;
763
764            const osgDB::ReaderWriter::Options*  rwOptions=
765                osgDB::Registry::instance()->getOptions();
766
767            if (rwOptions)
768            {
769                sscanf(rwOptions->getOptionString().c_str(),"%s %d", buf, &version);
770                if (strcmp(buf, "FLT_VER")) version=0;
771            }
772
773            Attr attr(version);
774
775            if (!attr.readAttrFile(fileName.c_str()))
776            {
777                return "Unable to open \""+fileName+"\"";
778            }
779
780            //StateSet* stateset = attr.createOsgStateSet();
781            // Julian Ortiz, June 18th 2003.       
782            flt::AttrData* attrdata = attr.createOsgStateSet();
783
784            notify(INFO) << "texture attribute read ok" << std::endl;
785            return attrdata;
786        }
787
788};
789
790// now register with Registry to instantiate the above
791// reader/writer.
792osgDB::RegisterReaderWriterProxy<ReaderWriterATTR> g_readerWriter_ATTR_Proxy;
Note: See TracBrowser for help on using the browser.