public JellySimulation(SceneManager sceneManager, ShaderProvider shaderProvider)
        {
            _sceneManager   = sceneManager;
            _shaderProvider = shaderProvider;

            ControlFrame         = new Node(new Transform(Vector3.Zero, Quaternion.Identity /* Quaternion.FromEulerAngles(1.0f, 1.0f, 0.0f)*/, Vector3.One), "controlFrame");
            ControlFrameRenderer = new LineRenderer(shaderProvider.DefaultShader);
            var jellyControlFrame = new JellyControlFrame(ControlFrameRenderer, 1.0);

            ControlFrame.AttachComponents(ControlFrameRenderer, jellyControlFrame);

            Jelly = new Node(new Transform(Vector3.Zero, Quaternion.Identity, Vector3.One), "jelly");

            var boundingBoxRenderer = new LineRenderer(shaderProvider.DefaultShader);
            var jellyBoundingBox    = new JellyBoundingBox(boundingBoxRenderer, 5.0);

            var jellyData = new JellyData();

            JellyRenderer   = new DynamicPatchRenderer(shaderProvider.SurfaceShaderBezier, new Mesh(VertexLayout.Type.Position), jellyData);
            JellyController = new JellyController(jellyControlFrame);

            WireframeRenderer = new LineRenderer(shaderProvider.DefaultShader);
            var jellyCPVisualizer = new JellyControlPointVisualizer(WireframeRenderer);

            Jelly.AttachComponents(jellyData, JellyRenderer, JellyController, boundingBoxRenderer, jellyBoundingBox,
                                   WireframeRenderer, jellyCPVisualizer);


            _sceneManager.CurrentScene.AttachChild(Jelly);
            _sceneManager.CurrentScene.AttachChild(ControlFrame);

            var meshData  = MeshLoader.LoadObj("monkey2.obj");
            var monkey    = new Node(new Transform(Vector3.Zero, Quaternion.Identity, Vector3.One), "monkey");
            var jellyMesh = new JellyMesh(jellyData, meshData.positions, meshData.normals);

            JellyMeshRenderer = new DynamicMeshRenderer(shaderProvider.PhongShader, meshData.mesh);

            monkey.AttachComponents(JellyMeshRenderer, jellyMesh);
            _sceneManager.CurrentScene.AttachChild(monkey);
        }
        public override void Render(double time, Framebuffer fbuf, StaticMeshRenderer staticMesh, DynamicMeshRenderer dynamicMesh, Matrix4 p, Matrix4 v, VRHand eye)
        {
            try
            {
                if (mesh[eye] == null || mesh[eye].Length == 0)
                {
                    Engine.HMDClient.GetControllerMesh(poses[eye].ActiveOrigin, meshGroup, out mesh[eye], out tex[eye]);
                    texHandles[eye] = new TextureHandle[tex[eye].Length];
                    for (int i = 0; i < tex[eye].Length; i++)
                    {
                        texHandles[eye][i] = tex[eye][i].GetHandle(TextureSampler.Default);
                        texHandles[eye][i].SetResidency(Residency.Resident);
                    }
                }

                var transforms = Engine.HMDClient.GetComponentTransforms(poses[eye].ActiveOrigin);
                for (int i = 0; i < transforms.Length; i++)
                {
                    staticMesh.DrawC(mesh[eye][i], transforms[i] * poses[eye].PoseMatrix, texHandles[eye][i]);
                }
            }
            catch (Exception) { }
        }