public PointsGisLayer(Game engine, int maxPointsCount, bool isDynamic = false) : base(engine) { DotsBuffer = new ConstantBuffer(engine.GraphicsDevice, typeof(DotsData)); ColorBuffer = new ConstantBuffer(engine.GraphicsDevice, typeof(ColorData), 16); PointsCountToDraw = maxPointsCount; PointsDrawOffset = 0; SizeMultiplier = 1; IsDynamic = isDynamic; var vbOptions = isDynamic ? VertexBufferOptions.Dynamic : VertexBufferOptions.Default; firstBuffer = new VertexBuffer(engine.GraphicsDevice, typeof(Gis.GeoPoint), maxPointsCount, vbOptions); currentBuffer = firstBuffer; PointsCpu = new Gis.GeoPoint[maxPointsCount]; Flags = (int) (PointFlags.DOTS_WORLDSPACE); shader = Game.Content.Load<Ubershader>("globe.Point.hlsl"); factory = shader.CreateFactory( typeof(PointFlags), Primitive.PointList, VertexInputElement.FromStructure<Gis.GeoPoint>(), BlendState.AlphaBlend, RasterizerState.CullCCW, DepthStencilState.None); ColorDatas = new ColorData[16]; for (int i = 0; i < ColorDatas.Length; i++) { ColorDatas[i] = new ColorData {Color = Color.White}; } ColorBuffer.SetData(ColorDatas); }
public static PolyGisLayer CreateFromUtmFbxModel(Game engine, string fileName) { var scene = engine.Content.Load<Scene>(fileName); var s = fileName.Split('_'); double easting = double.Parse(s[1]); double northing = double.Parse(s[2]); string region = s[3]; var transforms = new Matrix[scene.Nodes.Count]; scene.ComputeAbsoluteTransforms(transforms); List<Gis.GeoPoint> points = new List<Gis.GeoPoint>(); List<int> indeces = new List<int>(); var oInfo = new SelectInfo[scene.Meshes.Count]; for (int i = 0; i < scene.Nodes.Count; i++) { var meshIndex = scene.Nodes[i].MeshIndex; if (meshIndex < 0) { continue; } oInfo[meshIndex] = new SelectInfo { MeshIndex = meshIndex, NodeIndex = i, NodeName = scene.Nodes[i].Name }; int vertexOffset = points.Count; var world = transforms[i]; double worldLon, worldLat; Gis.UtmToLatLon(easting + world.TranslationVector.X, northing - world.TranslationVector.Z, region, out worldLon, out worldLat); var worldBasis = GeoHelper.CalculateBasisOnSurface(DMathUtil.DegreesToRadians(new DVector2(worldLon, worldLat))); var worldBasisInvert = DMatrix.Invert(worldBasis); oInfo[meshIndex].WorldMatrix = worldBasis; oInfo[meshIndex].WorldMatrixInvert = worldBasisInvert; List<Vector3> cartPoints = new List<Vector3>(); foreach (var vert in scene.Meshes[meshIndex].Vertices) { var pos = vert.Position; var worldPos = Vector3.TransformCoordinate(pos, world); var worldNorm = Vector3.TransformNormal(vert.Normal, world); double lon, lat; Gis.UtmToLatLon(easting + worldPos.X, northing - worldPos.Z, region, out lon, out lat); DVector3 norm = new DVector3(worldNorm.X, worldNorm.Z, worldNorm.Y); norm.Normalize(); norm = DVector3.TransformNormal(norm, DMatrix.RotationYawPitchRoll(DMathUtil.DegreesToRadians(lon), DMathUtil.DegreesToRadians(lat), 0)); norm.Normalize(); norm.Y = -norm.Y; lon = DMathUtil.DegreesToRadians(lon) + 0.0000068; lat = DMathUtil.DegreesToRadians(lat) + 0.0000113; cartPoints.Add(DVector3.TransformCoordinate(GeoHelper.SphericalToCartesian(new DVector2(lon, lat), GeoHelper.EarthRadius + worldPos.Y / 1000.0f), worldBasisInvert).ToVector3()); var point = new Gis.GeoPoint { Lon = lon, Lat = lat, Color = vert.Color0, Tex0 = new Vector4(norm.ToVector3(), 0), Tex1 = new Vector4(0,0,0, worldPos.Y/1000.0f) }; point.Color.Alpha = 0.5f; points.Add(point); } oInfo[meshIndex].BoundingBox = BoundingBox.FromPoints(cartPoints.ToArray()); var inds = scene.Meshes[meshIndex].GetIndices(); foreach (var ind in inds) { indeces.Add(vertexOffset + ind); } } return new PolyGisLayer(engine, points.ToArray(), indeces.ToArray(), false) { objectsInfo = oInfo }; }