Example #1
0
        internal void LoadFromDisk(string filename)
        {
            if (Path.GetExtension(filename).ToLower() == ".dds")
            {
                try
                {
                    ImageDDS.LoadFromDisk(RFileSystem.Instance.GetFilePath(filename), out Id, out textureTarget, out pixelFormat, out pixelType);
                }catch (Exception e) {
                    RLog.Error("Error loading texture from: " + filename);
                    RLog.Error(e);
                }
            }
            else
            {
                try
                {
                    ImageGDI.LoadFromDisk(RFileSystem.Instance.GetFilePath(filename), out Id, out textureTarget, out pixelFormat, out pixelType);
                }catch (Exception e) {
                    RLog.Error("Error loading texture from: " + filename);
                    RLog.Error(e);
                    return;
                }
            }
            if (Id == 0 || textureTarget == 0)
            {
                RLog.Error("Error generating OpenGL texture from: " + filename);
                return;
            }

            // load succeeded, Texture can be used.
            Bind();
            int max_level = 0;
            int min_level = 0;

            REngine.CheckGLError();
            GL.TexParameterI(textureTarget, TextureParameterName.TextureBaseLevel, ref min_level);
            REngine.CheckGLError();
            GL.TexParameterI(textureTarget, TextureParameterName.TextureMaxLevel, ref max_level);
            REngine.CheckGLError();
            GL.TexParameter(textureTarget, TextureParameterName.TextureMagFilter, (int)RTextureMagFilter.Linear);
            REngine.CheckGLError();
            GL.TexParameter(textureTarget, TextureParameterName.TextureMinFilter, (int)RTextureMinFilter.Linear);
            REngine.CheckGLError();
            GL.TexParameter(textureTarget, TextureParameterName.TextureMaxLod, 0);
            REngine.CheckGLError();
            GL.TexParameter(textureTarget, TextureParameterName.TextureMinLod, 0);
            REngine.CheckGLError();
            int height, width;

            GL.GetTexLevelParameter(textureTarget, 0, GetTextureParameter.TextureHeight, out height);
            REngine.CheckGLError();
            GL.GetTexLevelParameter(textureTarget, 0, GetTextureParameter.TextureWidth, out width);
            REngine.CheckGLError();
            Bounds = new Reactor.Math.Rectangle(0, 0, width, height);
            RLog.Info("Texture loaded from: " + filename);
        }
Example #2
0
        internal void LoadFromData(byte[] data, string name, bool isCompressed)
        {
            if (isCompressed)
            {
                try
                {
                    ImageDDS.LoadFromData(data, name, out Id, out textureTarget, out pixelFormat, out pixelType);
                }catch (Exception e) {
                    RLog.Error("Error loading texture for: " + name);
                    RLog.Error(e.Message);
                    RLog.Error(e);
                }
            }
            else
            {
                try
                {
                    ImageGDI.LoadFromData(data, out Id, out textureTarget, out pixelFormat, out pixelType);
                }catch (Exception e) {
                    RLog.Error("Error loading texture for: " + name);
                    RLog.Error(e.Message);
                    RLog.Error(e);
                }
            }
            if (Id == 0 || textureTarget == 0)
            {
                RLog.Error("Error generating OpenGL texture for: " + name);
            }

            // load succeeded, Texture can be used.
            Bind();
            GL.TexParameter(textureTarget, TextureParameterName.TextureMagFilter, (int)RTextureMagFilter.Linear);
            int MipMapCount;

            GL.GetTexParameter(textureTarget, GetTextureParameter.TextureMaxLevel, out MipMapCount);
            if (MipMapCount == 0)   // if no MipMaps are present, use linear Filter
            {
                GL.TexParameter(textureTarget, TextureParameterName.TextureMinFilter, (int)RTextureMinFilter.Linear);
            }
            else // MipMaps are present, use trilinear Filter
            {
                GL.TexParameter(textureTarget, TextureParameterName.TextureMinFilter, (int)RTextureMinFilter.LinearMipmapLinear);
            }
            int height, width;

            GL.GetTexParameter(textureTarget, GetTextureParameter.TextureHeight, out height);
            GL.GetTexParameter(textureTarget, GetTextureParameter.TextureWidth, out width);

            Bounds = new Reactor.Math.Rectangle(0, 0, width, height);
            RLog.Info("Texture loaded for: " + name);
        }
