public void WindingOrderOnEllipsoid() { IList <Vector3D> positions = new List <Vector3D>(); positions.Add(Ellipsoid.UnitSphere.ToVector3D(Trig.ToRadians(new Geodetic3D(0, 0)))); positions.Add(Ellipsoid.UnitSphere.ToVector3D(Trig.ToRadians(new Geodetic3D(1, 0)))); positions.Add(Ellipsoid.UnitSphere.ToVector3D(Trig.ToRadians(new Geodetic3D(1, 1)))); EllipsoidTangentPlane plane = new EllipsoidTangentPlane(Ellipsoid.UnitSphere, positions); ICollection <Vector2D> positionsOnPlane = plane.ComputePositionsOnPlane(positions); Assert.AreEqual(PolygonWindingOrder.Counterclockwise, SimplePolygonAlgorithms.ComputeWindingOrder(positionsOnPlane)); }
public void WindingOrderOnEllipsoid2() { IList<Vector3D> positions = new List<Vector3D>(); positions.Add(Ellipsoid.UnitSphere.ToVector3D(Trig.ToRadians(new Geodetic3D(1, 1)))); positions.Add(Ellipsoid.UnitSphere.ToVector3D(Trig.ToRadians(new Geodetic3D(1, 0)))); positions.Add(Ellipsoid.UnitSphere.ToVector3D(Trig.ToRadians(new Geodetic3D(0, 0)))); EllipsoidTangentPlane plane = new EllipsoidTangentPlane(Ellipsoid.UnitSphere, positions); ICollection<Vector2D> positionsOnPlane = plane.ComputePositionsOnPlane(positions); Assert.AreEqual(PolygonWindingOrder.Clockwise, SimplePolygonAlgorithms.ComputeWindingOrder(positionsOnPlane)); }
public Polygon(Context context, Ellipsoid globeShape, IEnumerable<Vector3D> positions) { Verify.ThrowIfNull(context); Verify.ThrowIfNull(globeShape); // // Pipeline Stage 1a: Clean up - Remove duplicate positions // List<Vector3D> cleanPositions = (List<Vector3D>)SimplePolygonAlgorithms.Cleanup(positions); // // Pipeline Stage 1b: Clean up - Swap winding order // EllipsoidTangentPlane plane = new EllipsoidTangentPlane(globeShape, cleanPositions); ICollection<Vector2D> positionsOnPlane = plane.ComputePositionsOnPlane(cleanPositions); if (SimplePolygonAlgorithms.ComputeWindingOrder(positionsOnPlane) == PolygonWindingOrder.Clockwise) { cleanPositions.Reverse(); //((List<Vector2D>)positionsOnPlane).Reverse(); } // // Pipeline Stage 2: Triangulate // IndicesUnsignedInt indices = EarClippingOnEllipsoid.Triangulate(cleanPositions); //IndicesInt32 indices = EarClipping.Triangulate(positionsOnPlane); // // Pipeline Stage 3: Subdivide // TriangleMeshSubdivisionResult result = TriangleMeshSubdivision.Compute(cleanPositions, indices, Trig.ToRadians(1)); // // Pipeline Stage 4: Set height // VertexAttributeDoubleVector3 positionsAttribute = new VertexAttributeDoubleVector3( "position", (result.Indices.Values.Count / 3) + 2); foreach (Vector3D position in result.Positions) { positionsAttribute.Values.Add(globeShape.ScaleToGeocentricSurface(position)); } Mesh mesh = new Mesh(); mesh.PrimitiveType = PrimitiveType.Triangles; mesh.FrontFaceWindingOrder = WindingOrder.Counterclockwise; mesh.Attributes.Add(positionsAttribute); mesh.Indices = result.Indices; ShaderProgram sp = Device.CreateShaderProgram( EmbeddedResources.GetText("OpenGlobe.Scene.Renderables.Polygon.Shaders.PolygonVS.glsl"), EmbeddedResources.GetText("OpenGlobe.Scene.Renderables.Polygon.Shaders.PolygonFS.glsl")); ((Uniform<Vector3F>)sp.Uniforms["u_globeOneOverRadiiSquared"]).Value = globeShape.OneOverRadiiSquared.ToVector3F(); _colorUniform = (Uniform<Vector4F>)sp.Uniforms["u_color"]; _drawState = new DrawState(); _drawState.RenderState.Blending.Enabled = true; _drawState.RenderState.Blending.SourceRGBFactor = SourceBlendingFactor.SourceAlpha; _drawState.RenderState.Blending.SourceAlphaFactor = SourceBlendingFactor.SourceAlpha; _drawState.RenderState.Blending.DestinationRGBFactor = DestinationBlendingFactor.OneMinusSourceAlpha; _drawState.RenderState.Blending.DestinationAlphaFactor = DestinationBlendingFactor.OneMinusSourceAlpha; _drawState.ShaderProgram = sp; _meshBuffers = Device.CreateMeshBuffers(mesh, _drawState.ShaderProgram.VertexAttributes, BufferHint.StaticDraw); _primitiveType = mesh.PrimitiveType; Color = Color.White; }