static bool arglPixelBufferDataUpload(ARGL_CONTEXT_SETTINGS contextSettings, byte[] bufDataPtr) { if (contextSettings == null) { return(false); } if (contextSettings.textureObjectsHaveBeenSetup || contextSettings.textureGeometryHasBeenSetup || contextSettings.pixSize == 0) { return(false); } GL1.ActiveTexture(All1.Texture0); GL1.BindTexture(All1.Texture2D, contextSettings.texture); GL1.PixelStore(All1.UnpackAlignment, (((contextSettings.bufSizeX * contextSettings.pixSize) & 0x3) == 0 ? 4 : 1)); if (contextSettings.bufSizeIsTextureSize) { GL1.TexImage2D(All1.Texture2D, 0, (OpenTK.Graphics.ES11.All)contextSettings.pixIntFormat, contextSettings.textureSizeX, contextSettings.textureSizeY, 0, (All1)contextSettings.pixFormat, (All1)contextSettings.pixType, bufDataPtr); } else { // Request OpenGL allocate memory internally for a power-of-two texture of the appropriate size. // Then send the NPOT-data as a subimage. GL1.TexImage2D(All1.Texture2D, 0, (OpenTK.Graphics.ES11.All)contextSettings.pixIntFormat, contextSettings.textureSizeX, contextSettings.textureSizeY, 0, (All1)contextSettings.pixFormat, (All1)contextSettings.pixType, IntPtr.Zero); GL1.TexSubImage2D(All1.Texture2D, 0, 0, 0, contextSettings.bufSizeX, contextSettings.bufSizeY, (All1)contextSettings.pixFormat, (All1)contextSettings.pixType, bufDataPtr); } contextSettings.textureDataReady = true; return(true); }
// Set up the texture objects. static bool arglSetupTextureObjects(ARGL_CONTEXT_SETTINGS contextSettings) { int textureWrapMode; // Delete previous textures, unless this is our first time here. if (contextSettings.textureObjectsHaveBeenSetup) { GL1.ActiveTexture(All1.Texture0); GL1.BindTexture(All1.Texture2D, 0); GL1.DeleteTextures(1, ref contextSettings.texture); contextSettings.textureObjectsHaveBeenSetup = false; } GL1.GenTextures(1, out contextSettings.texture); GL1.ActiveTexture(All1.Texture0); GL1.BindTexture(All1.Texture2D, contextSettings.texture); GL1.TexParameterx(All1.Texture2D, All1.TextureMinFilter, (int)All1.Linear); GL1.TexParameterx(All1.Texture2D, All1.TextureMagFilter, (int)All1.Linear); // Decide whether we can use GL_CLAMP_TO_EDGE. //if (arglGLCapabilityCheck(0x0120, (unsigned char *)"GL_SGIS_texture_edge_clamp")) { textureWrapMode = (int)All1.ClampToEdge; //} else { // textureWrapMode = (int)All1.Repeat; //} GL1.TexParameterx(All1.Texture2D, All1.TextureWrapS, textureWrapMode); GL1.TexParameterx(All1.Texture2D, All1.TextureWrapT, textureWrapMode); contextSettings.textureObjectsHaveBeenSetup = true; return(true); }
static void arglCleanup(ARGL_CONTEXT_SETTINGS contextSettings) { if (contextSettings == null) { return; // Sanity check. } if (contextSettings.textureObjectsHaveBeenSetup) { GL1.ActiveTexture(All1.Texture0); GL1.BindTexture(All1.Texture2D, 0); GL1.DeleteTextures(1, ref contextSettings.texture); } if (contextSettings.textureGeometryHasBeenSetup) { GL1.DeleteBuffers(1, ref contextSettings.t2bo); GL1.DeleteBuffers(1, ref contextSettings.v2bo); } contextSettings = null; }
static void arglDispImageStateful(ARGL_CONTEXT_SETTINGS contextSettings) { int texEnvModeSave; int i; if (contextSettings == null) { return; } if (contextSettings.textureObjectsHaveBeenSetup) { return; } if (contextSettings.textureGeometryHasBeenSetup) { return; } if (contextSettings.textureDataReady) { return; } GL1.ActiveTexture(All1.Texture0); GL1.MatrixMode(All1.Texture); GL1.LoadIdentity(); GL1.MatrixMode(All1.Modelview); GL1.BindTexture(All1.Texture2D, contextSettings.texture); GL1.GetTexEnv(All1.TextureEnv, All1.TextureEnvMode, out texEnvModeSave); // Save GL texture environment mode. if (texEnvModeSave != (int)All1.Replace) { GL1.TexEnv(All1.TextureEnv, All1.TextureEnvMode, (int)All1.Replace); } GL1.Enable(All1.Texture2D); GL1.ClientActiveTexture(All1.Texture0); GL1.BindBuffer(All1.ArrayBuffer, contextSettings.t2bo); GL1.TexCoordPointer(2, All1.Float, 0, IntPtr.Zero); GL1.EnableClientState(All1.TextureCoordArray); GL1.BindBuffer(All1.ArrayBuffer, contextSettings.v2bo); GL1.VertexPointer(2, All1.Float, 0, IntPtr.Zero); GL1.EnableClientState(All1.VertexArray); GL1.DisableClientState(All1.NormalArray); if (contextSettings.disableDistortionCompensation) { GL1.DrawArrays(All1.TriangleStrip, 0, 4); } else { for (i = 0; i < 20; i++) { GL1.DrawArrays(All1.TriangleStrip, i * 42, 42); } } GL1.BindBuffer(All1.ArrayBuffer, 0); GL1.DisableClientState(All1.VertexArray); GL1.DisableClientState(All1.TextureCoordArray); GL1.Disable(All1.Texture2D); if (texEnvModeSave != (int)All1.Replace) { GL1.TexEnv(All1.TextureEnv, All1.TextureEnvMode, texEnvModeSave); // Restore GL texture environment mode. } }