Example #3
0
        /// <summary>
        /// Loads a texture from a dds file
        /// </summary>
        /// <param name="fileName">The file to be loaded</param>
        /// <returns>The texture object</returns>
        public static Texture2D FromDdsFile(string fileName)
        {
            if (fileName == null)
            {
                throw new ArgumentNullException("fileName");
            }

            uint          name;
            TextureTarget dim;

            ImageDDS.LoadFromDisk(fileName, out name, out dim);

            if (dim != TextureTarget.Texture2D)
            {
                throw new InvalidDataException("Texture was not 2D.");
            }

            if (!GL.IsTexture(name))
            {
                throw new InvalidDataException("Texture loading failed.");
            }

            return(new Texture2D(name));
        }
        /// <summary>Setup OpenGL and load resources here.</summary>
        /// <param name="e">Not used.</param>
        protected override void OnLoad(EventArgs e)
        {
            this.VSync = VSyncMode.Off;

            // Check for necessary capabilities:
            string extensions = GL.GetString(StringName.Extensions);

            if (!GL.GetString(StringName.Extensions).Contains("GL_ARB_shading_language"))
            {
                throw new NotSupportedException(String.Format("This example requires OpenGL 2.0. Found {0}. Aborting.",
                                                              GL.GetString(StringName.Version).Substring(0, 3)));
            }

            if (!extensions.Contains("GL_ARB_texture_compression") ||
                !extensions.Contains("GL_EXT_texture_compression_s3tc"))
            {
                throw new NotSupportedException("This example requires support for texture compression. Aborting.");
            }

            int[] temp = new int[1];
            GL.GetInteger(GetPName.MaxTextureImageUnits, out temp[0]);
            Trace.WriteLine(temp[0] + " TMU's for Fragment Shaders found. (2 required)");

            GL.GetInteger(GetPName.MaxVaryingFloats, out temp[0]);
            Trace.WriteLine(temp[0] + " varying floats between VS and FS allowed. (6 required)");

            GL.GetInteger(GetPName.MaxVertexUniformComponents, out temp[0]);
            Trace.WriteLine(temp[0] + " uniform components allowed in Vertex Shader. (6 required)");

            GL.GetInteger(GetPName.MaxFragmentUniformComponents, out temp[0]);
            Trace.WriteLine(temp[0] + " uniform components allowed in Fragment Shader. (11 required)");
            Trace.WriteLine("");

            #region GL State

            GL.ClearColor(0.2f, 0f, 0.4f, 0f);

            GL.PointSize(10f);

            GL.Disable(EnableCap.Dither);

            GL.FrontFace(FrontFaceDirection.Ccw);
            GL.PolygonMode(MaterialFace.Front, PolygonMode.Fill);
            GL.PolygonMode(MaterialFace.Back, PolygonMode.Line);

            #endregion GL State

            #region Shaders

            string LogInfo;

            // Load&Compile Vertex Shader

            using (StreamReader sr = new StreamReader(VertexShaderFilename))
            {
                VertexShaderObject = GL.CreateShader(ShaderType.VertexShader);
                GL.ShaderSource(VertexShaderObject, sr.ReadToEnd( ));
                GL.CompileShader(VertexShaderObject);
            }

            GL.GetShaderInfoLog(VertexShaderObject, out LogInfo);
            if (LogInfo.Length > 0 && !LogInfo.Contains("hardware"))
            {
                Trace.WriteLine("Vertex Shader failed!\nLog:\n" + LogInfo);
            }
            else
            {
                Trace.WriteLine("Vertex Shader compiled without complaint.");
            }

            // Load&Compile Fragment Shader

            using (StreamReader sr = new StreamReader(FragmentShaderFilename))
            {
                FragmentShaderObject = GL.CreateShader(ShaderType.FragmentShader);
                GL.ShaderSource(FragmentShaderObject, sr.ReadToEnd( ));
                GL.CompileShader(FragmentShaderObject);
            }
            GL.GetShaderInfoLog(FragmentShaderObject, out LogInfo);

            if (LogInfo.Length > 0 && !LogInfo.Contains("hardware"))
            {
                Trace.WriteLine("Fragment Shader failed!\nLog:\n" + LogInfo);
            }
            else
            {
                Trace.WriteLine("Fragment Shader compiled without complaint.");
            }

            // Link the Shaders to a usable Program
            ProgramObject = GL.CreateProgram( );
            GL.AttachShader(ProgramObject, VertexShaderObject);
            GL.AttachShader(ProgramObject, FragmentShaderObject);

            // must bind the attribute before linking
            GL.BindAttribLocation(ProgramObject, AttribTangent, "AttributeTangent");

            // link it all together
            GL.LinkProgram(ProgramObject);

            // flag ShaderObjects for delete when not used anymore
            GL.DeleteShader(VertexShaderObject);
            GL.DeleteShader(FragmentShaderObject);

            GL.GetProgram(ProgramObject, GetProgramParameterName.LinkStatus, out temp[0]);
            Trace.WriteLine("Linking Program (" + ProgramObject + ") " + ((temp[0] == 1) ? "succeeded." : "FAILED!"));
            if (temp[0] != 1)
            {
                GL.GetProgramInfoLog(ProgramObject, out LogInfo);
                Trace.WriteLine("Program Log:\n" + LogInfo);
            }

            GL.GetProgram(ProgramObject, GetProgramParameterName.ActiveAttributes, out temp[0]);
            Trace.WriteLine("Program registered " + temp[0] + " Attributes. (Should be 4: Pos, UV, Normal, Tangent)");

            Trace.WriteLine("Tangent attribute bind location: " + GL.GetAttribLocation(ProgramObject, "AttributeTangent"));

            Trace.WriteLine("End of Shader build. GL Error: " + GL.GetError( ));

            #endregion Shaders

            #region Textures

            TextureLoaderParameters.MagnificationFilter = TextureMagFilter.Linear;
            TextureLoaderParameters.MinificationFilter  = TextureMinFilter.LinearMipmapLinear;
            TextureLoaderParameters.WrapModeS           = TextureWrapMode.ClampToBorder;
            TextureLoaderParameters.WrapModeT           = TextureWrapMode.ClampToBorder;
            TextureLoaderParameters.EnvMode             = TextureEnvMode.Modulate;

            ImageDDS.LoadFromDisk(TMU0_Filename, out TMU0_Handle, out TMU0_Target);
            Trace.WriteLine("Loaded " + TMU0_Filename + " with handle " + TMU0_Handle + " as " + TMU0_Target);

            ImageDDS.LoadFromDisk(TMU1_Filename, out TMU1_Handle, out TMU1_Target);
            Trace.WriteLine("Loaded " + TMU1_Filename + " with handle " + TMU1_Handle + " as " + TMU1_Target);

            #endregion Textures

            Trace.WriteLine("End of Texture Loading. GL Error: " + GL.GetError( ));
            Trace.WriteLine("");
        }