From 393b5cd1dc438872af89d334ef6e5fcc59f27d47 Mon Sep 17 00:00:00 2001 From: David Walter Seikel Date: Sun, 13 Jan 2013 17:24:39 +1000 Subject: Added Irrlicht 1.8, but without all the Windows binaries. --- .../doc/html/_i_q3_shader_8h_source.html | 981 +++++++++++++++++++++ 1 file changed, 981 insertions(+) create mode 100644 libraries/irrlicht-1.8/doc/html/_i_q3_shader_8h_source.html (limited to 'libraries/irrlicht-1.8/doc/html/_i_q3_shader_8h_source.html') diff --git a/libraries/irrlicht-1.8/doc/html/_i_q3_shader_8h_source.html b/libraries/irrlicht-1.8/doc/html/_i_q3_shader_8h_source.html new file mode 100644 index 0000000..724ae01 --- /dev/null +++ b/libraries/irrlicht-1.8/doc/html/_i_q3_shader_8h_source.html @@ -0,0 +1,981 @@ + + + + +Irrlicht 3D Engine: IQ3Shader.h Source File + + + + + + + + + + + + + + +
+ + +
+ + + + + + + + + + + + + + + + + +
+
Irrlicht 3D Engine + +
+ +
+ + + + + + +
+
+
+ + + + +
+
+ +
+
+
+ +
+
+
+
IQ3Shader.h
+
+
+Go to the documentation of this file.
00001 // Copyright (C) 2006-2012 Nikolaus Gebhardt / Thomas Alten
+00002 // This file is part of the "Irrlicht Engine".
+00003 // For conditions of distribution and use, see copyright notice in irrlicht.h
+00004 
+00005 #ifndef __I_Q3_LEVEL_SHADER_H_INCLUDED__
+00006 #define __I_Q3_LEVEL_SHADER_H_INCLUDED__
+00007 
+00008 #include "irrArray.h"
+00009 #include "fast_atof.h"
+00010 #include "IFileSystem.h"
+00011 #include "IVideoDriver.h"
+00012 #include "coreutil.h"
+00013 
+00014 namespace irr
+00015 {
+00016 namespace scene
+00017 {
+00018 namespace quake3
+00019 {
+00020 
+00021     static core::stringc irrEmptyStringc("");
+00022 
+00024     enum eQ3MeshIndex
+00025     {
+00026         E_Q3_MESH_GEOMETRY = 0,
+00027         E_Q3_MESH_ITEMS,
+00028         E_Q3_MESH_BILLBOARD,
+00029         E_Q3_MESH_FOG,
+00030         E_Q3_MESH_UNRESOLVED,
+00031         E_Q3_MESH_SIZE
+00032     };
+00033 
+00037     struct Q3LevelLoadParameter
+00038     {
+00039         Q3LevelLoadParameter ()
+00040             :defaultLightMapMaterial ( video::EMT_LIGHTMAP_M4 ),
+00041             defaultModulate ( video::EMFN_MODULATE_4X ),
+00042             defaultFilter ( video::EMF_BILINEAR_FILTER ),
+00043             patchTesselation ( 8 ),
+00044             verbose ( 0 ),
+00045             startTime ( 0 ), endTime ( 0 ),
+00046             mergeShaderBuffer ( 1 ),
+00047             cleanUnResolvedMeshes ( 1 ),
+00048             loadAllShaders ( 0 ),
+00049             loadSkyShader ( 0 ),
+00050             alpharef ( 1 ),
+00051             swapLump ( 0 ),
+00052     #ifdef __BIG_ENDIAN__
+00053             swapHeader ( 1 )
+00054     #else
+00055             swapHeader ( 0 )
+00056     #endif
+00057             {
+00058                 memcpy ( scriptDir, "scripts\x0", 8 );
+00059             }
+00060 
+00061         video::E_MATERIAL_TYPE defaultLightMapMaterial;
+00062         video::E_MODULATE_FUNC defaultModulate;
+00063         video::E_MATERIAL_FLAG defaultFilter;
+00064         s32 patchTesselation;
+00065         s32 verbose;
+00066         u32 startTime;
+00067         u32 endTime;
+00068         s32 mergeShaderBuffer;
+00069         s32 cleanUnResolvedMeshes;
+00070         s32 loadAllShaders;
+00071         s32 loadSkyShader;
+00072         s32 alpharef;
+00073         s32 swapLump;
+00074         s32 swapHeader;
+00075         c8 scriptDir [ 64 ];
+00076     };
+00077 
+00078     // some useful typedefs
+00079     typedef core::array< core::stringc > tStringList;
+00080     typedef core::array< video::ITexture* > tTexArray;
+00081 
+00082     // string helper.. TODO: move to generic files
+00083     inline s16 isEqual ( const core::stringc &string, u32 &pos, const c8 *list[], u16 listSize )
+00084     {
+00085         const char * in = string.c_str () + pos;
+00086 
+00087         for ( u16 i = 0; i != listSize; ++i )
+00088         {
+00089             if (string.size() < pos)
+00090                 return -2;
+00091             u32 len = (u32) strlen ( list[i] );
+00092             if (string.size() < pos+len)
+00093                 continue;
+00094             if ( in [len] != 0 && in [len] != ' ' )
+00095                 continue;
+00096             if ( strncmp ( in, list[i], len ) )
+00097                 continue;
+00098 
+00099             pos += len + 1;
+00100             return (s16) i;
+00101         }
+00102         return -2;
+00103     }
+00104 
+00105     inline f32 getAsFloat ( const core::stringc &string, u32 &pos )
+00106     {
+00107         const char * in = string.c_str () + pos;
+00108 
+00109         f32 value = 0.f;
+00110         pos += (u32) ( core::fast_atof_move ( in, value ) - in ) + 1;
+00111         return value;
+00112     }
+00113 
+00115     inline core::vector3df getAsVector3df ( const core::stringc &string, u32 &pos )
+00116     {
+00117         core::vector3df v;
+00118 
+00119         v.X = getAsFloat ( string, pos );
+00120         v.Z = getAsFloat ( string, pos );
+00121         v.Y = getAsFloat ( string, pos );
+00122 
+00123         return v;
+00124     }
+00125 
+00126 
+00127     /*
+00128         extract substrings
+00129     */
+00130     inline void getAsStringList ( tStringList &list, s32 max, const core::stringc &string, u32 &startPos )
+00131     {
+00132         list.clear ();
+00133 
+00134         s32 finish = 0;
+00135         s32 endPos;
+00136         do
+00137         {
+00138             endPos = string.findNext ( ' ', startPos );
+00139             if ( endPos == -1 )
+00140             {
+00141                 finish = 1;
+00142                 endPos = string.size();
+00143             }
+00144 
+00145             list.push_back ( string.subString ( startPos, endPos - startPos ) );
+00146             startPos = endPos + 1;
+00147 
+00148             if ( list.size() >= (u32) max )
+00149                 finish = 1;
+00150 
+00151         } while ( !finish );
+00152 
+00153     }
+00154 
+00156     struct SBlendFunc
+00157     {
+00158         SBlendFunc ( video::E_MODULATE_FUNC mod )
+00159             : type ( video::EMT_SOLID ), modulate ( mod ),
+00160                 param0( 0.f ),
+00161             isTransparent ( 0 ) {}
+00162 
+00163         video::E_MATERIAL_TYPE type;
+00164         video::E_MODULATE_FUNC modulate;
+00165 
+00166         f32 param0;
+00167         u32 isTransparent;
+00168     };
+00169 
+00170     // parses the content of Variable cull
+00171     inline bool getCullingFunction ( const core::stringc &cull )
+00172     {
+00173         if ( cull.size() == 0 )
+00174             return true;
+00175 
+00176         bool ret = true;
+00177         static const c8 * funclist[] = { "none", "disable", "twosided" };
+00178 
+00179         u32 pos = 0;
+00180         switch ( isEqual ( cull, pos, funclist, 3 ) )
+00181         {
+00182             case 0:
+00183             case 1:
+00184             case 2:
+00185                 ret = false;
+00186                 break;
+00187         }
+00188         return ret;
+00189     }
+00190 
+00191     // parses the content of Variable depthfunc
+00192     // return a z-test
+00193     inline u8 getDepthFunction ( const core::stringc &string )
+00194     {
+00195         u8 ret = video::ECFN_LESSEQUAL;
+00196 
+00197         if ( string.size() == 0 )
+00198             return ret;
+00199 
+00200         static const c8 * funclist[] = { "lequal","equal" };
+00201 
+00202         u32 pos = 0;
+00203         switch ( isEqual ( string, pos, funclist, 2 ) )
+00204         {
+00205             case 0:
+00206                 ret = video::ECFN_LESSEQUAL;
+00207             case 1:
+00208                 ret = video::ECFN_EQUAL;
+00209                 break;
+00210         }
+00211         return ret;
+00212     }
+00213 
+00214 
+00226     inline static void getBlendFunc ( const core::stringc &string, SBlendFunc &blendfunc )
+00227     {
+00228         if ( string.size() == 0 )
+00229             return;
+00230 
+00231         // maps to E_BLEND_FACTOR
+00232         static const c8 * funclist[] =
+00233         {
+00234             "gl_zero",
+00235             "gl_one",
+00236             "gl_dst_color",
+00237             "gl_one_minus_dst_color",
+00238             "gl_src_color",
+00239             "gl_one_minus_src_color",
+00240             "gl_src_alpha",
+00241             "gl_one_minus_src_alpha",
+00242             "gl_dst_alpha",
+00243             "gl_one_minus_dst_alpha",
+00244             "gl_src_alpha_sat",
+00245 
+00246             "add",
+00247             "filter",
+00248             "blend",
+00249 
+00250             "ge128",
+00251             "gt0",
+00252         };
+00253 
+00254 
+00255         u32 pos = 0;
+00256         s32 srcFact = isEqual ( string, pos, funclist, 16 );
+00257 
+00258         if ( srcFact < 0 )
+00259             return;
+00260 
+00261         u32 resolved = 0;
+00262         s32 dstFact = isEqual ( string, pos, funclist, 16 );
+00263 
+00264         switch ( srcFact )
+00265         {
+00266             case video::EBF_ZERO:
+00267                 switch ( dstFact )
+00268                 {
+00269                     // gl_zero gl_src_color == gl_dst_color gl_zero
+00270                     case video::EBF_SRC_COLOR:
+00271                         blendfunc.type = video::EMT_ONETEXTURE_BLEND;
+00272                         blendfunc.param0 = video::pack_textureBlendFunc ( video::EBF_DST_COLOR, video::EBF_ZERO, blendfunc.modulate );
+00273                         blendfunc.isTransparent = 1;
+00274                         resolved = 1;
+00275                         break;
+00276                 } break;
+00277 
+00278             case video::EBF_ONE:
+00279                 switch ( dstFact )
+00280                 {
+00281                     // gl_one gl_zero
+00282                     case video::EBF_ZERO:
+00283                         blendfunc.type = video::EMT_SOLID;
+00284                         blendfunc.isTransparent = 0;
+00285                         resolved = 1;
+00286                         break;
+00287 
+00288                     // gl_one gl_one
+00289                     case video::EBF_ONE:
+00290                         blendfunc.type = video::EMT_TRANSPARENT_ADD_COLOR;
+00291                         blendfunc.isTransparent = 1;
+00292                         resolved = 1;
+00293                         break;
+00294                 } break;
+00295 
+00296             case video::EBF_SRC_ALPHA:
+00297                 switch ( dstFact )
+00298                 {
+00299                     // gl_src_alpha gl_one_minus_src_alpha
+00300                     case video::EBF_ONE_MINUS_SRC_ALPHA:
+00301                         blendfunc.type = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
+00302                         blendfunc.param0 = 1.f/255.f;
+00303                         blendfunc.isTransparent = 1;
+00304                         resolved = 1;
+00305                         break;
+00306                 } break;
+00307 
+00308             case 11:
+00309                 // add
+00310                 blendfunc.type = video::EMT_TRANSPARENT_ADD_COLOR;
+00311                 blendfunc.isTransparent = 1;
+00312                 resolved = 1;
+00313                 break;
+00314             case 12:
+00315                 // filter = gl_dst_color gl_zero or gl_zero gl_src_color
+00316                 blendfunc.type = video::EMT_ONETEXTURE_BLEND;
+00317                 blendfunc.param0 = video::pack_textureBlendFunc ( video::EBF_DST_COLOR, video::EBF_ZERO, blendfunc.modulate );
+00318                 blendfunc.isTransparent = 1;
+00319                 resolved = 1;
+00320                 break;
+00321             case 13:
+00322                 // blend = gl_src_alpha gl_one_minus_src_alpha
+00323                 blendfunc.type = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
+00324                 blendfunc.param0 = 1.f/255.f;
+00325                 blendfunc.isTransparent = 1;
+00326                 resolved = 1;
+00327                 break;
+00328             case 14:
+00329                 // alphafunc ge128
+00330                 blendfunc.type = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
+00331                 blendfunc.param0 = 0.5f;
+00332                 blendfunc.isTransparent = 1;
+00333                 resolved = 1;
+00334                 break;
+00335             case 15:
+00336                 // alphafunc gt0
+00337                 blendfunc.type = video::EMT_TRANSPARENT_ALPHA_CHANNEL;
+00338                 blendfunc.param0 = 1.f / 255.f;
+00339                 blendfunc.isTransparent = 1;
+00340                 resolved = 1;
+00341                 break;
+00342 
+00343         }
+00344 
+00345         // use the generic blender
+00346         if ( 0 == resolved )
+00347         {
+00348             blendfunc.type = video::EMT_ONETEXTURE_BLEND;
+00349             blendfunc.param0 = video::pack_textureBlendFunc (
+00350                     (video::E_BLEND_FACTOR) srcFact,
+00351                     (video::E_BLEND_FACTOR) dstFact,
+00352                     blendfunc.modulate);
+00353 
+00354             blendfunc.isTransparent = 1;
+00355         }
+00356     }
+00357 
+00358     // random noise [-1;1]
+00359     struct Noiser
+00360     {
+00361         static f32 get ()
+00362         {
+00363             static u32 RandomSeed = 0x69666966;
+00364             RandomSeed = (RandomSeed * 3631 + 1);
+00365 
+00366             f32 value = ( (f32) (RandomSeed & 0x7FFF ) * (1.0f / (f32)(0x7FFF >> 1) ) ) - 1.f;
+00367             return value;
+00368         }
+00369     };
+00370 
+00371     enum eQ3ModifierFunction
+00372     {
+00373         TCMOD               = 0,
+00374         DEFORMVERTEXES      = 1,
+00375         RGBGEN              = 2,
+00376         TCGEN               = 3,
+00377         MAP                 = 4,
+00378         ALPHAGEN            = 5,
+00379 
+00380         FUNCTION2           = 0x10,
+00381         SCROLL              = FUNCTION2 + 1,
+00382         SCALE               = FUNCTION2 + 2,
+00383         ROTATE              = FUNCTION2 + 3,
+00384         STRETCH             = FUNCTION2 + 4,
+00385         TURBULENCE          = FUNCTION2 + 5,
+00386         WAVE                = FUNCTION2 + 6,
+00387 
+00388         IDENTITY            = FUNCTION2 + 7,
+00389         VERTEX              = FUNCTION2 + 8,
+00390         TEXTURE             = FUNCTION2 + 9,
+00391         LIGHTMAP            = FUNCTION2 + 10,
+00392         ENVIRONMENT         = FUNCTION2 + 11,
+00393         DOLLAR_LIGHTMAP     = FUNCTION2 + 12,
+00394         BULGE               = FUNCTION2 + 13,
+00395         AUTOSPRITE          = FUNCTION2 + 14,
+00396         AUTOSPRITE2         = FUNCTION2 + 15,
+00397         TRANSFORM           = FUNCTION2 + 16,
+00398         EXACTVERTEX         = FUNCTION2 + 17,
+00399         CONSTANT            = FUNCTION2 + 18,
+00400         LIGHTINGSPECULAR    = FUNCTION2 + 19,
+00401         MOVE                = FUNCTION2 + 20,
+00402         NORMAL              = FUNCTION2 + 21,
+00403         IDENTITYLIGHTING    = FUNCTION2 + 22,
+00404 
+00405         WAVE_MODIFIER_FUNCTION  = 0x30,
+00406         SINUS               = WAVE_MODIFIER_FUNCTION + 1,
+00407         COSINUS             = WAVE_MODIFIER_FUNCTION + 2,
+00408         SQUARE              = WAVE_MODIFIER_FUNCTION + 3,
+00409         TRIANGLE            = WAVE_MODIFIER_FUNCTION + 4,
+00410         SAWTOOTH            = WAVE_MODIFIER_FUNCTION + 5,
+00411         SAWTOOTH_INVERSE    = WAVE_MODIFIER_FUNCTION + 6,
+00412         NOISE               = WAVE_MODIFIER_FUNCTION + 7,
+00413 
+00414 
+00415         UNKNOWN             = -2
+00416 
+00417     };
+00418 
+00419     struct SModifierFunction
+00420     {
+00421         SModifierFunction ()
+00422             : masterfunc0 ( UNKNOWN ), masterfunc1( UNKNOWN ), func ( SINUS ),
+00423             tcgen( TEXTURE ), rgbgen ( IDENTITY ), alphagen ( UNKNOWN ),
+00424             base ( 0 ), amp ( 1 ), phase ( 0 ), frequency ( 1 ),
+00425             wave ( 1 ),
+00426             x ( 0 ), y ( 0 ), z( 0 ), count( 0 ) {}
+00427 
+00428         // "tcmod","deformvertexes","rgbgen", "tcgen"
+00429         eQ3ModifierFunction masterfunc0;
+00430         // depends
+00431         eQ3ModifierFunction masterfunc1;
+00432         // depends
+00433         eQ3ModifierFunction func;
+00434 
+00435         eQ3ModifierFunction tcgen;
+00436         eQ3ModifierFunction rgbgen;
+00437         eQ3ModifierFunction alphagen;
+00438 
+00439         union
+00440         {
+00441             f32 base;
+00442             f32 bulgewidth;
+00443         };
+00444 
+00445         union
+00446         {
+00447             f32 amp;
+00448             f32 bulgeheight;
+00449         };
+00450 
+00451         f32 phase;
+00452 
+00453         union
+00454         {
+00455             f32 frequency;
+00456             f32 bulgespeed;
+00457         };
+00458 
+00459         union
+00460         {
+00461             f32 wave;
+00462             f32 div;
+00463         };
+00464 
+00465         f32 x;
+00466         f32 y;
+00467         f32 z;
+00468         u32 count;
+00469 
+00470         f32 evaluate ( f32 dt ) const
+00471         {
+00472             // phase in 0 and 1..
+00473             f32 x = core::fract( (dt + phase ) * frequency );
+00474             f32 y = 0.f;
+00475 
+00476             switch ( func )
+00477             {
+00478                 case SINUS:
+00479                     y = sinf ( x * core::PI * 2.f );
+00480                     break;
+00481                 case COSINUS:
+00482                     y = cosf ( x * core::PI * 2.f );
+00483                     break;
+00484                 case SQUARE:
+00485                     y = x < 0.5f ? 1.f : -1.f;
+00486                     break;
+00487                 case TRIANGLE:
+00488                     y = x < 0.5f ? ( 4.f * x ) - 1.f : ( -4.f * x ) + 3.f;
+00489                     break;
+00490                 case SAWTOOTH:
+00491                     y = x;
+00492                     break;
+00493                 case SAWTOOTH_INVERSE:
+00494                     y = 1.f - x;
+00495                     break;
+00496                 case NOISE:
+00497                     y = Noiser::get();
+00498                     break;
+00499                 default:
+00500                     break;
+00501             }
+00502 
+00503             return base + ( y * amp );
+00504         }
+00505 
+00506 
+00507     };
+00508 
+00509     inline core::vector3df getMD3Normal ( u32 i, u32 j )
+00510     {
+00511         const f32 lng = i * 2.0f * core::PI / 255.0f;
+00512         const f32 lat = j * 2.0f * core::PI / 255.0f;
+00513         return core::vector3df(cosf ( lat ) * sinf ( lng ),
+00514                 sinf ( lat ) * sinf ( lng ),
+00515                 cosf ( lng ));
+00516     }
+00517 
+00518     //
+00519     inline void getModifierFunc ( SModifierFunction& fill, const core::stringc &string, u32 &pos )
+00520     {
+00521         if ( string.size() == 0 )
+00522             return;
+00523 
+00524         static const c8 * funclist[] =
+00525         {
+00526             "sin","cos","square",
+00527             "triangle", "sawtooth","inversesawtooth", "noise"
+00528         };
+00529 
+00530         fill.func = (eQ3ModifierFunction) isEqual ( string,pos, funclist,7 );
+00531         fill.func = fill.func == UNKNOWN ? SINUS : (eQ3ModifierFunction) ((u32) fill.func + WAVE_MODIFIER_FUNCTION + 1);
+00532 
+00533         fill.base = getAsFloat ( string, pos );
+00534         fill.amp = getAsFloat ( string, pos );
+00535         fill.phase = getAsFloat ( string, pos );
+00536         fill.frequency = getAsFloat ( string, pos );
+00537     }
+00538 
+00539 
+00540     // name = "a b c .."
+00541     struct SVariable
+00542     {
+00543         core::stringc name;
+00544         core::stringc content;
+00545 
+00546         SVariable ( const c8 * n, const c8 *c = 0 ) : name ( n ), content (c) {}
+00547         virtual ~SVariable () {}
+00548 
+00549         void clear ()
+00550         {
+00551             name = "";
+00552             content = "";
+00553         }
+00554 
+00555         s32 isValid () const
+00556         {
+00557             return name.size();
+00558         }
+00559 
+00560         bool operator == ( const SVariable &other ) const
+00561         {
+00562             return 0 == strcmp ( name.c_str(), other.name.c_str () );
+00563         }
+00564 
+00565         bool operator < ( const SVariable &other ) const
+00566         {
+00567             return 0 > strcmp ( name.c_str(), other.name.c_str () );
+00568         }
+00569 
+00570     };
+00571 
+00572 
+00573     // string database. "a" = "Hello", "b" = "1234.6"
+00574     struct SVarGroup
+00575     {
+00576         SVarGroup () { Variable.setAllocStrategy ( core::ALLOC_STRATEGY_SAFE ); }
+00577         virtual ~SVarGroup () {}
+00578 
+00579         u32 isDefined ( const c8 * name, const c8 * content = 0 ) const
+00580         {
+00581             for ( u32 i = 0; i != Variable.size (); ++i )
+00582             {
+00583                 if ( 0 == strcmp ( Variable[i].name.c_str(), name ) &&
+00584                     (  0 == content || strstr ( Variable[i].content.c_str(), content ) )
+00585                     )
+00586                 {
+00587                     return i + 1;
+00588                 }
+00589             }
+00590             return 0;
+00591         }
+00592 
+00593         // searches for Variable name and returns is content
+00594         // if Variable is not found a reference to an Empty String is returned
+00595         const core::stringc &get( const c8 * name ) const
+00596         {
+00597             SVariable search ( name );
+00598             s32 index = Variable.linear_search ( search );
+00599             if ( index < 0 )
+00600                 return irrEmptyStringc;
+00601 
+00602             return Variable [ index ].content;
+00603         }
+00604 
+00605         // set the Variable name
+00606         void set ( const c8 * name, const c8 * content = 0 )
+00607         {
+00608             u32 index = isDefined ( name, 0 );
+00609             if ( 0 == index )
+00610             {
+00611                 Variable.push_back ( SVariable ( name, content ) );
+00612             }
+00613             else
+00614             {
+00615                 Variable [ index ].content = content;
+00616             }
+00617         }
+00618 
+00619 
+00620         core::array < SVariable > Variable;
+00621     };
+00622 
+00624     struct SVarGroupList: public IReferenceCounted
+00625     {
+00626         SVarGroupList ()
+00627         {
+00628             VariableGroup.setAllocStrategy ( core::ALLOC_STRATEGY_SAFE );
+00629         }
+00630         virtual ~SVarGroupList () {}
+00631 
+00632         core::array < SVarGroup > VariableGroup;
+00633     };
+00634 
+00635 
+00637     struct IShader
+00638     {
+00639         IShader ()
+00640             : ID ( 0 ), VarGroup ( 0 )  {}
+00641         virtual ~IShader () {}
+00642 
+00643         void operator = (const IShader &other )
+00644         {
+00645             ID = other.ID;
+00646             VarGroup = other.VarGroup;
+00647             name = other.name;
+00648         }
+00649 
+00650         bool operator == (const IShader &other ) const
+00651         {
+00652             return 0 == strcmp ( name.c_str(), other.name.c_str () );
+00653             //return name == other.name;
+00654         }
+00655 
+00656         bool operator < (const IShader &other ) const
+00657         {
+00658             return strcmp ( name.c_str(), other.name.c_str () ) < 0;
+00659             //return name < other.name;
+00660         }
+00661 
+00662         u32 getGroupSize () const
+00663         {
+00664             if ( 0 == VarGroup )
+00665                 return 0;
+00666             return VarGroup->VariableGroup.size ();
+00667         }
+00668 
+00669         const SVarGroup * getGroup ( u32 stage ) const
+00670         {
+00671             if ( 0 == VarGroup || stage >= VarGroup->VariableGroup.size () )
+00672                 return 0;
+00673 
+00674             return &VarGroup->VariableGroup [ stage ];
+00675         }
+00676 
+00677         // id
+00678         s32 ID;
+00679         SVarGroupList *VarGroup; // reference
+00680 
+00681         // Shader: shader name ( also first variable in first Vargroup )
+00682         // Entity: classname ( variable in Group(1) )
+00683         core::stringc name;
+00684     };
+00685 
+00686     typedef IShader IEntity;
+00687 
+00688     typedef core::array < IEntity > tQ3EntityList;
+00689 
+00690     /*
+00691         dump shader like original layout, regardless of internal data holding
+00692         no recursive folding..
+00693     */
+00694     inline void dumpVarGroup ( core::stringc &dest, const SVarGroup * group, s32 stack )
+00695     {
+00696         core::stringc buf;
+00697         s32 i;
+00698 
+00699 
+00700         if ( stack > 0 )
+00701         {
+00702             buf = "";
+00703             for ( i = 0; i < stack - 1; ++i )
+00704                 buf += '\t';
+00705 
+00706             buf += "{\n";
+00707             dest.append ( buf );
+00708         }
+00709 
+00710         for ( u32 g = 0; g != group->Variable.size(); ++g )
+00711         {
+00712             buf = "";
+00713             for ( i = 0; i < stack; ++i )
+00714                 buf += '\t';
+00715 
+00716             buf += group->Variable[g].name;
+00717             buf += " ";
+00718             buf += group->Variable[g].content;
+00719             buf += "\n";
+00720             dest.append ( buf );
+00721         }
+00722 
+00723         if ( stack > 1 )
+00724         {
+00725             buf = "";
+00726             for ( i = 0; i < stack - 1; ++i )
+00727                 buf += '\t';
+00728 
+00729             buf += "}\n";
+00730             dest.append ( buf );
+00731         }
+00732 
+00733     }
+00734 
+00738     inline core::stringc & dumpShader ( core::stringc &dest, const IShader * shader, bool entity = false )
+00739     {
+00740         if ( 0 == shader )
+00741             return dest;
+00742 
+00743         const SVarGroup * group;
+00744 
+00745         const u32 size = shader->VarGroup->VariableGroup.size ();
+00746         for ( u32 i = 0; i != size; ++i )
+00747         {
+00748             group = &shader->VarGroup->VariableGroup[ i ];
+00749             dumpVarGroup ( dest, group, core::clamp( (int)i, 0, 2 ) );
+00750         }
+00751 
+00752         if ( !entity )
+00753         {
+00754             if ( size <= 1 )
+00755             {
+00756                 dest.append ( "{\n" );
+00757             }
+00758             dest.append ( "}\n" );
+00759         }
+00760         return dest;
+00761     }
+00762 
+00763 
+00764     /*
+00765         quake3 doesn't care much about tga & jpg
+00766         load one or multiple files stored in name started at startPos to the texture array textures
+00767         if texture is not loaded 0 will be added ( to find missing textures easier)
+00768     */
+00769     inline void getTextures(tTexArray &textures,
+00770                 const core::stringc &name, u32 &startPos,
+00771                 io::IFileSystem *fileSystem,
+00772                 video::IVideoDriver* driver)
+00773     {
+00774         static const char* extension[] =
+00775         {
+00776             ".jpg",
+00777             ".jpeg",
+00778             ".png",
+00779             ".dds",
+00780             ".tga",
+00781             ".bmp",
+00782             ".pcx"
+00783         };
+00784 
+00785         tStringList stringList;
+00786         getAsStringList(stringList, -1, name, startPos);
+00787 
+00788         textures.clear();
+00789 
+00790         io::path loadFile;
+00791         for ( u32 i = 0; i!= stringList.size (); ++i )
+00792         {
+00793             video::ITexture* texture = 0;
+00794             for (u32 g = 0; g != 7 ; ++g)
+00795             {
+00796                 core::cutFilenameExtension ( loadFile, stringList[i] );
+00797 
+00798                 if ( loadFile == "$whiteimage" )
+00799                 {
+00800                     texture = driver->getTexture( "$whiteimage" );
+00801                     if ( 0 == texture )
+00802                     {
+00803                         core::dimension2du s ( 2, 2 );
+00804                         u32 image[4] = { 0xFFFFFFFF, 0xFFFFFFFF,0xFFFFFFFF,0xFFFFFFFF };
+00805                         video::IImage* w = driver->createImageFromData ( video::ECF_A8R8G8B8, s,&image );
+00806                         texture = driver->addTexture( "$whiteimage", w );
+00807                         w->drop ();
+00808                     }
+00809 
+00810                 }
+00811                 else
+00812                 if ( loadFile == "$redimage" )
+00813                 {
+00814                     texture = driver->getTexture( "$redimage" );
+00815                     if ( 0 == texture )
+00816                     {
+00817                         core::dimension2du s ( 2, 2 );
+00818                         u32 image[4] = { 0xFFFF0000, 0xFFFF0000,0xFFFF0000,0xFFFF0000 };
+00819                         video::IImage* w = driver->createImageFromData ( video::ECF_A8R8G8B8, s,&image );
+00820                         texture = driver->addTexture( "$redimage", w );
+00821                         w->drop ();
+00822                     }
+00823                 }
+00824                 else
+00825                 if ( loadFile == "$blueimage" )
+00826                 {
+00827                     texture = driver->getTexture( "$blueimage" );
+00828                     if ( 0 == texture )
+00829                     {
+00830                         core::dimension2du s ( 2, 2 );
+00831                         u32 image[4] = { 0xFF0000FF, 0xFF0000FF,0xFF0000FF,0xFF0000FF };
+00832                         video::IImage* w = driver->createImageFromData ( video::ECF_A8R8G8B8, s,&image );
+00833                         texture = driver->addTexture( "$blueimage", w );
+00834                         w->drop ();
+00835                     }
+00836                 }
+00837                 else
+00838                 if ( loadFile == "$checkerimage" )
+00839                 {
+00840                     texture = driver->getTexture( "$checkerimage" );
+00841                     if ( 0 == texture )
+00842                     {
+00843                         core::dimension2du s ( 2, 2 );
+00844                         u32 image[4] = { 0xFFFFFFFF, 0xFF000000,0xFF000000,0xFFFFFFFF };
+00845                         video::IImage* w = driver->createImageFromData ( video::ECF_A8R8G8B8, s,&image );
+00846                         texture = driver->addTexture( "$checkerimage", w );
+00847                         w->drop ();
+00848                     }
+00849                 }
+00850                 else
+00851                 if ( loadFile == "$lightmap" )
+00852                 {
+00853                     texture = 0;
+00854                 }
+00855                 else
+00856                 {
+00857                     loadFile.append ( extension[g] );
+00858                 }
+00859 
+00860                 if ( fileSystem->existFile ( loadFile ) )
+00861                 {
+00862                     texture = driver->getTexture( loadFile );
+00863                     if ( texture )
+00864                         break;
+00865                     texture = 0;
+00866                 }
+00867             }
+00868             // take 0 Texture
+00869             textures.push_back(texture);
+00870         }
+00871     }
+00872 
+00873 
+00875     class IShaderManager : public IReferenceCounted
+00876     {
+00877     };
+00878 
+00879 } // end namespace quake3
+00880 } // end namespace scene
+00881 } // end namespace irr
+00882 
+00883 #endif
+00884 
+
+
+ + + + + -- cgit v1.1