public FreeLandDefaultViewpointMechanism(ISceneNode node, FreeControlledCamera.Props props, IKeyboardInputProvider keyboardInputProvider) { this.props = props; this.keyboardInputProvider = keyboardInputProvider; this.node = node; FixedCamera = CreateControlledViewpoint(); }
private void ArrangeAndDecorateInternal(IStoryGraph sg, int nodeIndex, int scaleLevel) { var aStory = sg.Aspects[nodeIndex]; var node = sg.NodeObjects[nodeIndex]; var abstractChildren = sg.Children[nodeIndex]; var numChildren = abstractChildren.Count; var scale = MathHelper.Pow(4, scaleLevel); var visuals = new [] { ModelVisualElement.New() .SetModel(planeModel) .SetMaterial(planeMaterials[scaleLevel % planeMaterials.Length]) .SetTransform(Transform.Scaling(10 * scale)) }; var viewpointProps = new FreeControlledCamera.Props { Eye = Vector3.UnitZ * 10f * scale, Yaw = MathHelper.PiOver4, Pitch = MathHelper.PiOver4, FieldOfView = MathHelper.PiOver4, ZNear = 0.1f * scale, ZFar = 100.0f * scale }; for (var i = 0; i < numChildren; i++) { var adaptiveChild = abstractChildren[i]; var angle = MathHelper.TwoPi * i / numChildren - MathHelper.PiOver4; var rotation = Quaternion.RotationZ(angle); var radius = scale * GetBestRadius(numChildren); var offset = new Vector3(radius * MathHelper.Sin(angle), radius * MathHelper.Cos(angle), 0.1f * scale); sg.NodeObjects[adaptiveChild].Transform = new Transform(1, rotation, offset); ArrangeAndDecorateInternal(sg, adaptiveChild, scaleLevel - 1); } aStory.SetDynamicParts(new StoryNodeDynamicParts { DefaultViewpointMechanism = new FreeLandDefaultViewpointMechanism(node, viewpointProps, keyboardInputProvider), Hittable = GetHittableComponent(node), VisualElements = visuals }); }