{
  "Name": "Camera",
  "_id": "43403a8d-9c87-414a-89e2-9393b87d9e47",
  "Namespace": "lib.geometry",
  "Description": "Sets a Camera-Perspective for the incoming scene. \r\nWhen selected, you can click into the render-view to fly through the scene with the keys A,S,D,F,E,C and the mouse.\r\nTo change the persective when Render To Images and Post-processing is applied, Lock one of the renderViews to the Camera.\r\n",
  "Inputs": [
    {
      "Name": "SceneInput",
      "MetaInstanceID": "43db4b66-089f-4222-82ed-2fb064a15371",
      "DefaultValue": {
        "Type": "Scene",
        "Value": "Framefield.Core.Scene"
      },
      "MetaID": "79122951-7bc4-4c68-b085-866eab828248",
      "IsMultiInput": "False",
      "Relevance": "Required",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Position.X",
      "MetaInstanceID": "810e1039-99f0-401c-a106-3e87bd2811fb",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Position.Y",
      "MetaInstanceID": "465c0f09-2564-4d74-97e5-f16e4a168bcf",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Position.Z",
      "MetaInstanceID": "db7fa71f-f8fd-4c13-b1a7-716a32ddb7c5",
      "DefaultValue": {
        "Type": "Float",
        "Value": "-2.415"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Target.X",
      "MetaInstanceID": "cd55616a-d11d-4b9b-ad6d-6071cac5e87b",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Target.Y",
      "MetaInstanceID": "28827d15-597c-4214-8be9-72762d229578",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Target.Z",
      "MetaInstanceID": "7dcec0b7-d396-406c-9291-c6a82a371e47",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Up.X",
      "MetaInstanceID": "85c9b855-49ac-4e01-a28f-6e78623790e6",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Up.Y",
      "MetaInstanceID": "af457538-0d01-44c1-8517-6cc44cf9139a",
      "DefaultValue": {
        "Type": "Float",
        "Value": "1"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Up.Z",
      "MetaInstanceID": "da7097f3-8251-4dcc-8c6a-0efdb78c3a30",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "AspectRatio",
      "MetaInstanceID": "796f5b32-395f-4d8c-bce2-4c3c69ca7d7b",
      "DefaultValue": {
        "Type": "Float",
        "Value": "-1"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "0.01",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Clip.Near",
      "MetaInstanceID": "f8cfff94-5eac-4970-a093-2398cbe1811d",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0.1"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "0.01",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Clip.Far",
      "MetaInstanceID": "e6b3f27b-b21e-429b-99fb-f1e591b672ce",
      "DefaultValue": {
        "Type": "Float",
        "Value": "1000"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "FOV",
      "MetaInstanceID": "0ccdda43-9ffb-4e32-9056-13b081866cfc",
      "DefaultValue": {
        "Type": "Float",
        "Value": "45"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "0",
      "Max": "360",
      "Scale": "1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "Roll",
      "MetaInstanceID": "e56ef057-a4c7-46a1-a6a0-6dbf76eeafcb",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-100000",
      "Max": "100000",
      "Scale": "1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "PositionOffset.X",
      "MetaInstanceID": "fff2efdb-0b5b-44f7-8069-9a830f0cb9f9",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-10000",
      "Max": "10000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "PositionOffset.Y",
      "MetaInstanceID": "5b4e4534-887b-4a7a-92ce-7d5a729a2f8a",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-10000",
      "Max": "10000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "PositionOffset.Z",
      "MetaInstanceID": "494dc766-c782-458b-8de3-6f21670bfdb6",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-10000",
      "Max": "10000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "RotateOffset.X",
      "MetaInstanceID": "141b7627-7e7f-407f-9d98-0b37cd00fbf1",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-10000",
      "Max": "10000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "RotateOffset.Y",
      "MetaInstanceID": "de8933ef-4b1e-4ce2-9cfb-171ff6f21ab2",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-10000",
      "Max": "10000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    },
    {
      "Name": "RotateOffset.Z",
      "MetaInstanceID": "6de91553-6267-4871-b1c6-3bfe9b95f6c8",
      "DefaultValue": {
        "Type": "Float",
        "Value": "0"
      },
      "MetaID": "3f76dee3-3897-44ac-82d6-25ce9f53a506",
      "IsMultiInput": "False",
      "Relevance": "Optional",
      "Description": "",
      "Min": "-10000",
      "Max": "10000",
      "Scale": "0.1",
      "ScaleType": "Linear",
      "EnumValues": []
    }
  ],
  "Outputs": [
    {
      "Name": "Output",
      "MetaInstanceID": "682960d0-f2eb-4d1f-891d-cfbbd3d8a911",
      "MetaID": "79122951-7bc4-4c68-b085-866eab828248"
    },
    {
      "Name": "This",
      "MetaInstanceID": "97542da2-d269-49f0-b428-7f1426a8f895",
      "MetaID": "9701d534-b3ff-4889-a250-84aece4a7d76"
    }
  ],
  "OperatorParts": [
    {
      "MetaInstanceID": "e076359a-2334-49bc-abcd-de09d870d876",
      "MetaID": "17298b2c-de5a-4c3d-bcb1-388bec9da8be",
      "Name": "CameraFunc",
      "Version": "dcd8ccc7-d868-4209-bc39-7f5125fcbb41",
      "Type": "Scene",
      "IsMultiInput": "True",
      "Script": [
        "//>>> _using",
        "using System;",
        "using System.Collections.Generic;",
        "using System.Linq;",
        "using System.Text;",
        "using SharpDX;",
        "using SharpDX.Direct3D11;",
        "using SharpDX.Windows;",
        "//<<< _using",
        "using System.Dynamic;",
        "",
        "namespace Framefield.Core.ID17298b2c_de5a_4c3d_bcb1_388bec9da8be",
        "{",
        "    public class Class_Camera : OperatorPart.Function, Framefield.Core.OperatorPartTraits.ICameraProvider",
        "    {",
        "        //>>> _inputids",
        "        private enum InputId",
        "        {",
        "            SceneInput = 0,",
        "            PositionX = 1,",
        "            PositionY = 2,",
        "            PositionZ = 3,",
        "            TargetX = 4,",
        "            TargetY = 5,",
        "            TargetZ = 6,",
        "            UpX = 7,",
        "            UpY = 8,",
        "            UpZ = 9,",
        "            AspectRatio = 10,",
        "            ClipNear = 11,",
        "            ClipFar = 12,",
        "            FOV = 13,",
        "            Roll = 14,",
        "            PositionOffsetX = 15,",
        "            PositionOffsetY = 16,",
        "            PositionOffsetZ = 17,",
        "            RotateOffsetX = 18,",
        "            RotateOffsetY = 19,",
        "            RotateOffsetZ = 20",
        "        }",
        "        //<<< _inputids",
        "        //>>> _outputids",
        "        private enum OutputId",
        "        {",
        "            Output = 0,",
        "            This = 1",
        "        }",
        "        //<<< _outputids",
        "",
        "        public override OperatorPartContext Eval(OperatorPartContext context, List<OperatorPart> inputs, int outputIdx)",
        "        {",
        "            //>>> _params",
        "            var SceneInput = inputs[(int)InputId.SceneInput];",
        "            var PositionX = inputs[(int)InputId.PositionX].Eval(context).Value;",
        "            var PositionY = inputs[(int)InputId.PositionY].Eval(context).Value;",
        "            var PositionZ = inputs[(int)InputId.PositionZ].Eval(context).Value;",
        "            var Position = new Vector3(PositionX, PositionY, PositionZ);",
        "            var TargetX = inputs[(int)InputId.TargetX].Eval(context).Value;",
        "            var TargetY = inputs[(int)InputId.TargetY].Eval(context).Value;",
        "            var TargetZ = inputs[(int)InputId.TargetZ].Eval(context).Value;",
        "            var Target = new Vector3(TargetX, TargetY, TargetZ);",
        "            var UpX = inputs[(int)InputId.UpX].Eval(context).Value;",
        "            var UpY = inputs[(int)InputId.UpY].Eval(context).Value;",
        "            var UpZ = inputs[(int)InputId.UpZ].Eval(context).Value;",
        "            var Up = new Vector3(UpX, UpY, UpZ);",
        "            var AspectRatio = inputs[(int)InputId.AspectRatio].Eval(context).Value;",
        "            var ClipNear = inputs[(int)InputId.ClipNear].Eval(context).Value;",
        "            var ClipFar = inputs[(int)InputId.ClipFar].Eval(context).Value;",
        "            var Clip = new Vector2(ClipNear, ClipFar);",
        "            var FOV = inputs[(int)InputId.FOV].Eval(context).Value;",
        "            var Roll = inputs[(int)InputId.Roll].Eval(context).Value;",
        "            var PositionOffsetX = inputs[(int)InputId.PositionOffsetX].Eval(context).Value;",
        "            var PositionOffsetY = inputs[(int)InputId.PositionOffsetY].Eval(context).Value;",
        "            var PositionOffsetZ = inputs[(int)InputId.PositionOffsetZ].Eval(context).Value;",
        "            var PositionOffset = new Vector3(PositionOffsetX, PositionOffsetY, PositionOffsetZ);",
        "            var RotateOffsetX = inputs[(int)InputId.RotateOffsetX].Eval(context).Value;",
        "            var RotateOffsetY = inputs[(int)InputId.RotateOffsetY].Eval(context).Value;",
        "            var RotateOffsetZ = inputs[(int)InputId.RotateOffsetZ].Eval(context).Value;",
        "            var RotateOffset = new Vector3(RotateOffsetX, RotateOffsetY, RotateOffsetZ);",
        "            //<<< _params",
        "",
        "            _fov = FOV;",
        "            FOV = (float)Utilities.DegreeToRad(FOV);",
        "",
        "            if (AspectRatio < 0) {",
        "                if (!context.Variables.TryGetValue(\"AspectRatio\", out AspectRatio)) {",
        "                    AspectRatio = (float)context.Viewport.Width / context.Viewport.Height;",
        "                }",
        "            }",
        "",
        "            _roll = (float)Utilities.DegreeToRad(Roll);",
        "            _eye = Position;",
        "            _target = Target;",
        "",
        "            _worldToCamera = CalcWorldToCamera(_eye, _target, (float)_roll, PositionOffset, RotateOffset);",
        "",
        "            var prevTransform = context.WorldToCamera;",
        "            context.WorldToCamera = _worldToCamera;",
        "",
        "            _cameraToView = Matrix.PerspectiveFovLH(FOV, AspectRatio, ClipNear, ClipFar);",
        "            var prevCamProj = context.CameraProjection;",
        "            context.CameraProjection = _cameraToView;",
        "",
        "            switch (outputIdx)",
        "            {",
        "                case (int)OutputId.Output:",
        "                    SceneInput.Eval(context);",
        "                    break;",
        "                case (int)OutputId.This:",
        "                    dynamic obj = new ExpandoObject();",
        "                    obj.This = this;",
        "                    context.Dynamic = obj;",
        "                    break;",
        "            }",
        "",
        "            context.CameraProjection = prevCamProj;",
        "            context.WorldToCamera = prevTransform;",
        "",
        "            return context;",
        "        }",
        "",
        "        public Vector3 GetLastPosition() {",
        "            return _eye;",
        "        }",
        "        public void SetPosition(double time, Vector3 pos) {",
        "            Animation.SetOperatorPartValue(OperatorPart.Parent.Inputs[(int)InputId.PositionX], time, pos.X);",
        "            Animation.SetOperatorPartValue(OperatorPart.Parent.Inputs[(int)InputId.PositionY], time, pos.Y);",
        "            Animation.SetOperatorPartValue(OperatorPart.Parent.Inputs[(int)InputId.PositionZ], time, pos.Z);",
        "        }",
        "",
        "        public Vector3 GetLastTarget() {",
        "            return _target;",
        "        }",
        "        public void SetTarget(double time, Vector3 target) {",
        "            Animation.SetOperatorPartValue(OperatorPart.Parent.Inputs[(int)InputId.TargetX], time, target.X);",
        "            Animation.SetOperatorPartValue(OperatorPart.Parent.Inputs[(int)InputId.TargetY], time, target.Y);",
        "            Animation.SetOperatorPartValue(OperatorPart.Parent.Inputs[(int)InputId.TargetZ], time, target.Z);",
        "        }",
        "",
        "        public double GetLastRoll() {",
        "            return _roll;",
        "        }",
        "        public void SetRoll(double time, double roll) {",
        "            Animation.SetOperatorPartValue(OperatorPart.Parent.Inputs[14], time, (float)roll);",
        "        }",
        "",
        "        public double GetLastFOV()",
        "        {",
        "            return _fov;",
        "        }",
        "",
        "        public double CalculateFOV(OperatorPartContext context) {",
        "            var invalidator = new OperatorPart.InvalidateTimeAccessors();",
        "            OperatorPart.Connections[13].TraverseWithFunction(null, invalidator);",
        "            var fov = OperatorPart.Connections[13].Eval(context).Value;",
        "            return fov;",
        "        }",
        "",
        "        public Matrix GetLastWorldToCamera() {",
        "            return _worldToCamera;",
        "        }",
        "",
        "        public Matrix CalculateWorldToCamera(OperatorPartContext context) {",
        "            var invalidator = new OperatorPart.InvalidateTimeAccessors();",
        "            OperatorPart.Connections[1].TraverseWithFunction(null, invalidator);",
        "            OperatorPart.Connections[2].TraverseWithFunction(null, invalidator);",
        "            OperatorPart.Connections[3].TraverseWithFunction(null, invalidator);",
        "            OperatorPart.Connections[4].TraverseWithFunction(null, invalidator);",
        "            OperatorPart.Connections[5].TraverseWithFunction(null, invalidator);",
        "            OperatorPart.Connections[6].TraverseWithFunction(null, invalidator);",
        "            OperatorPart.Connections[7].TraverseWithFunction(null, invalidator);",
        "            OperatorPart.Connections[8].TraverseWithFunction(null, invalidator);",
        "            OperatorPart.Connections[9].TraverseWithFunction(null, invalidator);",
        "            OperatorPart.Connections[14].TraverseWithFunction(null, invalidator);",
        "",
        "            var x = OperatorPart.Connections[(int)InputId.PositionX].Eval(context).Value;",
        "            var y = OperatorPart.Connections[(int)InputId.PositionY].Eval(context).Value;",
        "            var z = OperatorPart.Connections[(int)InputId.PositionZ].Eval(context).Value;",
        "            var position = new Vector3(x, y, z);",
        "",
        "            x = OperatorPart.Connections[(int)InputId.PositionOffsetX].Eval(context).Value;",
        "            y = OperatorPart.Connections[(int)InputId.PositionOffsetY].Eval(context).Value;",
        "            z = OperatorPart.Connections[(int)InputId.PositionOffsetZ].Eval(context).Value;",
        "            var positionOffset = new Vector3(x, y, z);",
        "",
        "            x = OperatorPart.Connections[(int)InputId.TargetX].Eval(context).Value;",
        "            y = OperatorPart.Connections[(int)InputId.TargetY].Eval(context).Value;",
        "            z = OperatorPart.Connections[(int)InputId.TargetZ].Eval(context).Value;",
        "            var target = new Vector3(x, y, z);",
        "",
        "            x = OperatorPart.Connections[(int)InputId.RotateOffsetX].Eval(context).Value;",
        "            y = OperatorPart.Connections[(int)InputId.RotateOffsetY].Eval(context).Value;",
        "            z = OperatorPart.Connections[(int)InputId.RotateOffsetZ].Eval(context).Value;",
        "            var rotateOffset = new Vector3(x, y, z);",
        "",
        "            var roll = (float)Utilities.DegreeToRad(OperatorPart.Connections[14].Eval(context).Value);",
        "",
        "            return CalcWorldToCamera(position, target, roll, positionOffset, rotateOffset);",
        "        }",
        "",
        "        public Matrix GetLastCameraToView()",
        "        {",
        "            return _cameraToView;",
        "        }",
        "",
        "        public Matrix CalculateCameraToView(OperatorPartContext context) {",
        "            var invalidator = new OperatorPart.InvalidateTimeAccessors();",
        "            OperatorPart.Connections[10].TraverseWithFunction(null, invalidator);",
        "            OperatorPart.Connections[11].TraverseWithFunction(null, invalidator);",
        "            OperatorPart.Connections[12].TraverseWithFunction(null, invalidator);",
        "            OperatorPart.Connections[13].TraverseWithFunction(null, invalidator);",
        "",
        "            var aspectRatio = OperatorPart.Connections[10].Eval(context).Value;",
        "            var clipNear = OperatorPart.Connections[11].Eval(context).Value;",
        "            var clipFar = OperatorPart.Connections[12].Eval(context).Value;",
        "            var fov = (float)Utilities.DegreeToRad(OperatorPart.Connections[13].Eval(context).Value);",
        "",
        "            if (aspectRatio < 0) {",
        "                if (!context.Variables.TryGetValue(\"AspectRatio\", out aspectRatio)) {",
        "                    aspectRatio = (float)context.Viewport.Width / context.Viewport.Height;",
        "                }",
        "            }",
        "            return Matrix.PerspectiveFovLH(fov, aspectRatio, clipNear, clipFar);",
        "        }",
        "",
        "        Matrix CalcWorldToCamera(Vector3 position, Vector3 target, float roll, Vector3 positionOffset, Vector3 rotateOffset)",
        "        {",
        "            var worldToCamera = Matrix.LookAtLH(position, target, new Vector3(0, 1, 0));",
        "            var rollRotation = Matrix.RotationAxis(new Vector3(0, 0, 1), -(float)roll);",
        "            var additionalTranslation = Matrix.Translation(positionOffset);",
        "            var additionalRotation = Matrix.RotationYawPitchRoll((float)Utilities.DegreeToRad(rotateOffset.Y),",
        "                                                                 (float)Utilities.DegreeToRad(rotateOffset.X),",
        "                                                                 (float)Utilities.DegreeToRad(rotateOffset.Z));",
        "",
        "            return worldToCamera * rollRotation * additionalTranslation * additionalRotation;",
        "        }",
        "",
        "        private Vector3 _eye;",
        "        private Vector3 _target;",
        "        private double _roll;",
        "        private double _fov;",
        "        private Matrix _worldToCamera;",
        "        private Matrix _cameraToView;",
        "    }",
        "}",
        "",
        ""
      ],
      "AdditionalAssemblies": []
    }
  ],
  "Operators": [],
  "Connections": [
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "43db4b66-089f-4222-82ed-2fb064a15371",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "810e1039-99f0-401c-a106-3e87bd2811fb",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "465c0f09-2564-4d74-97e5-f16e4a168bcf",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "db7fa71f-f8fd-4c13-b1a7-716a32ddb7c5",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "cd55616a-d11d-4b9b-ad6d-6071cac5e87b",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "28827d15-597c-4214-8be9-72762d229578",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "7dcec0b7-d396-406c-9291-c6a82a371e47",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "85c9b855-49ac-4e01-a28f-6e78623790e6",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "af457538-0d01-44c1-8517-6cc44cf9139a",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "da7097f3-8251-4dcc-8c6a-0efdb78c3a30",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "796f5b32-395f-4d8c-bce2-4c3c69ca7d7b",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "f8cfff94-5eac-4970-a093-2398cbe1811d",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "e6b3f27b-b21e-429b-99fb-f1e591b672ce",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "0ccdda43-9ffb-4e32-9056-13b081866cfc",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "e56ef057-a4c7-46a1-a6a0-6dbf76eeafcb",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "fff2efdb-0b5b-44f7-8069-9a830f0cb9f9",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "5b4e4534-887b-4a7a-92ce-7d5a729a2f8a",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "494dc766-c782-458b-8de3-6f21670bfdb6",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "141b7627-7e7f-407f-9d98-0b37cd00fbf1",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "de8933ef-4b1e-4ce2-9cfb-171ff6f21ab2",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "6de91553-6267-4871-b1c6-3bfe9b95f6c8",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "e076359a-2334-49bc-abcd-de09d870d876"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "e076359a-2334-49bc-abcd-de09d870d876",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "682960d0-f2eb-4d1f-891d-cfbbd3d8a911"
    },
    {
      "SourceOp": "00000000-0000-0000-0000-000000000000",
      "SourceOpPart": "e076359a-2334-49bc-abcd-de09d870d876",
      "TargetOp": "00000000-0000-0000-0000-000000000000",
      "TargetOpPart": "97542da2-d269-49f0-b428-7f1426a8f895"
    }
  ]
}