--- /dev/null
+namespace Radegast
+{
+ partial class MapControl
+ {
+ /// <summary>
+ /// Required designer variable.
+ /// </summary>
+ private System.ComponentModel.IContainer components = null;
+
+ /// <summary>
+ /// Clean up any resources being used.
+ /// </summary>
+ /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region Component Designer generated code
+
+ /// <summary>
+ /// Required method for Designer support - do not modify
+ /// the contents of this method with the code editor.
+ /// </summary>
+ private void InitializeComponent()
+ {
+ this.SuspendLayout();
+ //
+ // MapControl
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.DoubleBuffered = true;
+ this.Name = "MapControl";
+ this.Size = new System.Drawing.Size(589, 409);
+ this.Paint += new System.Windows.Forms.PaintEventHandler(this.MapControl_Paint);
+ this.Click += new System.EventHandler(this.MapControl_Click);
+ this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.MapControl_MouseMove);
+ this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MapControl_MouseDown);
+ this.Resize += new System.EventHandler(this.MapControl_Resize);
+ this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.MapControl_MouseUp);
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+ }
+}
--- /dev/null
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Drawing;
+using System.Data;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+using System.Drawing.Drawing2D;
+using OpenMetaverse;
+
+namespace Radegast
+{
+ public partial class MapControl : UserControl
+ {
+ RadegastInstance Instance;
+ GridClient Client { get { return Instance.Client; } }
+ Color background;
+ float zoom;
+ Font textFont;
+ Brush textBrush;
+ Brush textBackgroudBrush;
+ uint regionSize = 256;
+ float pixelsPerMeter;
+ double centerX;
+ double centerY;
+ bool centered = false;
+
+ public MapControl(RadegastInstance instance)
+ {
+ Zoom = 2f;
+
+ InitializeComponent();
+ Disposed += new EventHandler(MapControl_Disposed);
+ this.Instance = instance;
+
+ background = Color.FromArgb(4, 4, 75);
+ textFont = new Font(FontFamily.GenericSansSerif, 8.0f, FontStyle.Bold);
+ textBrush = new SolidBrush(Color.FromArgb(255, 200, 200, 200));
+ textBackgroudBrush = new SolidBrush(Color.Black);
+ CenterMap(1130, 1071, 128, 128);
+ }
+
+ void MapControl_Disposed(object sender, EventArgs e)
+ {
+ }
+
+ public float Zoom
+ {
+ get { return zoom; }
+ set
+ {
+ if (value >= 1f && value <= 4f)
+ {
+ zoom = value;
+ pixelsPerMeter = 1f / zoom;
+ Invalidate();
+ }
+ }
+ }
+
+ public void CenterMap(uint regionHandle, uint localX, uint localY)
+ {
+ uint regionX, regionY;
+ Utils.LongToUInts(regionHandle, out regionX, out regionY);
+ CenterMap(regionX, regionY, localX, localY);
+ }
+
+ public void CenterMap(uint regionX, uint regionY, uint localX, uint localY)
+ {
+ centerX = (double)regionX * 256 + (double)localX;
+ centerY = (double)regionY * 256 + (double)localY;
+ centered = true;
+ }
+
+ public static ulong GlobalPosToRegionHandle(double globalX, double globalY, out float localX, out float localY)
+ {
+ uint x = ((uint)globalX / 256) * 256;
+ uint y = ((uint)globalY / 256) * 256;
+ localX = (float)(globalX - (double)x);
+ localY = (float)(globalY - (double)y);
+ return Utils.UIntsToLong(x, y);
+ }
+
+
+ void Print(Graphics g, float x, float y, string text)
+ {
+ g.DrawString(text, textFont, textBackgroudBrush, x + 1, y + 1);
+ g.DrawString(text, textFont, textBrush, x, y);
+ }
+
+ void DrawRegion(Graphics g, int x, int y, ulong handle)
+ {
+ uint regX, regY;
+ Utils.LongToUInts(handle, out regX, out regY);
+ regX /= regionSize;
+ regY /= regionSize;
+ string name = string.Format("{0:0}, {1:0}", regX, regY);
+ Print(g, x + 2, y - 16, name);
+ float regS = regionSize / zoom;
+ g.DrawRectangle(SystemPens.Window, (float)x, y - regS, regS, regS);
+ }
+
+ private void MapControl_Paint(object sender, PaintEventArgs e)
+ {
+ Graphics g = e.Graphics;
+ g.Clear(background);
+ if (!centered) return;
+ int h = e.ClipRectangle.Height, w = e.ClipRectangle.Width;
+
+ g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.ClearTypeGridFit;
+
+
+ float localX, localY;
+ ulong centerRegion = GlobalPosToRegionHandle(centerX, centerY, out localX, out localY);
+ int pixCenterRegionX = (int)(w / 2 - localX / zoom);
+ int pixCenterRegionY = (int)(h / 2 + localY / zoom);
+
+ uint regX, regY;
+ Utils.LongToUInts(centerRegion, out regX, out regY);
+ regX /= regionSize;
+ regY /= regionSize;
+
+ int pixRegS = (int)(regionSize / zoom);
+ int regLeft = (int)regX - ((int)(pixCenterRegionX / pixRegS) + 1);
+ if (regLeft < 0) regLeft = 0;
+ int regTop = (int)regY - ((int)(pixCenterRegionY / pixRegS));
+ if (regTop < 0) regTop = 0;
+
+ for (int ry = regTop; ry < regTop + e.ClipRectangle.Height / pixRegS + 2; ry++)
+ {
+ for (int rx = regLeft; rx < regLeft + e.ClipRectangle.Width / pixRegS + 2; rx++)
+ {
+ DrawRegion(g,
+ pixCenterRegionX - ((int)regX - rx) * pixRegS,
+ pixCenterRegionY + (ry - (int)regY) * pixRegS,
+ Utils.UIntsToLong((uint)rx * regionSize, (uint)ry * regionSize));
+ //System.Console.Write("({0}, {1}) ", rx, ry);
+ }
+ //System.Console.WriteLine();
+ }
+ //System.Console.WriteLine("Reg left: {0}, reg top {1}", regLeft, regTop);
+
+ //DrawRegion(g, pixCenterRegionX, pixCenterRegionY, centerRegion);
+ }
+
+ #region Mouse handling
+ private void MapControl_Click(object sender, EventArgs e)
+ {
+ }
+
+ protected override void OnMouseWheel(MouseEventArgs e)
+ {
+ base.OnMouseWheel(e);
+ if (e.Delta > 0)
+ Zoom += 0.25f;
+ else
+ Zoom -= 0.25f;
+ }
+
+ bool dragging = false;
+ int dragX, dragY;
+
+ private void MapControl_MouseDown(object sender, MouseEventArgs e)
+ {
+ if (e.Button == MouseButtons.Left)
+ {
+ dragging = true;
+ dragX = e.X;
+ dragY = e.Y;
+ }
+ }
+
+ private void MapControl_MouseUp(object sender, MouseEventArgs e)
+ {
+ if (e.Button == MouseButtons.Left)
+ {
+ dragging = false;
+ }
+
+ }
+
+ private void MapControl_MouseMove(object sender, MouseEventArgs e)
+ {
+ if (dragging)
+ {
+ centerX -= (e.X - dragX) / pixelsPerMeter;
+ centerY += (e.Y - dragY) / pixelsPerMeter;
+ dragX = e.X;
+ dragY = e.Y;
+ Invalidate();
+ }
+ }
+
+ private void MapControl_Resize(object sender, EventArgs e)
+ {
+ Invalidate();
+ }
+ #endregion Mouse handling
+ }
+}
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<root>\r
+ <!-- \r
+ Microsoft ResX Schema \r
+ \r
+ Version 2.0\r
+ \r
+ The primary goals of this format is to allow a simple XML format \r
+ that is mostly human readable. The generation and parsing of the \r
+ various data types are done through the TypeConverter classes \r
+ associated with the data types.\r
+ \r
+ Example:\r
+ \r
+ ... ado.net/XML headers & schema ...\r
+ <resheader name="resmimetype">text/microsoft-resx</resheader>\r
+ <resheader name="version">2.0</resheader>\r
+ <resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>\r
+ <resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>\r
+ <data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>\r
+ <data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>\r
+ <data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">\r
+ <value>[base64 mime encoded serialized .NET Framework object]</value>\r
+ </data>\r
+ <data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">\r
+ <value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>\r
+ <comment>This is a comment</comment>\r
+ </data>\r
+ \r
+ There are any number of "resheader" rows that contain simple \r
+ name/value pairs.\r
+ \r
+ Each data row contains a name, and value. The row also contains a \r
+ type or mimetype. Type corresponds to a .NET class that support \r
+ text/value conversion through the TypeConverter architecture. \r
+ Classes that don't support this are serialized and stored with the \r
+ mimetype set.\r
+ \r
+ The mimetype is used for serialized objects, and tells the \r
+ ResXResourceReader how to depersist the object. This is currently not \r
+ extensible. For a given mimetype the value must be set accordingly:\r
+ \r
+ Note - application/x-microsoft.net.object.binary.base64 is the format \r
+ that the ResXResourceWriter will generate, however the reader can \r
+ read any of the formats listed below.\r
+ \r
+ mimetype: application/x-microsoft.net.object.binary.base64\r
+ value : The object must be serialized with \r
+ : System.Runtime.Serialization.Formatters.Binary.BinaryFormatter\r
+ : and then encoded with base64 encoding.\r
+ \r
+ mimetype: application/x-microsoft.net.object.soap.base64\r
+ value : The object must be serialized with \r
+ : System.Runtime.Serialization.Formatters.Soap.SoapFormatter\r
+ : and then encoded with base64 encoding.\r
+\r
+ mimetype: application/x-microsoft.net.object.bytearray.base64\r
+ value : The object must be serialized into a byte array \r
+ : using a System.ComponentModel.TypeConverter\r
+ : and then encoded with base64 encoding.\r
+ -->\r
+ <xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">\r
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace" />\r
+ <xsd:element name="root" msdata:IsDataSet="true">\r
+ <xsd:complexType>\r
+ <xsd:choice maxOccurs="unbounded">\r
+ <xsd:element name="metadata">\r
+ <xsd:complexType>\r
+ <xsd:sequence>\r
+ <xsd:element name="value" type="xsd:string" minOccurs="0" />\r
+ </xsd:sequence>\r
+ <xsd:attribute name="name" use="required" type="xsd:string" />\r
+ <xsd:attribute name="type" type="xsd:string" />\r
+ <xsd:attribute name="mimetype" type="xsd:string" />\r
+ <xsd:attribute ref="xml:space" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ <xsd:element name="assembly">\r
+ <xsd:complexType>\r
+ <xsd:attribute name="alias" type="xsd:string" />\r
+ <xsd:attribute name="name" type="xsd:string" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ <xsd:element name="data">\r
+ <xsd:complexType>\r
+ <xsd:sequence>\r
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+ <xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />\r
+ </xsd:sequence>\r
+ <xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />\r
+ <xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />\r
+ <xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />\r
+ <xsd:attribute ref="xml:space" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ <xsd:element name="resheader">\r
+ <xsd:complexType>\r
+ <xsd:sequence>\r
+ <xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />\r
+ </xsd:sequence>\r
+ <xsd:attribute name="name" type="xsd:string" use="required" />\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ </xsd:choice>\r
+ </xsd:complexType>\r
+ </xsd:element>\r
+ </xsd:schema>\r
+ <resheader name="resmimetype">\r
+ <value>text/microsoft-resx</value>\r
+ </resheader>\r
+ <resheader name="version">\r
+ <value>2.0</value>\r
+ </resheader>\r
+ <resheader name="reader">\r
+ <value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+ </resheader>\r
+ <resheader name="writer">\r
+ <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>\r
+ </resheader>\r
+</root>
\ No newline at end of file