void RenderableMinimap_WriteNextFrameEvent(Vector3 camerapos) { //Console.WriteLine( "RenderableMinimap_WriteNextFrameEvent" ); GetDimensions(); GraphicsHelperGl g = new GraphicsHelperGl(); g.CheckError(); //LogFile.GetInstance().WriteLine( windowwidth + " " + windowheight + " " + RendererSdl.GetInstance().OuterWindowWidth + " " + RendererSdl.GetInstance().OuterWindowHeight ); g.ApplyOrtho(windowwidth, windowheight, RendererSdl.GetInstance().OuterWindowWidth, RendererSdl.GetInstance().OuterWindowHeight); g.CheckError(); DrawMinimap(); g.CheckError(); DrawFrustrum(camerapos); g.CheckError(); if (Render != null) { Render(minimapx, minimapy, minimapwidth, minimapheight); } g.CheckError(); g.RemoveOrtho(); g.CheckError(); }
// what we need to do is to render the splatted texture in ortho mode with lighting off // or normals off (to be tested) // then to export the generated bitmap // viewport should be set to heightmapwidth x heightmapheight public void Export(string filepath) { Terrain terrain = Terrain.GetInstance(); int picturewidth = terrain.MapWidth * Terrain.SquareSize; int pictureheight = terrain.MapHeight * Terrain.SquareSize; LogFile.GetInstance().WriteLine("Export to " + filepath + " picturewidth " + picturewidth + " pictureheight: " + pictureheight); //int windowwidth = RendererSdl.GetInstance().WindowWidth; //int windowheight = RendererSdl.GetInstance().WindowHeight; int windowwidth = 256; int windowheight = 256; Gl.glViewport(0, 0, windowwidth, windowheight); byte[] buffer = new byte[windowwidth * windowheight * 4]; //System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap( picturewidth, pictureheight ); //byte[] imagedata = new byte[picturewidth * pictureheight * 4]; Image image = new Image(picturewidth, pictureheight); List<RendererPass> rendererpasses = new List<RendererPass>(); bool multipass = true; // force multipass for now for simplicity int maxtexels = RendererSdl.GetInstance().MaxTexelUnits; if (multipass) { for (int i = 0; i < terrain.texturestages.Count; i++) { MapTextureStage maptexturestage = terrain.texturestages[i]; int numtexturestagesrequired = maptexturestage.NumTextureStagesRequired; if (numtexturestagesrequired > 0) // exclude Nops { RendererPass rendererpass = new RendererPass(maxtexels); for (int j = 0; j < maptexturestage.NumTextureStagesRequired; j++) { rendererpass.AddStage(new RendererTextureStage(maptexturestage, j, true, picturewidth, pictureheight)); } rendererpasses.Add(rendererpass); } } } GraphicsHelperGl g = new GraphicsHelperGl(); Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glPushMatrix(); Gl.glLoadIdentity(); Gl.glOrtho(0, windowwidth, windowheight, 0, -1, 1); Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glPushMatrix(); Gl.glLoadIdentity(); Gl.glDisable(Gl.GL_CULL_FACE); Gl.glDisable(Gl.GL_LIGHTING); g.EnableBlendSrcAlpha(); Gl.glDepthFunc( Gl.GL_LEQUAL ); for (int chunkx = 0; chunkx < Math.Ceiling((double)picturewidth / windowwidth); chunkx++) { for (int chunky = 0; chunky < Math.Ceiling((double)pictureheight / windowheight); chunky++) { Console.WriteLine("chunkx " + chunkx + " chunky " + chunky); Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); // Clear The Screen And Depth Buffer foreach (RendererPass rendererpass in rendererpasses) { rendererpass.Apply(); Gl.glBegin(Gl.GL_QUADS); double ul = (chunkx * windowwidth); double ur = (chunkx * windowwidth + windowwidth); double vt = (chunky * windowheight); double vb = (chunky * windowheight + windowheight); Gl.glTexCoord2d( ul,vt ); Gl.glMultiTexCoord2dARB(Gl.GL_TEXTURE1_ARB,ul, vt); Gl.glVertex2i(0, 0); Gl.glTexCoord2d( ul,vb ); Gl.glMultiTexCoord2dARB(Gl.GL_TEXTURE1_ARB,ul, vb); Gl.glVertex2i(0, windowheight); Gl.glTexCoord2d( ur,vb ); Gl.glMultiTexCoord2dARB(Gl.GL_TEXTURE1_ARB,ur, vb); Gl.glVertex2i(windowwidth, windowheight); Gl.glTexCoord2d( ur,vt ); Gl.glMultiTexCoord2dARB(Gl.GL_TEXTURE1_ARB,ur, vt); Gl.glVertex2i(windowwidth, 0); Gl.glEnd(); } IntPtr ptr = Marshal.AllocHGlobal(windowwidth * windowheight * 4); Gl.glReadPixels(0, 0, windowwidth, windowheight, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, ptr); Marshal.Copy(ptr, buffer, 0, windowwidth * windowheight * 4); Marshal.FreeHGlobal(ptr); for (int x = 0; x < windowwidth; x++) { for (int y = 0; y < windowheight; y++) { if ((chunky * windowheight + y < pictureheight) && (chunkx * windowwidth + x < picturewidth)) { int pixeloffset = (windowheight - y - 1) * windowwidth * 4 + x * 4; //bitmap.SetPixel(x + chunkx * windowwidth, y + chunky * windowheight, System.Drawing.Color.FromArgb(buffer[pixeloffset + 0], //buffer[pixeloffset + 1], buffer[pixeloffset + 2])); image.SetPixel(x + chunkx * windowwidth, y + chunky * windowheight, buffer[pixeloffset + 0], buffer[pixeloffset + 1], buffer[pixeloffset + 2], 255 ); } } } } } if (File.Exists(filepath)) { File.Delete(filepath); } image.Save(filepath); //DevIL.DevIL.SaveBitmap( filepath, bitmap); Gl.glPopMatrix(); Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glPopMatrix(); Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glEnable(Gl.GL_LIGHTING); g.ActiveTexture(1); g.DisableTexture2d(); g.SetTextureScale(1); g.ActiveTexture(0); g.SetTextureScale(1); Gl.glEnable(Gl.GL_CULL_FACE); Gl.glEnable(Gl.GL_LIGHTING); Gl.glDisable(Gl.GL_BLEND); g.EnableModulate(); Gl.glViewport(0, 0, RendererSdl.GetInstance().OuterWindowWidth, RendererSdl.GetInstance().OuterWindowHeight); g.CheckError(); MainUI.GetInstance().uiwindow.InfoMessage("Exported blended terrain texture to " + filepath); }
// returns byte buffer in raw RGBA format, 32bits per pixel // opengl needs to be initialized for this to run // normally the renderer is initialized before anything else (in MapDesigner.cs), so this should be ok public byte[] CreateUnitPic(string s3ofilepath, int width, int height) { int picturewidth = 96; int pictureheight = 96; GraphicsHelperGl g = new GraphicsHelperGl(); Unit unit = new S3oLoader().LoadS3o(s3ofilepath); Gl.glViewport(0, 0, picturewidth, pictureheight); // Set Our Viewport (Match Texture Size) //Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Set The Clear Color To Medium Blue Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glPushMatrix(); Gl.glLoadIdentity(); Glu.gluPerspective(60.0, (float)picturewidth / (float)pictureheight, 0.1, 1000.0); Gl.glMatrixMode(Gl.GL_MODELVIEW); /* * float[] ambientLight = new float[] { 1.0f, 1.0f, 1.0f, 1.0f }; * float[] diffuseLight = new float[] { 0.6f, 0.6f, 0.6f, 1.0f }; * float[] specularLight = new float[] { 0.2f, 0.2f, 0.2f, 1.0f }; * float[] position = new float[] { -1.5f, 1.0f, -4.0f, 1.0f }; * * Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, ambientLight); * Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, diffuseLight); * Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_SPECULAR, specularLight); * Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, position); */ Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); // Clear The Screen And Depth Buffer Gl.glPushMatrix(); Gl.glLoadIdentity(); Gl.glRotated(-20, 0, 1, 0); Gl.glTranslated(-8, -8, -27); Gl.glRotated(-90, 1, 0, 0); Gl.glEnable(Gl.GL_LIGHTING); unit.Render(); Gl.glPopMatrix(); //g.Bind2DTexture(0); //Gl.glDeleteTextures(2, new int[] { unittexture1, unittexture2 }); Gl.glViewport(0, 0, RendererSdl.GetInstance().OuterWindowWidth, RendererSdl.GetInstance().OuterWindowHeight); Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glPopMatrix(); Gl.glMatrixMode(Gl.GL_MODELVIEW); g.CheckError(); byte[] buffer = new byte[pictureheight * picturewidth * 4]; IntPtr ptr = Marshal.AllocHGlobal(picturewidth * pictureheight * 4); Gl.glReadPixels(0, 0, picturewidth, pictureheight, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, ptr); Marshal.Copy(ptr, buffer, 0, picturewidth * pictureheight * 4); Marshal.FreeHGlobal(ptr); // flip /* or not * byte[] newbuffer = new byte[pictureheight * picturewidth * 4]; * for (int x = 0; x < picturewidth; x++) * { * for (int y = 0; y < picturewidth; y++) * { * for (int i = 0; i < 4; i++) * { * newbuffer[( pictureheight - y - 1 ) * picturewidth * 4 + x * 4 + i] = buffer[y * picturewidth * 4 + x * 4 + i]; * } * } * } */ return(buffer); }
// returns byte buffer in raw RGBA format, 32bits per pixel // opengl needs to be initialized for this to run // normally the renderer is initialized before anything else (in MapDesigner.cs), so this should be ok public byte[] CreateUnitPic(string s3ofilepath, int width, int height ) { int picturewidth = 96; int pictureheight = 96; GraphicsHelperGl g = new GraphicsHelperGl(); Unit unit = new S3oLoader().LoadS3o(s3ofilepath); Gl.glViewport(0, 0, picturewidth, pictureheight); // Set Our Viewport (Match Texture Size) //Gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Set The Clear Color To Medium Blue Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glPushMatrix(); Gl.glLoadIdentity(); Glu.gluPerspective(60.0, (float)picturewidth / (float)pictureheight, 0.1, 1000.0); Gl.glMatrixMode(Gl.GL_MODELVIEW); /* float[] ambientLight = new float[] { 1.0f, 1.0f, 1.0f, 1.0f }; float[] diffuseLight = new float[] { 0.6f, 0.6f, 0.6f, 1.0f }; float[] specularLight = new float[] { 0.2f, 0.2f, 0.2f, 1.0f }; float[] position = new float[] { -1.5f, 1.0f, -4.0f, 1.0f }; Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_AMBIENT, ambientLight); Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_DIFFUSE, diffuseLight); Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_SPECULAR, specularLight); Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, position); */ Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); // Clear The Screen And Depth Buffer Gl.glPushMatrix(); Gl.glLoadIdentity(); Gl.glRotated(-20, 0, 1, 0); Gl.glTranslated(-8, -8, -27); Gl.glRotated(-90, 1, 0, 0); Gl.glEnable(Gl.GL_LIGHTING); unit.Render(); Gl.glPopMatrix(); //g.Bind2DTexture(0); //Gl.glDeleteTextures(2, new int[] { unittexture1, unittexture2 }); Gl.glViewport(0, 0, RendererSdl.GetInstance().OuterWindowWidth, RendererSdl.GetInstance().OuterWindowHeight); Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glPopMatrix(); Gl.glMatrixMode(Gl.GL_MODELVIEW); g.CheckError(); byte[] buffer = new byte[pictureheight * picturewidth * 4]; IntPtr ptr = Marshal.AllocHGlobal(picturewidth * pictureheight * 4); Gl.glReadPixels(0, 0, picturewidth, pictureheight, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, ptr); Marshal.Copy(ptr, buffer, 0, picturewidth * pictureheight * 4); Marshal.FreeHGlobal(ptr); // flip /* or not byte[] newbuffer = new byte[pictureheight * picturewidth * 4]; for (int x = 0; x < picturewidth; x++) { for (int y = 0; y < picturewidth; y++) { for (int i = 0; i < 4; i++) { newbuffer[( pictureheight - y - 1 ) * picturewidth * 4 + x * 4 + i] = buffer[y * picturewidth * 4 + x * 4 + i]; } } } */ return buffer; }
// what we need to do is to render the splatted texture in ortho mode with lighting off // or normals off (to be tested) // then to export the generated bitmap // viewport should be set to heightmapwidth x heightmapheight public void Export(string filepath) { Terrain terrain = Terrain.GetInstance(); int picturewidth = terrain.MapWidth * Terrain.SquareSize; int pictureheight = terrain.MapHeight * Terrain.SquareSize; LogFile.GetInstance().WriteLine("Export to " + filepath + " picturewidth " + picturewidth + " pictureheight: " + pictureheight); //int windowwidth = RendererSdl.GetInstance().WindowWidth; //int windowheight = RendererSdl.GetInstance().WindowHeight; int windowwidth = 256; int windowheight = 256; Gl.glViewport(0, 0, windowwidth, windowheight); byte[] buffer = new byte[windowwidth * windowheight * 4]; //System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap( picturewidth, pictureheight ); //byte[] imagedata = new byte[picturewidth * pictureheight * 4]; Image image = new Image(picturewidth, pictureheight); List <RendererPass> rendererpasses = new List <RendererPass>(); bool multipass = true; // force multipass for now for simplicity int maxtexels = RendererSdl.GetInstance().MaxTexelUnits; if (multipass) { for (int i = 0; i < terrain.texturestages.Count; i++) { MapTextureStage maptexturestage = terrain.texturestages[i]; int numtexturestagesrequired = maptexturestage.NumTextureStagesRequired; if (numtexturestagesrequired > 0) // exclude Nops { RendererPass rendererpass = new RendererPass(maxtexels); for (int j = 0; j < maptexturestage.NumTextureStagesRequired; j++) { rendererpass.AddStage(new RendererTextureStage(maptexturestage, j, true, picturewidth, pictureheight)); } rendererpasses.Add(rendererpass); } } } GraphicsHelperGl g = new GraphicsHelperGl(); Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glPushMatrix(); Gl.glLoadIdentity(); Gl.glOrtho(0, windowwidth, windowheight, 0, -1, 1); Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glPushMatrix(); Gl.glLoadIdentity(); Gl.glDisable(Gl.GL_CULL_FACE); Gl.glDisable(Gl.GL_LIGHTING); g.EnableBlendSrcAlpha(); Gl.glDepthFunc(Gl.GL_LEQUAL); for (int chunkx = 0; chunkx < Math.Ceiling((double)picturewidth / windowwidth); chunkx++) { for (int chunky = 0; chunky < Math.Ceiling((double)pictureheight / windowheight); chunky++) { Console.WriteLine("chunkx " + chunkx + " chunky " + chunky); Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT); // Clear The Screen And Depth Buffer foreach (RendererPass rendererpass in rendererpasses) { rendererpass.Apply(); Gl.glBegin(Gl.GL_QUADS); double ul = (chunkx * windowwidth); double ur = (chunkx * windowwidth + windowwidth); double vt = (chunky * windowheight); double vb = (chunky * windowheight + windowheight); Gl.glTexCoord2d(ul, vt); Gl.glMultiTexCoord2dARB(Gl.GL_TEXTURE1_ARB, ul, vt); Gl.glVertex2i(0, 0); Gl.glTexCoord2d(ul, vb); Gl.glMultiTexCoord2dARB(Gl.GL_TEXTURE1_ARB, ul, vb); Gl.glVertex2i(0, windowheight); Gl.glTexCoord2d(ur, vb); Gl.glMultiTexCoord2dARB(Gl.GL_TEXTURE1_ARB, ur, vb); Gl.glVertex2i(windowwidth, windowheight); Gl.glTexCoord2d(ur, vt); Gl.glMultiTexCoord2dARB(Gl.GL_TEXTURE1_ARB, ur, vt); Gl.glVertex2i(windowwidth, 0); Gl.glEnd(); } IntPtr ptr = Marshal.AllocHGlobal(windowwidth * windowheight * 4); Gl.glReadPixels(0, 0, windowwidth, windowheight, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, ptr); Marshal.Copy(ptr, buffer, 0, windowwidth * windowheight * 4); Marshal.FreeHGlobal(ptr); for (int x = 0; x < windowwidth; x++) { for (int y = 0; y < windowheight; y++) { if ((chunky * windowheight + y < pictureheight) && (chunkx * windowwidth + x < picturewidth)) { int pixeloffset = (windowheight - y - 1) * windowwidth * 4 + x * 4; //bitmap.SetPixel(x + chunkx * windowwidth, y + chunky * windowheight, System.Drawing.Color.FromArgb(buffer[pixeloffset + 0], //buffer[pixeloffset + 1], buffer[pixeloffset + 2])); image.SetPixel(x + chunkx * windowwidth, y + chunky * windowheight, buffer[pixeloffset + 0], buffer[pixeloffset + 1], buffer[pixeloffset + 2], 255 ); } } } } } if (File.Exists(filepath)) { File.Delete(filepath); } image.Save(filepath); //DevIL.DevIL.SaveBitmap( filepath, bitmap); Gl.glPopMatrix(); Gl.glMatrixMode(Gl.GL_PROJECTION); Gl.glPopMatrix(); Gl.glMatrixMode(Gl.GL_MODELVIEW); Gl.glEnable(Gl.GL_LIGHTING); g.ActiveTexture(1); g.DisableTexture2d(); g.SetTextureScale(1); g.ActiveTexture(0); g.SetTextureScale(1); Gl.glEnable(Gl.GL_CULL_FACE); Gl.glEnable(Gl.GL_LIGHTING); Gl.glDisable(Gl.GL_BLEND); g.EnableModulate(); Gl.glViewport(0, 0, RendererSdl.GetInstance().OuterWindowWidth, RendererSdl.GetInstance().OuterWindowHeight); g.CheckError(); MainUI.GetInstance().uiwindow.InfoMessage("Exported blended terrain texture to " + filepath); }
void RenderableMinimap_WriteNextFrameEvent(Vector3 camerapos) { //Console.WriteLine( "RenderableMinimap_WriteNextFrameEvent" ); GetDimensions(); GraphicsHelperGl g = new GraphicsHelperGl(); g.CheckError(); //LogFile.GetInstance().WriteLine( windowwidth + " " + windowheight + " " + RendererSdl.GetInstance().OuterWindowWidth + " " + RendererSdl.GetInstance().OuterWindowHeight ); g.ApplyOrtho( windowwidth, windowheight, RendererSdl.GetInstance().OuterWindowWidth, RendererSdl.GetInstance().OuterWindowHeight ); g.CheckError(); DrawMinimap(); g.CheckError(); DrawFrustrum(camerapos); g.CheckError(); if (Render != null) { Render(minimapx, minimapy, minimapwidth, minimapheight); } g.CheckError(); g.RemoveOrtho(); g.CheckError(); }