mirror of https://github.com/ArduPilot/ardupilot
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();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|