mirror of
https://github.com/ArduPilot/ardupilot
synced 2025-01-05 15:38:29 -04:00
9223177355
Modify Hud center add 3dr snr's and snr based distance estimate display current frame type fix disapearing window add base xml level to param xml (xml standard) add georef kml refrence this includes adams new dynamic params
229 lines
7.4 KiB
C#
229 lines
7.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using OpenTK;
|
|
using OpenTK.Graphics.OpenGL;
|
|
using System.Drawing.Imaging;
|
|
using System.Drawing;
|
|
|
|
namespace ArdupilotMega.Controls
|
|
{
|
|
public class OpenGLtest : GLControl
|
|
{
|
|
int fixme;
|
|
Bitmap _terrain = new Bitmap(640,480);
|
|
|
|
public OpenGLtest()
|
|
{
|
|
InitializeComponent();
|
|
|
|
try
|
|
{
|
|
_terrain = new Bitmap(@"C:\Users\hog\Pictures\Denmark\[Group 1]-P1020169_P1020174-6 images.jpg");
|
|
}
|
|
catch { }
|
|
|
|
_terrain = new Bitmap(_terrain, 512, 512);
|
|
|
|
|
|
GL.GenTextures(1, out texture);
|
|
GL.BindTexture(TextureTarget.Texture2D, texture);
|
|
|
|
BitmapData data = _terrain.LockBits(new System.Drawing.Rectangle(0, 0, _terrain.Width, _terrain.Height),
|
|
ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);
|
|
|
|
//Console.WriteLine("w {0} h {1}",data.Width, data.Height);
|
|
|
|
GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgba, data.Width, data.Height, 0,
|
|
OpenTK.Graphics.OpenGL.PixelFormat.Bgra, PixelType.UnsignedByte, data.Scan0);
|
|
|
|
_terrain.UnlockBits(data);
|
|
|
|
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
|
|
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Linear);
|
|
|
|
}
|
|
|
|
const float rad2deg = (float)(180 / Math.PI);
|
|
const float deg2rad = (float)(1.0 / rad2deg);
|
|
|
|
int[,] getElevationData(double lat, double lng, double direction)
|
|
{
|
|
int[,] answer = new int[400,400];
|
|
|
|
double step = 0.00083333333333333;
|
|
|
|
for (int y = 0; y < answer.GetLength(0) - 1; y++)
|
|
{
|
|
Console.WriteLine(y);
|
|
for (int x = 0; x < answer.GetLength(1) - 1; x++)
|
|
{
|
|
double mlat = lat + step * (float)y + Math.Sin(direction * deg2rad) * step * (float)y;
|
|
double mlng = lng + step * (float)x + Math.Cos(direction * deg2rad) * step * (float)x;
|
|
|
|
// Console.WriteLine(mlat + " "+mlng);
|
|
|
|
int alt = srtm.getAltitude(mlat, mlng, 20);
|
|
answer[x,y] = alt;
|
|
}
|
|
}
|
|
|
|
return answer;
|
|
}
|
|
|
|
int texture = 0;
|
|
private System.ComponentModel.IContainer components;
|
|
|
|
public Vector3 Normal(Vector3 a, Vector3 b, Vector3 c)
|
|
{
|
|
var dir = Vector3.Cross(b - a, c - a);
|
|
var norm = Vector3.Normalize(dir);
|
|
return norm;
|
|
}
|
|
|
|
float _angle = 0;
|
|
double cameraX, cameraY, cameraZ; // camera coordinates
|
|
double lookX, lookY, lookZ; // camera look-at coordinates
|
|
|
|
|
|
protected override void OnPaint(System.Windows.Forms.PaintEventArgs e)
|
|
{
|
|
if (this.DesignMode)
|
|
return;
|
|
|
|
_angle+=1;
|
|
|
|
try
|
|
{
|
|
base.OnPaint(e);
|
|
|
|
}
|
|
catch { return; }
|
|
|
|
float scale = 1.0f;
|
|
|
|
float radians = (float)(Math.PI*(_angle-90.0f)/180.0f);
|
|
|
|
int mouseY = (int)(900 * scale);
|
|
|
|
// calculate the camera's position
|
|
cameraX = lookX + Math.Sin(radians)*mouseY; // multiplying by mouseY makes the
|
|
cameraZ = lookZ + Math.Cos(radians)*mouseY; // camera get closer/farther away with mouseY
|
|
cameraY = lookY + mouseY / 2.0f;
|
|
|
|
// calculate the camera look-at coordinates as the center of the terrain map
|
|
lookX = (_terrain.Width * scale) / 2.0f;
|
|
lookY = 0 * scale;
|
|
lookZ = (_terrain.Height * scale) / 2.0f;
|
|
|
|
|
|
|
|
MakeCurrent();
|
|
|
|
GL.ClearColor(Color.Green);
|
|
|
|
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
|
|
GL.LoadIdentity();
|
|
|
|
OpenTK.Graphics.Glu.LookAt(cameraX, cameraY, cameraZ, lookX, lookY, lookZ, 0.0, 1.0, 0.0);
|
|
|
|
GL.Enable(EnableCap.Texture2D);
|
|
GL.BindTexture(TextureTarget.Texture2D, texture);
|
|
|
|
double mlat = -34.73306;
|
|
double mlng = 117.8864897;
|
|
double step = 0.00083333333333333;
|
|
|
|
int increment =50;
|
|
|
|
for (int z = 0; z < _terrain.Height - 1; z += increment)
|
|
{
|
|
//Makes OpenGL draw a triangle at every three consecutive vertices
|
|
GL.Begin(BeginMode.TriangleStrip);
|
|
for (int x = 0; x < _terrain.Width - 1; x += increment)
|
|
{
|
|
|
|
// Console.WriteLine(mlat + step * z +" "+ mlng + step * x);
|
|
|
|
int heightl = srtm.getAltitude(mlat + step * z, mlng + step * x, 20);
|
|
|
|
//GL.Color3(_terrain.GetPixel(x, z));
|
|
GL.TexCoord2((x / (float)_terrain.Width), (z / (float)_terrain.Height));
|
|
GL.Vertex3(x * scale, heightl, z * scale); // _terrain.GetPixel(x, z).R
|
|
|
|
try
|
|
{
|
|
heightl = srtm.getAltitude(mlat + step * (z + increment), mlng + step * (x), 20);
|
|
|
|
//GL.Color3(_terrain.GetPixel(x, z + increment));
|
|
GL.TexCoord2((x / (float)_terrain.Width), ((z + increment) / (float)_terrain.Height));
|
|
GL.Vertex3(x * scale, heightl, z + increment * scale);
|
|
}
|
|
catch { break; }
|
|
|
|
}
|
|
GL.End();
|
|
}
|
|
|
|
GL.Enable(EnableCap.Blend);
|
|
GL.DepthMask(false);
|
|
GL.BlendFunc(BlendingFactorSrc.SrcAlpha, BlendingFactorDest.One);
|
|
GL.DepthMask(true);
|
|
GL.Disable(EnableCap.Blend);
|
|
|
|
GL.Flush();
|
|
|
|
|
|
this.SwapBuffers();
|
|
|
|
// this.Invalidate();
|
|
}
|
|
|
|
private void InitializeComponent()
|
|
{
|
|
this.SuspendLayout();
|
|
//
|
|
// OpenGLtest
|
|
//
|
|
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
|
|
this.Name = "OpenGLtest";
|
|
this.Load += new System.EventHandler(this.test_Load);
|
|
this.Resize += new System.EventHandler(this.test_Resize);
|
|
this.ResumeLayout(false);
|
|
|
|
}
|
|
|
|
private void test_Load(object sender, EventArgs e)
|
|
{
|
|
GL.Enable(EnableCap.DepthTest);
|
|
// GL.Enable(EnableCap.Light0);
|
|
// GL.Enable(EnableCap.Lighting);
|
|
GL.Enable(EnableCap.ColorMaterial);
|
|
GL.Enable(EnableCap.Normalize);
|
|
|
|
//GL.Enable(EnableCap.LineSmooth);
|
|
//GL.Enable(EnableCap.PointSmooth);
|
|
//GL.Enable(EnableCap.PolygonSmooth);
|
|
GL.ShadeModel(ShadingModel.Smooth);
|
|
GL.Enable(EnableCap.CullFace);
|
|
GL.Enable(EnableCap.Texture2D);
|
|
|
|
}
|
|
|
|
private void test_Resize(object sender, EventArgs e)
|
|
{
|
|
GL.Viewport(0, 0, this.Width, this.Height);
|
|
GL.MatrixMode(MatrixMode.Projection);
|
|
GL.LoadIdentity();
|
|
if (Height == 0)
|
|
Height = 1;
|
|
|
|
OpenTK.Graphics.Glu.Perspective(54.0f, this.Width / this.Height, 1.0f, 5000.0f);
|
|
|
|
GL.MatrixMode(MatrixMode.Modelview);
|
|
GL.LoadIdentity();
|
|
}
|
|
}
|
|
}
|