⚠️ C# support is experimental ⚠️ It may not work correctly, fail or crash in spectacular ways. Managed APIs will likely change in the future.
using System;
using System.Diagnostics;
using System.IO;
using Urho3DNet;
using ImGuiNet;
namespace DemoApplication
{
[ObjectFactory]
class RotateObject : LogicComponent
{
public RotateObject(Context context) : base(context)
{
UpdateEventMask = UpdateEvent.UseUpdate;
}
public override void Update(float timeStep)
{
var d = new Quaternion(10 * timeStep, 20 * timeStep, 30 * timeStep);
Node.Rotate(d);
}
}
class DemoApplication : Application
{
private Scene _scene;
private Viewport _viewport;
private Node _camera;
private Node _cube;
private Node _light;
public DemoApplication(Context context) : base(context)
{
}
protected override void Dispose(bool disposing)
{
Renderer.SetViewport(0, null);
_viewport.Dispose();
_scene.Dispose();
_camera.Dispose();
_cube.Dispose();
_light.Dispose();
base.Dispose(disposing);
}
public override void Setup()
{
var currentDir = Directory.GetCurrentDirectory();
engineParameters_[Urho3D.EpFullScreen] = false;
engineParameters_[Urho3D.EpWindowWidth] = 1920;
engineParameters_[Urho3D.EpWindowHeight] = 1080;
engineParameters_[Urho3D.EpWindowTitle] = "Hello C#";
engineParameters_[Urho3D.EpResourcePrefixPaths] = $"{currentDir};{currentDir}/..";
}
public override void Start()
{
Input.SetMouseVisible(true);
_scene = new Scene(Context);
_scene.CreateComponent<Octree>();
_camera = _scene.CreateChild("Camera");
_viewport = new Viewport(Context);
_viewport.Scene = _scene;
_viewport.Camera = _camera.CreateComponent<Camera>();
Renderer.SetViewport(0, _viewport);
Renderer.DefaultZone.FogColor = new Color(0.5f, 0.5f, 0.7f);
_camera.Position = new Vector3(0, 2, -2);
_camera.LookAt(Vector3.Zero);
_cube = _scene.CreateChild("Cube");
var model = _cube.CreateComponent<StaticModel>();
model.SetModel(Cache.GetResource<Model>("Models/Box.mdl"));
model.SetMaterial(0, Cache.GetResource<Material>("Materials/Stone.xml"));
var rotator = _cube.CreateComponent<RotateObject>();
_light = _scene.CreateChild("Light");
_light.CreateComponent<Light>();
_light.Position = new Vector3(0, 2, -1);
_light.LookAt(Vector3.Zero);
SubscribeToEvent(E.Update, args =>
{
var timestep = args[E.Update.TimeStep].Float;
Debug.Assert(this != null);
if (ImGui.Begin("Urho3D.NET"))
{
ImGui.TextColored(Color.Red, $"Hello world from C#.\nFrame time: {timestep}");
}
ImGui.End();
});
}
}
internal class Program
{
public static void Main(string[] args)
{
using (var context = new Context())
{
using (var application = new DemoApplication(context))
{
application.Run();
}
}
}
}
}