public ShaderLight( Effect fx, EffectHandle elem )
            {
                this.fx = fx;

                diffuse = fx.GetParameterBySemantic( elem, "DIFFUSE" );
                ndlBias = fx.GetParameterBySemantic( elem, "NDLBIAS" );
                specular = fx.GetParameterBySemantic( elem, "SPECULAR" );
                specSharpness = fx.GetParameterBySemantic( elem, "SPECULARSHARPNESS" );
                direction = fx.GetParameterBySemantic( elem, "DIRECTION" );
            }
            public static ShaderLight[] GetLights( Effect fx )
            {
                EffectHandle lights = fx.GetParameterBySemantic( null, "LIGHTS" );
                int count = fx.GetParameterDescription( lights ).Elements;

                ShaderLight[] ret = new ShaderLight[count];
                for( int i = 0; i < ret.Length; i++ )
                    ret[i] = new ShaderLight( fx, fx.GetParameterElement( lights, i ) );

                return ret;
            }
        private void LoadSurfaceShaders()
        {
            shaders.Clear();

            Libx42.Model m = model.Model;

            if( m == null )
                return;

            Device device = pn3D.Device;

            string errs;
            shadedEffect = Effect.FromFile( device, Path.Combine( Application.StartupPath, "Media/ShadedPreview.fx" ), null,
                null, ShaderFlags.None, null, out errs );

            ehMv = shadedEffect.GetParameterBySemantic( null, "MODELVIEW" );
            ehMvp = shadedEffect.GetParameterBySemantic( null, "MODELVIEWPROJECTION" );
            ehCamPos = shadedEffect.GetParameterBySemantic( null, "CAMERAPOSITION" );

            ehAmbient = shadedEffect.GetParameterBySemantic( null, "LIGHTAMBIENT" );
            shaderLights = ShaderLight.GetLights( shadedEffect );

            ehBumpUnpack = shadedEffect.GetParameterBySemantic( null, "BUMPUNPACK" );

            defaultDiffuse = TextureLoader.FromFile( device, Path.Combine( Application.StartupPath, "Media/DefaultDiffuse.bmp" ),
                0, 0, 0, Usage.None, Format.Unknown, Pool.Managed, Filter.Box, Filter.Box, 0 );
            defaultNormal = TextureLoader.FromFile( device, Path.Combine( Application.StartupPath, "Media/DefaultNormal.bmp" ),
                0, 0, 0, Usage.None, Format.Unknown, Pool.Managed, Filter.Box, Filter.Box, 0 );

            foreach( Libx42.Group g in m.Groups )
            {
                if( shaders.ContainsKey( g.MaterialName ) )
                    continue;

                SurfaceShader shader = LoadSurfaceShader( g.MaterialName );

                if( shader != null )
                    shaders.Add( g.MaterialName, shader );
            }

            surfaceShadersLoaded = true;
        }