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

Revision 2501, 29.0 kB (checked in by robert, 11 years ago)

Moved the responsibility for finding file to load on to the ReaderWriter? plugins,
instead of osgDB::Registry where it original lay. This has been done to allow
fileName strings to be encode data rather than just file names, such as one
requires when using PagedLOD along with plugins for doing dynamic tesselation.

  • 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 long     int32;
53typedef unsigned long   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        long tmp1;
79        tmp1 = *(long *)pSrc;
80        tmp1 = (tmp1 << 24) | ((tmp1 << 8) & 0xff0000) | ((tmp1 >> 8) & 0xff00) | ((tmp1 >> 24) & 0xff);
81        *(long *)pDst = tmp1;
82    }
83    else if (nSrc == 8)
84    {
85        long tmp1, tmp2;
86        tmp1 = *(long *)pSrc;
87        tmp2 = *(1 + (long *)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        *(long *)pDst = tmp2;
91        *(1 + (long *)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.