File AxisHelper.cs

File List > Render > src > AxisHelper.cs

Go to the documentation of this file.

using System.Drawing;
using Qkmaxware.Geometry;
using Qkmaxware.Geometry.Primitives;

namespace Qkmaxware.Rendering {

public class AxisHelper : SceneNode {

    private MeshRenderer XObject;
    private MeshRenderer XLabelObject;
    private MeshRenderer YObject;
    private MeshRenderer YLabelObject;
    private MeshRenderer ZObject;
    private MeshRenderer ZLabelObject;

    public AxisHelper() {
        var rootX = CreateAxis(new UnlitColour(Color.Red), out XObject, out XLabelObject);
        var rootY = CreateAxis(new UnlitColour(Color.Green), out YObject, out YLabelObject);
        var rootZ = CreateAxis(new UnlitColour(Color.Blue), out ZObject, out ZLabelObject);

        rootX.Transform = Transformation.Ry(-90 * Angle.Deg2Rad);
        rootY.Transform = Transformation.Rx(-90 * Angle.Deg2Rad);
    }

    private string? xLabel;

    public string? XLabel {
        get {
            return xLabel;
        }
        set {
            this.xLabel = value;
            if (value != null) {
                var mesh = new TextMesh(value);
                XLabelObject.Mesh = mesh;
                XLabelObject.Material = XObject.Material;
            }
        }
    }

    private string? yLabel;
    public string? YLabel {
        get {
            return yLabel;
        }
        set {
            this.yLabel = value;
            if (value != null) {
                var mesh = new TextMesh (value);
                YLabelObject.Mesh = mesh;
                YLabelObject.Material = YObject.Material;
            }
        }
    }

    private string? zLabel;
    public string? ZLabel {
        get {
            return zLabel;
        }
        set {
            this.zLabel = value;
            if (value != null) {
                var mesh = new TextMesh(value);
                ZLabelObject.Mesh = mesh;
                ZLabelObject.Material = ZObject.Material;
            }
        }
    }

    private SceneNode CreateAxis(Material mat, out MeshRenderer arrow, out MeshRenderer label) {
        var arrowMesh = new Arrow(length: 1);
        arrow = new MeshRenderer(mesh: arrowMesh, material: mat);
        label = new MeshRenderer();
        label.Transform = Transformation.Offset(new Vec3(0, 0, 1.1)) * Transformation.Ry(90 * Angle.Deg2Rad);

        var root = new SceneNode();
        root.Add(arrow);
        root.Add(label);

        this.Add(root);
        return root;
    }
}

}