// dynamic does not work in static yet?
            //static 
            void InitializeContent()
        {
            var c = new Controls.UserControl1();

            // artwork
            var __artworkPlane = new Plane(
                "url(assets/CSSTransform3DFPSExperiment/osx.jpg)", 424, 174, -398, -240, -300, 90, 90, 0);

            world.addPlane(__artworkPlane);

            world.addPlane(
                new Plane(
                    "url(assets/CSSTransform3DFPSExperiment/wood.jpg)", 800, 800, -400, 400, 53, 180, 0, 0
                )
            );



            new Plane("url(assets/CSSTransform3DFPSExperiment/wall.jpg?3)", 800, 500, -400, -400, -447, 270, 90, 180).With(
                __wall_a =>
                {
                    world.addPlane(__wall_a);
                }
            );

            var ix = 0;

            Action NextWallToTHeRight = delegate
                    {

                        ix++;

                        world.addPlane(
                          new Plane(
                              "url(assets/CSSTransform3DFPSExperiment/wood.jpg)", 800, 800, -400, 400 + 800 * ix, 53, 180, 0, 0
                          )
                      );

                        new Plane("url(assets/CSSTransform3DFPSExperiment/wall.jpg?3)", 800, 500, -400, -400 + 800 * ix, -447, 270, 90, 180).With(
                            __wall_a =>
                            {
                                world.addPlane(__wall_a);
                            }
                        );
                    }
                ;

            NextWallToTHeRight();
            c.button3.Click += delegate { NextWallToTHeRight(); };

            Action<string, double, double, double, double, double, double, double, double, double> buildCube0 =
            (colour, w, h, d, x, y, z, rx, ry, rz) =>
            {
                //world.addPlane(new Plane(colour, h, w, x, y, z, 0, 180, 90));
                //world.addPlane(new Plane(colour, w, d, x, y, z, 90, 0, 0));
                //world.addPlane(new Plane(colour, d, h, x, y, z, 0, 270, 0));

                new Plane(colour, d, h, x + w, y, z + d, 0, 90, 0).With(
                    p =>
                    {
                        world.addPlane(p);

                        //new ScriptCoreLib.JavaScript.Runtime.Timer(
                        //    delegate
                        //    {
                        //        p.rotation.z += 15;
                        //        p.update();
                        //    }
                        //).StartInterval(150);
                    }
                );

                //world.addPlane(new Plane(colour, w, d, x + w, y + h, z, 90, 180, 0));
                //world.addPlane(new Plane(colour, w, h, x, y, z + d, 0, 0, 0));
            };

            Action<string, double, double, double, double, double, double, double, double, double> buildCube =
                (colour, w, h, d, x, y, z, rx, ry, rz) =>
                {
                    world.addPlane(new Plane(colour, h, w, x, y, z, 0, 180, 90));
                    world.addPlane(new Plane(colour, w, d, x, y, z, 90, 0, 0));
                    world.addPlane(new Plane(colour, d, h, x, y, z, 0, 270, 0));
                    world.addPlane(new Plane(colour, d, h, x + w, y, z + d, 0, 90, 0));
                    world.addPlane(new Plane(colour, w, d, x + w, y + h, z, 90, 180, 0));
                    world.addPlane(new Plane(colour, w, h, x, y, z + d, 0, 0, 0));
                };

            buildCube0("url(assets/CSSTransform3DFPSExperiment/desk.jpg)", 10, 50, 300, -150 + 400, 345, -250, 0, 0, 0);

            for (int xi = 0; xi < 20; xi++)
            {
                buildCube("url(assets/CSSTransform3DFPSExperiment/desk.jpg)", 10, 50, 300, -150 + 400, 345 + 60 * xi, -250, 0, 0, 0);

            }


            new Plane(
                "url(assets/CSSTransform3DFPSExperiment/wood.jpg)", 800, 800, -400 + 800, 400, 53, 180, 0, 0
            ).With(
               pp =>
               {
                   world.addPlane(pp);


                   pp.position.x += 20;
                   //pp.rotation.z += 15;

                   pp.update();

               }
           );


            c.GetHTMLTarget().className = "nolock";


            c.button1.Click +=
                delegate
                {
                    var cf = new Form1();

                    cf.Show();

                    cf.FormClosing +=
                        (ss, ee) =>
                        {
                            if (cf.WindowState == FormWindowState.Normal)
                            {
                                if (ee.CloseReason == CloseReason.UserClosing)
                                {
                                    ee.Cancel = true;
                                    cf.WindowState = FormWindowState.Minimized;
                                }
                            }
                        };

                    cf.GetHTMLTarget().className = "nolock";

                };
            c.button2.Click +=
                delegate
                {
                    var cf = new Form();

                    var cw = new WebBrowser { Dock = DockStyle.Fill };

                    cf.Controls.Add(cw);

                    cw.Navigate(
                "http://discover.xavalon.net"

                         //"/"

                        );

                    cf.FormClosing +=
                        (ss, ee) =>
                        {
                            if (cf.WindowState == FormWindowState.Normal)
                            {
                                if (ee.CloseReason == CloseReason.UserClosing)
                                {
                                    ee.Cancel = true;
                                    cf.WindowState = FormWindowState.Minimized;
                                }
                            }
                        };
                    cf.Show();

                    //Console.WriteLine("button2.Click");
                    cf.GetHTMLTarget().className = "nolock";

                    //cf.GetHTMLTarget().style.border = "2px solid red";

                };

            c.BackColor = Color.Transparent;

            var xx = c.GetHTMLTargetContainer();

            xx.style.transform = "scale(0.5)";
            xx.style.transformOrigin = "0% 0%";

            xx.style.SetSize(
                __osxPlane_node.clientWidth * 2,
                __osxPlane_node.clientHeight * 2
            );

            c.AttachControlTo(__osxPlane_node);


            #region onkeydown
            Native.Document.body.onkeydown += e =>
            {
                //Console.WriteLine(new { e.KeyCode });

                if (e.KeyCode == 87)
                    window.keyState.forward = true;
                if (e.KeyCode == 83)
                    window.keyState.backward = true;
                if (e.KeyCode == (int)Keys.A)
                    window.keyState.strafeleft = true;
                if (e.KeyCode == (int)Keys.D)
                    window.keyState.straferight = true;
            };

            Native.Document.body.onkeyup += e =>
            {
                if (e.KeyCode == 87)
                    window.keyState.forward = false;

                if (e.KeyCode == 83)
                    window.keyState.backward = false;

                if (e.KeyCode == (int)Keys.A)
                    window.keyState.strafeleft = false;
                if (e.KeyCode == (int)Keys.D)
                    window.keyState.straferight = false;

            };
            #endregion

            Func<INode, bool> isnolock =
                p =>
                {
                    var nolock = false;

                    while (p != Native.Document.body)
                    {
                        if (((IHTMLElement)p).className == "nolock")
                            nolock = true;

                        p = p.parentNode;
                    }

                    return nolock;
                };

            #region onmousemove
            Native.Document.body.tabIndex = 101;
            Native.Document.body.onmousedown +=
                e =>
                {
                    var nolock = isnolock(e.Element);
                    if (nolock)
                        return;

                    e.PreventDefault();
                    Native.Document.body.focus();
                    Native.Document.body.requestPointerLock();
                };

            Native.Document.body.onmousemove +=
                e =>
                {
                    if (Native.Document.pointerLockElement == Native.Document.body)
                    {
                        window.viewport.camera.rotation.x -= e.movementY / 2;
                        window.viewport.camera.rotation.z += e.movementX / 2;
                    }
                    else
                    {
                        var nolock = isnolock(e.Element);

                        if (nolock)
                            Native.Document.body.style.cursor = IStyle.CursorEnum.auto;
                        else
                            Native.Document.body.style.cursor = IStyle.CursorEnum.move;
                    }
                };


            Native.Document.body.onmouseup +=
                 e =>
                 {
                     if (Native.Document.pointerLockElement == Native.Document.body)
                     {
                         Native.Document.exitPointerLock();
                     }
                 };
            #endregion


            #region loop
            Native.window.onframe += delegate
            {
                // is external target working bot ways?
                //window.speed = window.speed;

                //Console.WriteLine(new { window.keyState.forward });

                #region speed
                if (window.keyState.backward)
                {
                    if (window.speed > -window.maxSpeed)
                        window.speed -= window.accel;
                }
                else if (window.keyState.forward)
                {
                    if (window.speed < window.maxSpeed)
                        window.speed += window.accel;
                }
                else if (window.speed > 0)
                {
                    window.speed = Math.Max(window.speed - window.accel, 0);
                }
                else if (window.speed < 0)
                {
                    window.speed = Math.Max(window.speed + window.accel, 0);
                }
                else
                {
                    window.speed = 0;
                }
                #endregion


                #region strafespeed
                if (window.keyState.straferight)
                {
                    if (window.strafespeed > -window.maxSpeed)
                        window.strafespeed -= window.accel;
                }
                else if (window.keyState.strafeleft)
                {
                    if (window.strafespeed < window.maxSpeed)
                        window.strafespeed += window.accel;
                }
                else if (window.strafespeed > 0)
                {
                    window.strafespeed = Math.Max(window.strafespeed - window.accel, 0);
                }
                else if (window.strafespeed < 0)
                {
                    window.strafespeed = Math.Max(window.strafespeed + window.accel, 0);
                }
                else
                {
                    window.strafespeed = 0;
                }
                #endregion


                // sideway
                {

                    var xo = Math.Sin(window.viewport.camera.rotation.z * 0.0174532925);
                    var yo = Math.Cos(window.viewport.camera.rotation.z * 0.0174532925);

                    window.viewport.camera.position.x -= xo * window.speed;
                    window.viewport.camera.position.y -= yo * window.speed;
                }

                {
                    var xo = Math.Sin(window.viewport.camera.rotation.z * 0.0174532925 - 3.14 / 2);
                    var yo = Math.Cos(window.viewport.camera.rotation.z * 0.0174532925 - 3.14 / 2);

                    window.viewport.camera.position.x -= xo * window.strafespeed;
                    window.viewport.camera.position.y -= yo * window.strafespeed;
                }

                window.viewport.camera.update();


            };


            #endregion

        }
 public void addPlane(Plane p)
 {
 }