Raycasts.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using Urho;
  5. using Urho.Actions;
  6. using Urho.Gui;
  7. using Urho.Shapes;
  8. namespace Playgrounds.Console
  9. {
  10. public class Raycasts : SimpleApplication
  11. {
  12. public Raycasts(ApplicationOptions options) : base(options) { }
  13. public static void RunApp()
  14. {
  15. var app = new Raycasts(new ApplicationOptions(@"..\..\..\..\..\Urho3D\Source\bin\Data") { TouchEmulation = true });
  16. app.Run();
  17. }
  18. List<Node> points = new List<Node>();
  19. Node textNode;
  20. protected override void Start()
  21. {
  22. base.Start();
  23. this.Log.LogLevel = LogLevel.Warning;
  24. var planeNode = RootNode.CreateChild();
  25. planeNode.Scale = new Vector3(20, 1, 20);
  26. var plane = planeNode.CreateComponent<Urho.Shapes.Plane>();
  27. plane.Material = ResourceCache.GetMaterial("Materials/Stone.xml");
  28. pointerNode = Scene.CreateChild();
  29. pointerNode.SetScale(0.1f);
  30. var pointer = pointerNode.CreateComponent<Sphere>();
  31. pointer.Color = Color.Cyan;
  32. pointerNode.Name = "RulerPoint";
  33. textNode = pointerNode.CreateChild();
  34. textNode.SetScale(3);
  35. textNode.Translate(Vector3.UnitY * 2);
  36. textNode.AddRef();
  37. var text = textNode.CreateComponent<Text3D>();
  38. text.HorizontalAlignment = HorizontalAlignment.Center;
  39. text.VerticalAlignment = VerticalAlignment.Top;
  40. text.TextEffect = TextEffect.Stroke;
  41. text.EffectColor = Color.Black;
  42. text.SetColor(Color.White);
  43. text.SetFont(CoreAssets.Fonts.AnonymousPro, 50);
  44. Input.KeyUp += Input_KeyUp;
  45. var hud = new MonoDebugHud(this);
  46. hud.Show(Color.Red, 24);
  47. /*RenderPathCommand rpc = new RenderPathCommand(RenderCommandType.Quad);
  48. rpc.SetTextureName(TextureUnit.Diffuse, "Textures/UrhoDecal.dds");
  49. rpc.Type = RenderCommandType.Quad;
  50. rpc.VertexShaderName = (UrhoString)"CopyFramebuffer";
  51. rpc.PixelShaderName = (UrhoString)"CopyFramebuffer";
  52. rpc.SetOutput(0, "viewport");
  53. Viewport.RenderPath.InsertCommand(1, rpc);*/
  54. }
  55. private void Input_KeyUp(KeyUpEventArgs e)
  56. {
  57. if (cursorPos == null)
  58. return;
  59. var savedPoint = pointerNode;
  60. textNode.Parent.RemoveChild(textNode);
  61. points.Add(savedPoint);
  62. pointerNode = pointerNode.Clone();
  63. savedPoint.AddChild(textNode);
  64. if (points.Count > 1)
  65. {
  66. float distance = 0f;
  67. for (int i = 1; i < points.Count; i++)
  68. distance += Vector3.Distance(points[i - 1].Position, points[i].Position);
  69. textNode.GetComponent<Text3D>().Text = distance.ToString("F2") + "m";
  70. }
  71. if (prevNode != null)
  72. AddConnection(savedPoint, prevNode);
  73. prevNode = savedPoint;
  74. cursorPos = null;
  75. }
  76. Node prevNode;
  77. Node pointerNode;
  78. Vector3? cursorPos;
  79. protected override void OnUpdate(float timeStep)
  80. {
  81. base.OnUpdate(timeStep);
  82. var ray = Camera.GetScreenRay(0.5f, 0.5f);
  83. var raycastResult = Octree.RaycastSingle(ray);
  84. if (raycastResult != null)
  85. {
  86. var pos = raycastResult.Value.Position;
  87. if (!raycastResult.Value.Node.Name.StartsWith("RulerPoint"))
  88. {
  89. pointerNode.Position = pos;
  90. cursorPos = pos;
  91. }
  92. }
  93. else
  94. {
  95. cursorPos = null;
  96. }
  97. textNode.LookAt(CameraNode.Position, Vector3.UnitY);
  98. textNode.Rotate(new Quaternion(0, 180, 0));
  99. }
  100. void AddConnection(Node point1, Node point2 = null)
  101. {
  102. const float size = 0.03f;
  103. var node = Scene.CreateChild();
  104. Vector3 v1 = point1.Position;
  105. Vector3 v2 = point2?.Position ?? Vector3.Zero;
  106. var distance = Vector3.Distance(v2, v1);
  107. node.Scale = new Vector3(size, Math.Abs(distance), size);
  108. node.Position = (v1 + v2) / 2f;
  109. node.Rotation = Quaternion.FromRotationTo(Vector3.UnitY, v1 - v2);
  110. var cylinder = node.CreateComponent<StaticModel>();
  111. cylinder.Model = CoreAssets.Models.Cylinder;
  112. cylinder.CastShadows = false;
  113. cylinder.SetMaterial(Material.FromColor(Color.White, true));
  114. node.RunActions(new TintTo(1f, 0f, 1f, 1f, 1f));
  115. }
  116. }
  117. }