private void Clean(Context context) { if (_dirty) { if (_va != null) { _va.Dispose(); _va = null; _drawState.VertexArray = null; _drawStateSolid.VertexArray = null; } Mesh mesh = BoxTessellator.Compute(2 * _shape.Radii); _va = context.CreateVertexArray(mesh, _drawState.ShaderProgram.VertexAttributes, BufferHint.StaticDraw); _drawState.VertexArray = _va; _drawStateSolid.VertexArray = _va; _primitiveType = mesh.PrimitiveType; _renderState.FacetCulling.FrontFaceWindingOrder = mesh.FrontFaceWindingOrder; ((Uniform<Vector3F>)_drawState.ShaderProgram.Uniforms["u_globeOneOverRadiiSquared"]).Value = _shape.OneOverRadiiSquared.ToVector3F(); ((Uniform<Vector3F>)_drawStateSolid.ShaderProgram.Uniforms["u_globeOneOverRadiiSquared"]).Value = _shape.OneOverRadiiSquared.ToVector3F(); if (_wireframe != null) { _wireframe.Dispose(); _wireframe = null; } _wireframe = new Wireframe(context, mesh); _wireframe.FacetCullingFace = CullFace.Front; _wireframe.Width = 3; _dirty = false; } }
private void Update(Context context) { if (_dirtyVA) { Vector3D radii = new Vector3D(_tileResolution.X, _tileResolution.Y, (_tileMaximumHeight - _tileMinimumHeight) * _heightExaggeration.Value); Vector3D halfRadii = 0.5 * radii; Mesh mesh = BoxTessellator.Compute(radii); // // TEXEL_SPACE_TODO: Translate box so it is not centered at // the origin - world space and texel space will match up. // IList<Vector3D> positions = ((VertexAttributeDoubleVector3)mesh.Attributes["position"]).Values; for (int i = 0; i < positions.Count; ++i) { positions[i] = positions[i] + halfRadii; } if (_drawState.VertexArray != null) { _drawState.VertexArray.Dispose(); _drawState.VertexArray = null; } _drawState.VertexArray = context.CreateVertexArray(mesh, _drawState.ShaderProgram.VertexAttributes, BufferHint.StaticDraw); _primitiveType = mesh.PrimitiveType; _drawState.RenderState.FacetCulling.FrontFaceWindingOrder = mesh.FrontFaceWindingOrder; if (_wireframe != null) { _wireframe.Dispose(); } _wireframe = new Wireframe(context, mesh); _wireframe.FacetCullingFace = CullFace.Front; _wireframe.Width = 3; _dirtyVA = false; } }
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; }