/// <summary> /// Constructs an atlas for the map using the given set of GrhIndexes. /// </summary> /// <param name="grhIndexes">The GrhIndexes.</param> void BuildAtlas(IEnumerable <GrhIndex> grhIndexes) { if (grhIndexes == null || grhIndexes.Count() == 0) { _mapAtlases = new List <Image>(0); return; } // First, grab the GrhData for each GrhIndex, making sure to skip null GrhDatas. Then, // grab all the frames and add them. Stationary GrhDatas will end up adding their self, while // animated ones will add all their frames, so this will end up adding them all no matter the type. // Finally, use Distinct to ensure we have no duplicates. var validGrhDatas = grhIndexes.Select(GrhInfo.GetData).Where(x => x != null); var atlasItems = validGrhDatas.SelectMany(x => x.Frames); atlasItems = atlasItems.Distinct(); // Dispose of the old atlas if needed if (_atlas != null && !_atlas.IsDisposed) { _atlas.Dispose(); } // Generate the atlas out of all the items _atlas = new TextureAtlas(atlasItems); }
protected override void OnExit() { while (circles.Count > 0) { CircleSprite sprite = circles[0]; circles.RemoveAt(0); RemoveChild(sprite); circleFactory.ReturnObject(sprite); } RemoveChild(background); atlas.Dispose(); }
/// <summary> /// Call this if you don't want to create more instances of this project to free up its memory and /// there are no simulations from this loader running. /// Note that this disposes the underlying texture atlas! /// After calling it createProjectInstance() will not work. /// </summary> public void Dispose() { _projectLoaded = false; _descJson = null; if (_atlas != null) { _atlas.Dispose(); } foreach (var rawEmitterData in _rawEmitterDatas) { rawEmitterData.Snapshot = null; } _rawEmitterDatas = new List <RawEmitterData>(); }
public void Dispose() { textRenderer?.Dispose(); spriteBatch?.Dispose(); (userInterface as IDisposable)?.Dispose(); worldRenderer?.Dispose(); worldProgram?.Dispose(); blockTextureAtlas?.Dispose(); window.Dispose(); }
public LatitudeLongitudeGrid() { Ellipsoid globeShape = Ellipsoid.Wgs84; _window = Device.CreateWindow(800, 600, "Chapter 4: Latitude Longitude Grid"); _window.Resize += OnResize; _window.RenderFrame += OnRenderFrame; _sceneState = new SceneState(); _camera = new CameraLookAtPoint(_sceneState.Camera, _window, globeShape); _clearState = new ClearState(); _sceneState.Camera.PerspectiveNearPlaneDistance = 0.01 * globeShape.MaximumRadius; _sceneState.Camera.PerspectiveFarPlaneDistance = 10.0 * globeShape.MaximumRadius; _sceneState.Camera.ZoomToTarget(globeShape.MaximumRadius); /////////////////////////////////////////////////////////////////// IList<GridResolution> gridResolutions = new List<GridResolution>(); gridResolutions.Add(new GridResolution( new Interval(0, 1000000, IntervalEndpoint.Closed, IntervalEndpoint.Open), new Vector2D(0.005, 0.005))); gridResolutions.Add(new GridResolution( new Interval(1000000, 2000000, IntervalEndpoint.Closed, IntervalEndpoint.Open), new Vector2D(0.01, 0.01))); gridResolutions.Add(new GridResolution( new Interval(2000000, 20000000, IntervalEndpoint.Closed, IntervalEndpoint.Open), new Vector2D(0.05, 0.05))); gridResolutions.Add(new GridResolution( new Interval(20000000, double.MaxValue, IntervalEndpoint.Closed, IntervalEndpoint.Open), new Vector2D(0.1, 0.1))); _globe = new LatitudeLongitudeGridGlobe(_window.Context); _globe.Texture = Device.CreateTexture2D(new Bitmap("NE2_50M_SR_W_4096.jpg"), TextureFormat.RedGreenBlue8, false); _globe.Shape = globeShape; _globe.GridResolutions = new GridResolutionCollection(gridResolutions); /////////////////////////////////////////////////////////////////// Vector3D vancouver = globeShape.ToVector3D(new Geodetic3D(Trig.ToRadians(-123.06), Trig.ToRadians(49.13), 0)); TextureAtlas atlas = new TextureAtlas(new Bitmap[] { new Bitmap("building.png"), Device.CreateBitmapFromText("Vancouver", new Font("Arial", 24)) }); _vancouverLabel = new BillboardCollection(_window.Context); _vancouverLabel.Texture = Device.CreateTexture2D(atlas.Bitmap, TextureFormat.RedGreenBlueAlpha8, false); _vancouverLabel.DepthTestEnabled = false; _vancouverLabel.Add(new Billboard() { Position = vancouver, TextureCoordinates = atlas.TextureCoordinates[0] }); _vancouverLabel.Add(new Billboard() { Position = vancouver, TextureCoordinates = atlas.TextureCoordinates[1], HorizontalOrigin = HorizontalOrigin.Left }); atlas.Dispose(); }
protected override void Dispose(bool disposeManaged) { _guiTextureAtlas.Dispose(); base.Dispose(disposeManaged); }
public virtual void Dispose( ) { TextureAtlas.Dispose( ); Palette.Dispose( ); Graphics.Dispose( ); }
public LatitudeLongitudeGrid() { Ellipsoid globeShape = Ellipsoid.Wgs84; _window = Device.CreateWindow(800, 600, "Chapter 4: Latitude Longitude Grid"); _window.Resize += OnResize; _window.RenderFrame += OnRenderFrame; _sceneState = new SceneState(); _camera = new CameraLookAtPoint(_sceneState.Camera, _window, globeShape); _clearState = new ClearState(); _sceneState.Camera.PerspectiveNearPlaneDistance = 0.01 * globeShape.MaximumRadius; _sceneState.Camera.PerspectiveFarPlaneDistance = 10.0 * globeShape.MaximumRadius; _sceneState.Camera.ZoomToTarget(globeShape.MaximumRadius); /////////////////////////////////////////////////////////////////// IList <GridResolution> gridResolutions = new List <GridResolution>(); gridResolutions.Add(new GridResolution( new Interval(0, 1000000, IntervalEndpoint.Closed, IntervalEndpoint.Open), new Vector2D(0.005, 0.005))); gridResolutions.Add(new GridResolution( new Interval(1000000, 2000000, IntervalEndpoint.Closed, IntervalEndpoint.Open), new Vector2D(0.01, 0.01))); gridResolutions.Add(new GridResolution( new Interval(2000000, 20000000, IntervalEndpoint.Closed, IntervalEndpoint.Open), new Vector2D(0.05, 0.05))); gridResolutions.Add(new GridResolution( new Interval(20000000, double.MaxValue, IntervalEndpoint.Closed, IntervalEndpoint.Open), new Vector2D(0.1, 0.1))); _globe = new LatitudeLongitudeGridGlobe(_window.Context); _globe.Texture = Device.CreateTexture2D(new Bitmap("NE2_50M_SR_W_4096.jpg"), TextureFormat.RedGreenBlue8, false); _globe.Shape = globeShape; _globe.GridResolutions = new GridResolutionCollection(gridResolutions); /////////////////////////////////////////////////////////////////// Vector3D vancouver = globeShape.ToVector3D(new Geodetic3D(Trig.ToRadians(-123.06), Trig.ToRadians(49.13), 0)); TextureAtlas atlas = new TextureAtlas(new Bitmap[] { new Bitmap("building.png"), Device.CreateBitmapFromText("Vancouver", new Font("Arial", 24)) }); _vancouverLabel = new BillboardCollection(_window.Context); _vancouverLabel.Texture = Device.CreateTexture2D(atlas.Bitmap, TextureFormat.RedGreenBlueAlpha8, false); _vancouverLabel.DepthTestEnabled = false; _vancouverLabel.Add(new Billboard() { Position = vancouver, TextureCoordinates = atlas.TextureCoordinates[0] }); _vancouverLabel.Add(new Billboard() { Position = vancouver, TextureCoordinates = atlas.TextureCoordinates[1], HorizontalOrigin = HorizontalOrigin.Left }); atlas.Dispose(); }
private void CreateScene() { DisposeScene(); _ellipsoid = new TessellatedGlobe(); _ellipsoid.Shape = _globeShape; _ellipsoid.NumberOfSlicePartitions = 64; _ellipsoid.NumberOfStackPartitions = 32; /////////////////////////////////////////////////////////////////// // 计算椭球网格 Mesh mesh = GeographicGridEllipsoidTessellator.Compute(_globeShape, 64, 32, GeographicGridEllipsoidVertexAttributes.Position); // 创建椭球网格线框显示对象 _wireframe = new Wireframe(_window.Context, mesh); _wireframe.Width = 2; /////////////////////////////////////////////////////////////////// // 创建坐标轴显示对象 _axes = new Axes(); _axes.Length = 1.5; _axes.Width = 3; /////////////////////////////////////////////////////////////////// // 计算p点椭球表面坐标 Vector3D p = _globeShape.ToVector3D(new Geodetic3D(0, Trig.ToRadians(45), 0)); // 计算p点地理法线向量 Vector3D deticNormal = _globeShape.GeodeticSurfaceNormal(p); // 计算p点地心法线向量 Vector3D centricNormal = Ellipsoid.CentricSurfaceNormal(p); double normalLength = _globeShape.MaximumRadius; // 计算地理法线末端点三维坐标 Vector3D pDetic = p + (normalLength * deticNormal); Vector3D pCentric = p + (normalLength * centricNormal); VertexAttributeFloatVector3 positionAttribute = new VertexAttributeFloatVector3("position", 4); // 创建地理法线段顶点 positionAttribute.Values.Add(p.ToVector3F()); positionAttribute.Values.Add(pDetic.ToVector3F()); // 创建地心法线段顶点 positionAttribute.Values.Add(p.ToVector3F()); positionAttribute.Values.Add(pCentric.ToVector3F()); VertexAttributeRGBA colorAttribute = new VertexAttributeRGBA("color", 4); // 创建地理法线段顶点颜色 colorAttribute.AddColor(Color.DarkGreen); colorAttribute.AddColor(Color.DarkGreen); // 创建地心法线段顶点颜色 colorAttribute.AddColor(Color.DarkCyan); colorAttribute.AddColor(Color.DarkCyan); // 创建地理/地心发现段图形显示元语 Mesh polyline = new Mesh(); polyline.PrimitiveType = PrimitiveType.Lines; polyline.Attributes.Add(positionAttribute); polyline.Attributes.Add(colorAttribute); _normals = new Polyline(); _normals.Set(_window.Context, polyline); _normals.Width = 3; /////////////////////////////////////////////////////////////////// Font font = new Font("Arial", 24); IList <Bitmap> labelBitmaps = new List <Bitmap>(2); labelBitmaps.Add(Device.CreateBitmapFromText("Geodetic", font)); labelBitmaps.Add(Device.CreateBitmapFromText("Geocentric", font)); font.Dispose(); // 创建纹理压缩对象? TextureAtlas atlas = new TextureAtlas(labelBitmaps); _labels = new BillboardCollection(_window.Context, 2); _labels.Texture = Device.CreateTexture2D(atlas.Bitmap, TextureFormat.RedGreenBlueAlpha8, false); _labels.Add(new Billboard() { Position = pDetic, // 取第一个纹理 TextureCoordinates = atlas.TextureCoordinates[0], Color = Color.DarkGreen, HorizontalOrigin = HorizontalOrigin.Right, VerticalOrigin = VerticalOrigin.Bottom }); _labels.Add(new Billboard() { Position = pCentric, // 取第二个纹理 TextureCoordinates = atlas.TextureCoordinates[1], Color = Color.DarkCyan, HorizontalOrigin = HorizontalOrigin.Right, VerticalOrigin = VerticalOrigin.Bottom }); atlas.Dispose(); /////////////////////////////////////////////////////////////////// Vector3D east = Vector3D.UnitZ.Cross(deticNormal); Vector3D north = deticNormal.Cross(east); // 创建p点切平面 _tangentPlane = new Plane(_window.Context); _tangentPlane.Origin = p; _tangentPlane.XAxis = east; _tangentPlane.YAxis = north; _tangentPlane.OutlineWidth = 3; }
private void CreateScene() { DisposeScene(); _ellipsoid = new TessellatedGlobe(); _ellipsoid.Shape = _globeShape; _ellipsoid.NumberOfSlicePartitions = 64; _ellipsoid.NumberOfStackPartitions = 32; /////////////////////////////////////////////////////////////////// Mesh mesh = GeographicGridEllipsoidTessellator.Compute(_globeShape, 64, 32, GeographicGridEllipsoidVertexAttributes.Position); _wireframe = new Wireframe(_window.Context, mesh); _wireframe.Width = 2; /////////////////////////////////////////////////////////////////// _axes = new Axes(); _axes.Length = 1.5; _axes.Width = 3; /////////////////////////////////////////////////////////////////// Vector3D p = _globeShape.ToVector3D(new Geodetic3D(0, Trig.ToRadians(45), 0)); Vector3D deticNormal = _globeShape.GeodeticSurfaceNormal(p); Vector3D centricNormal = Ellipsoid.CentricSurfaceNormal(p); double normalLength = _globeShape.MaximumRadius; Vector3D pDetic = p + (normalLength * deticNormal); Vector3D pCentric = p + (normalLength * centricNormal); VertexAttributeFloatVector3 positionAttribute = new VertexAttributeFloatVector3("position", 4); positionAttribute.Values.Add(p.ToVector3F()); positionAttribute.Values.Add(pDetic.ToVector3F()); positionAttribute.Values.Add(p.ToVector3F()); positionAttribute.Values.Add(pCentric.ToVector3F()); VertexAttributeRGBA colorAttribute = new VertexAttributeRGBA("color", 4); colorAttribute.AddColor(Color.DarkGreen); colorAttribute.AddColor(Color.DarkGreen); colorAttribute.AddColor(Color.DarkCyan); colorAttribute.AddColor(Color.DarkCyan); Mesh polyline = new Mesh(); polyline.PrimitiveType = PrimitiveType.Lines; polyline.Attributes.Add(positionAttribute); polyline.Attributes.Add(colorAttribute); _normals = new Polyline(); _normals.Set(_window.Context, polyline); _normals.Width = 3; /////////////////////////////////////////////////////////////////// Font font = new Font("Arial", 24); IList<Bitmap> labelBitmaps = new List<Bitmap>(2); labelBitmaps.Add(Device.CreateBitmapFromText("Geodetic", font)); labelBitmaps.Add(Device.CreateBitmapFromText("Geocentric", font)); font.Dispose(); TextureAtlas atlas = new TextureAtlas(labelBitmaps); _labels = new BillboardCollection(_window.Context, 2); _labels.Texture = Device.CreateTexture2D(atlas.Bitmap, TextureFormat.RedGreenBlueAlpha8, false); _labels.Add(new Billboard() { Position = pDetic, TextureCoordinates = atlas.TextureCoordinates[0], Color = Color.DarkGreen, HorizontalOrigin = HorizontalOrigin.Right, VerticalOrigin = VerticalOrigin.Bottom }); _labels.Add(new Billboard() { Position = pCentric, TextureCoordinates = atlas.TextureCoordinates[1], Color = Color.DarkCyan, HorizontalOrigin = HorizontalOrigin.Right, VerticalOrigin = VerticalOrigin.Bottom }); atlas.Dispose(); /////////////////////////////////////////////////////////////////// Vector3D east = Vector3D.UnitZ.Cross(deticNormal); Vector3D north = deticNormal.Cross(east); _tangentPlane = new Plane(_window.Context); _tangentPlane.Origin = p; _tangentPlane.XAxis = east; _tangentPlane.YAxis = north; _tangentPlane.OutlineWidth = 3; }