private void RenderText() { lock (Prims) { int primNr = 0; foreach (FacetedMesh mesh in Prims.Values) { primNr++; Primitive prim = mesh.Prim; if (!string.IsNullOrEmpty(prim.Text)) { string text = System.Text.RegularExpressions.Regex.Replace(prim.Text, "(\r?\n)+", "\n"); OpenTK.Vector3 screenPos = OpenTK.Vector3.Zero; OpenTK.Vector3 primPos = OpenTK.Vector3.Zero; // Is it child prim FacetedMesh parent = null; if (Prims.TryGetValue(prim.ParentID, out parent)) { var newPrimPos = prim.Position * Matrix4.CreateFromQuaternion(parent.Prim.Rotation); primPos = new OpenTK.Vector3(newPrimPos.X, newPrimPos.Y, newPrimPos.Z); } primPos.Z += prim.Scale.Z * 0.8f; if (!Math3D.GluProject(primPos, ModelMatrix, ProjectionMatrix, Viewport, out screenPos)) { continue; } screenPos.Y = glControl.Height - screenPos.Y; textRendering.Begin(); Color color = Color.FromArgb((int)(prim.TextColor.A * 255), (int)(prim.TextColor.R * 255), (int)(prim.TextColor.G * 255), (int)(prim.TextColor.B * 255)); TextFormatFlags flags = TextFormatFlags.HorizontalCenter | TextFormatFlags.Top; using (Font f = new Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular)) { var size = TextRendering.Measure(text, f, flags); screenPos.X -= size.Width / 2; screenPos.Y -= size.Height; // Shadow if (color != Color.Black) { textRendering.Print(text, f, Color.Black, new Rectangle((int)screenPos.X + 1, (int)screenPos.Y + 1, size.Width, size.Height), flags); } textRendering.Print(text, f, color, new Rectangle((int)screenPos.X, (int)screenPos.Y, size.Width, size.Height), flags); } textRendering.End(); } } } }
void frmPrimWorkshop_Disposed(object sender, EventArgs e) { if (textRendering != null) { textRendering.Dispose(); textRendering = null; } if (glControl != null) { glControl.Dispose(); } glControl = null; Client.Objects.TerseObjectUpdate -= new EventHandler <TerseObjectUpdateEventArgs>(Objects_TerseObjectUpdate); Client.Objects.ObjectUpdate -= new EventHandler <PrimEventArgs>(Objects_ObjectUpdate); Client.Objects.ObjectDataBlockUpdate -= new EventHandler <ObjectDataBlockUpdateEventArgs>(Objects_ObjectDataBlockUpdate); }
public frmPrimWorkshop(METAboltInstance instance, uint rootLocalID) : base(instance) { this.RootPrimLocalID = rootLocalID; InitializeComponent(); Disposed += new EventHandler(frmPrimWorkshop_Disposed); AutoSavePosition = true; UseMultiSampling = cbAA.Checked = instance.GlobalSettings["use_multi_sampling"]; cbAA.CheckedChanged += cbAA_CheckedChanged; this.instance = instance; renderer = new MeshmerizerR(); textRendering = new TextRendering(instance); Client.Objects.TerseObjectUpdate += new EventHandler <TerseObjectUpdateEventArgs>(Objects_TerseObjectUpdate); Client.Objects.ObjectUpdate += new EventHandler <PrimEventArgs>(Objects_ObjectUpdate); Client.Objects.ObjectDataBlockUpdate += new EventHandler <ObjectDataBlockUpdateEventArgs>(Objects_ObjectDataBlockUpdate); }