public Bitmap TerrainBitmap (Viewport viewport, bool threeD) { // AntiAliasing int width = viewport.Width * 2; int height = viewport.Height * 2; WarpRenderer renderer = new WarpRenderer (); if (!renderer.CreateScene (width, height)) { MainConsole.Instance.Error ("[Warp3D]: Unable to create the required scene! Maybe lack of RAM?"); return new Bitmap (Constants.RegionSize, Constants.RegionSize, PixelFormat.Format24bppRgb); } renderer.Scene.autoCalcNormals = false; if (threeD) renderer.SetBackgroundColor (SKYCOLOR); #region Camera warp_Vector pos = ConvertVector (viewport.Position); pos.z -= 0.001f; // Works around an issue with the Warp3D camera warp_Vector lookat = warp_Vector.add (ConvertVector (viewport.Position), ConvertVector (viewport.LookDirection)); renderer.Scene.defaultCamera.setPos (pos); renderer.Scene.defaultCamera.lookAt (lookat); if (viewport.Orthographic) { renderer.Scene.defaultCamera.isOrthographic = true; if (viewport.OrthoWindowWidth <= viewport.OrthoWindowHeight) { renderer.Scene.defaultCamera.orthoViewWidth = viewport.OrthoWindowWidth; renderer.Scene.defaultCamera.orthoViewHeight = viewport.OrthoWindowWidth; } else { renderer.Scene.defaultCamera.orthoViewWidth = viewport.OrthoWindowHeight; renderer.Scene.defaultCamera.orthoViewHeight = viewport.OrthoWindowHeight; } } else { viewport.Orthographic = false; float fov = viewport.FieldOfView; renderer.Scene.defaultCamera.setFov (fov); } #endregion Camera renderer.Scene.addLight ("Light1", new warp_Light (new warp_Vector (1.0f, 0.5f, 1f), 0xffffff, 0, 320, 40)); renderer.Scene.addLight ("Light2", new warp_Light (new warp_Vector (-1f, -1f, 1f), 0xffffff, 0, 100, 40)); try { CreateWater (renderer, threeD); CreateTerrain (renderer, m_textureTerrain); if (m_drawPrimVolume && m_primMesher != null) { foreach (ISceneChildEntity part in m_scene.Entities.GetEntities ().SelectMany (ent => ent.ChildrenEntities ())) CreatePrim (renderer, part); } } catch (Exception ex) { MainConsole.Instance.Warn ("[Warp3D]: Exception in the map generation, " + ex); } renderer.Render (); Bitmap bitmap = renderer.Scene.getImage (); // AntiAliasing using (Bitmap origBitmap = bitmap) bitmap = ImageUtils.ResizeImage (origBitmap, viewport.Width, viewport.Height); // Clean up SaveCache (); foreach (var o in renderer.Scene.objectData.Values) { warp_Object obj = (warp_Object)o; obj.vertexData = null; obj.triangleData = null; } renderer.Scene.removeAllObjects (); renderer.Reset (); m_colors.Clear (); //Force GC to try to clean this mess up GC.Collect (); return bitmap; }
public Bitmap TerrainBitmap(Viewport viewport, bool threeD, bool useTextures) { // AntiAliasing int width = viewport.Width * 2; int height = viewport.Height * 2; var texTerrain = m_textureTerrain & useTextures; var texPrims = m_texturePrims & useTextures; WarpRenderer renderer = new WarpRenderer(); if (!renderer.CreateScene(width, height)) { MainConsole.Instance.Error("[WarpTile generator]: Unable to create the required scene! Maybe lack of RAM?"); return(new Bitmap(Constants.RegionSize, Constants.RegionSize, PixelFormat.Format24bppRgb)); } renderer.Scene.autoCalcNormals = false; if (threeD) { renderer.SetBackgroundColor(SKYCOLOR); } #region Camera warp_Vector pos = ConvertVector(viewport.Position); pos.z -= 0.001f; // Works around an issue with the Warp3D camera warp_Vector lookat = warp_Vector.add(ConvertVector(viewport.Position), ConvertVector(viewport.LookDirection)); renderer.Scene.defaultCamera.setPos(pos); renderer.Scene.defaultCamera.lookAt(lookat); if (viewport.Orthographic) { renderer.Scene.defaultCamera.isOrthographic = true; if (viewport.OrthoWindowWidth <= viewport.OrthoWindowHeight) { renderer.Scene.defaultCamera.orthoViewWidth = viewport.OrthoWindowWidth; renderer.Scene.defaultCamera.orthoViewHeight = viewport.OrthoWindowWidth; } else { renderer.Scene.defaultCamera.orthoViewWidth = viewport.OrthoWindowHeight; renderer.Scene.defaultCamera.orthoViewHeight = viewport.OrthoWindowHeight; } } else { viewport.Orthographic = false; float fov = viewport.FieldOfView; renderer.Scene.defaultCamera.setFov(fov); } #endregion Camera renderer.Scene.addLight("Light1", new warp_Light(new warp_Vector(1.0f, 0.5f, 1f), 0xffffff, 0, 320, 40)); renderer.Scene.addLight("Light2", new warp_Light(new warp_Vector(-1f, -1f, 1f), 0xffffff, 0, 100, 40)); try { CreateWater(renderer, threeD); CreateTerrain(renderer, texTerrain); if (m_drawPrimVolume && m_primMesher != null) { foreach (ISceneChildEntity part in m_scene.Entities.GetEntities().SelectMany(ent => ent.ChildrenEntities())) { CreatePrim(renderer, part, texPrims); } } } catch (Exception ex) { MainConsole.Instance.Warn("[WarpTile generator]: Exception in the map generation, " + ex); } renderer.Render(); Bitmap bitmap = renderer.Scene.getImage(); // AntiAliasing using (Bitmap origBitmap = bitmap) bitmap = ImageUtils.ResizeImage(origBitmap, viewport.Width, viewport.Height); // Clean up SaveCache(); foreach (var o in renderer.Scene.objectData.Values) { warp_Object obj = (warp_Object)o; obj.vertexData = null; obj.triangleData = null; } renderer.Scene.removeAllObjects(); renderer.Reset(); m_colors.Clear(); //Force GC to try to clean this mess up GC.Collect(); return(bitmap); }