Esempio n. 1
0
        private void UserControl1_MouseMove(object sender, MouseEventArgs e)
        {
            if (is_mid_mouse_on)
            {
                int    sub_x   = mouse_old_x - e.X;
                int    sub_y   = mouse_old_y - e.Y;
                double angle_x = Math.PI * sub_x / 180.0;
                double angle_y = Math.PI * sub_y / 180.0;
                if (Math.Abs(sub_x) < 1 && Math.Abs(sub_y) < 1)
                {
                    return;
                }
                camera.eyeRotateAxis(new Vector3d(0, 0, 0), angle_x, camera.getUp());
                camera.eyeRotateAxis(new Vector3d(0, 0, 0), angle_y, camera.getUp().cross(camera.getEye() - camera.getCenter()));
                mouse_old_x = e.X;
                mouse_old_y = e.Y;

                Gl.glMatrixMode(Gl.GL_PROJECTION);
                Gl.glLoadIdentity();
                Glu.gluPerspective(45, this.Width / this.Height, 1, 1000);
                camera.gluLookAtLH();
                Gl.glMatrixMode(Gl.GL_MODELVIEW);

                this.Invalidate();
            }
            else
            {
                foreach (CLoadedObject obj in model_manager.getModelList())
                {
                    obj.state.onMouseLeave(obj, e);
                }
                Gl.glMatrixMode(Gl.GL_PROJECTION);
                Gl.glPushMatrix();
                Gl.glMatrixMode(Gl.GL_MODELVIEW);
                Gl.glPushMatrix();
                int[] viewport = new int[4];
                Gl.glViewport(0, 0, this.Width, this.Height);
                Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport);
                TransformMatrixes trans    = new TransformMatrixes();
                SelectionData     selected = Selection.GetNearest(Selection.Pick <CLoadedObject>(model_manager.getSelectionDict(), new double[] { e.X, this.Height - e.Y - 1 }, new double[] { 1, 1 }, camera,
                                                                                                 viewport, false, out trans));
                if (selected != null)
                {
                    (selected.item as CLoadedObject).state.onMouseOver(selected.item, e);
                    // (selected.item as CLoadedObject).changeState(new Jusin.ObjectModel.State.ModelStateSelected());
                }

                Gl.glMatrixMode(Gl.GL_PROJECTION);
                Gl.glPopMatrix();
                Gl.glMatrixMode(Gl.GL_MODELVIEW);
                Gl.glPopMatrix();
            }
        }
        override public void MouseClick(ModelManager model_manager, CCamera camera, Control control, MouseEventArgs e)
        {
            this.target_camera = camera;
            if (e.Button == MouseButtons.Middle)
            {
                is_mid_mouse_on = true;
                mouse_old_x     = e.X;
                mouse_old_y     = e.Y;
            }
            else if (e.Button == MouseButtons.Left)
            {
                model_manager.ClearSelectModel();
                Gl.glMatrixMode(Gl.GL_PROJECTION);
                Gl.glPushMatrix();
                Gl.glMatrixMode(Gl.GL_MODELVIEW);
                Gl.glPushMatrix();
                int[] viewport = new int[4];
                Gl.glViewport(0, 0, control.Width, control.Height);
                Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport);
                TransformMatrixes    trans = new TransformMatrixes();
                List <SelectionData> picks;
                try
                {
                    picks = Selection.Pick <CLoadedObject>(model_manager.getSelectionDict(), new double[] { e.X, control.Height - e.Y - 1 }, new double[] { 1, 1 }, camera,
                                                           viewport, false, out trans);
                }
                catch (Exception except)
                {
                    return;
                }
                SelectionData selected = Selection.GetNearest(picks);
                if (selected != null)
                {
                    model_manager.SelectModel(selected.names[0]);
                    // (selected.item as CLoadedObject).changeState(new Jusin.ObjectModel.State.ModelStateSelected());
                    ControlModeChanger.getInstance().changeMode(new NormalModeSelectedModel());
                }
                else
                {
                    ControlModeChanger.getInstance().changeMode(new NormalMode());
                }

                Gl.glMatrixMode(Gl.GL_PROJECTION);
                Gl.glPopMatrix();
                Gl.glMatrixMode(Gl.GL_MODELVIEW);
                Gl.glPopMatrix();
                control.Invalidate();
            }
        }
Esempio n. 3
0
    public override void OnMouseDown(MouseEventArgs e)
    {
        if (e.Button != MouseButtons.None)
        {
            lastPos = e.Location;
        }

        if ((e.Button == MouseButtons.Left) || (e.Button == MouseButtons.Right))
        {
            int winX = e.X,
                winY = this.RenderingControl.ClientSize.Height - 1 - e.Y;
            double depth = 0;

            List<SelectionData> hitObjects
                = Selection.Pick<Model>(this.models, this.renderingParams, new double[] { winX, winY }, new double[] { 0.1, 0.1 },
                                         this.cam, glp.CurrentViewport, this.pickChild,
                                         out this.pickedTransformMatrixes);

            this.pickedModel = (Model)Selection.GetNearest(hitObjects, out depth);

            this.pickedWindowPosition = new double[] { winX, winY, (float)depth };

            if (this.pickedModel != null)
            {
                //マウスポインタがつかんだオブジェクト表面のローカル座標を計算する。
                //行列計算はOpenGLとGLUにやらせる。
                MatrixMode currentMatrixMode = glp.CurrentMatrixMode;
                gl.MatrixMode(MatrixMode.Modelview);

                gl.PushMatrix();

                //Pick<T>( ... )で返されるTransformMatrixSet.ModelViewプロパティには、ビューイング変換行列が格納されている。
                gl.LoadMatrix(this.pickedTransformMatrixes.Modelview);
                this.pickedModel.ApplyParentPosition();
                this.pickedModel.ApplyPosition();
                double[] modelviewMatrix = glp.CurrentModelviewMatrixDouble;

                gl.PopMatrix();

                gl.MatrixMode(currentMatrixMode);

                this.pickedObjectCoord = new double[3];
                glu.UnProject(winX, winY, depth,
                               ref modelviewMatrix[0], ref this.pickedTransformMatrixes.Projection[0], ref this.pickedTransformMatrixes.Viewport[0],
                               ref this.pickedObjectCoord[0], ref this.pickedObjectCoord[1], ref this.pickedObjectCoord[2]);
            }
            else
            {
                this.pickedTransformMatrixes = null;
            }

            this.RenderingControl.Refresh();
        }
    }
Esempio n. 4
0
        private void UserControl1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Middle)
            {
                is_mid_mouse_on = true;
                mouse_old_x     = e.X;
                mouse_old_y     = e.Y;
            }
            else if (e.Button == MouseButtons.Left)
            {
                this.model_manager.ClearSelectModel();

                /*Gl.glEnable(Gl.GL_DEPTH_TEST);
                 * double[] modelview = new double[16];
                 * Gl.glGetDoublev(Gl.GL_MODELVIEW_MATRIX,modelview);
                 * double[] projection = new double[16];
                 * Gl.glGetDoublev(Gl.GL_PROJECTION_MATRIX, projection);
                 * int[] viewport = new int[4];
                 * Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport);
                 * double z = 0.0 ;
                 * double objX;
                 * double objY;
                 * double objZ;
                 * Gl.glReadPixels(e.X, this.Height - e.Y, 1, 1, Gl.GL_DEPTH_COMPONENT, Gl.GL_FLOAT, z);
                 * Glu.gluUnProject(e.X, this.Height - e.Y, (double)z, modelview, projection, viewport, out objX, out objY, out objZ);
                 * Gl.glDisable(Gl.GL_DEPTH_TEST);
                 * if (this.loaded.checkColl(new Vector3d(objX-camera.getEye().x, objY-camera.getEye().y, objZ-camera.getEye().z)))
                 * {
                 *  System.Console.Write("あいうえお");
                 * }*/
                //セレクションバッファを作成。

                /*
                 * int selectionBufferLength = 100;
                 * uint[] selectionBuff = new uint[selectionBufferLength];
                 * //OpenGLに渡す。
                 * Gl.glSelectBuffer(selectionBuff.Length, selectionBuff);
                 * Gl.glRenderMode(Gl.GL_SELECT);
                 *
                 * Gl.glPushName(-1);
                 * // Gl.glLightfv(Gl.GL_LIGHT0, Gl.GL_POSITION, light);
                 *
                 * //マウスポインタの座標(単位:pixel)
                 * //(注:ビューポートなどと同様に、描画領域の左下が原点)
                 * double mouseX, mouseY;
                 * mouseX = e.X;
                 * mouseY = this.Height - e.Y - 1;
                 * //マウスポインタを中心として、ヒットする範囲の幅と高さ(単位:pixel)
                 * double width = 1.0;
                 * double height=1.0;
                 * //ビューポートも指定する必要があります。
                 * int[] viewport = new int[4];
                 *
                 * Gl.glMatrixMode(Gl.GL_PROJECTION);
                 * Gl.glPushMatrix();
                 * Gl.glLoadIdentity();
                 * Gl.glViewport(0, 0, this.Width, this.Height);
                 * Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport);
                 * Glu.gluPickMatrix(mouseX, mouseY, width, height, viewport);
                 * Glu.gluPerspective(45, (double)(this.Width-0 ) / (double)(this.Height - 0), 1.0, 1000.0);
                 *
                 * // Gl.glMatrixMode(Gl.GL_MODELVIEW);
                 * camera.gluLookAtLH();
                 * Gl.glMatrixMode(Gl.GL_PROJECTION);
                 *
                 * //  this.setViewportAndCamera(0, 0, this.Width, this.Height);
                 *
                 *
                 * //camera.gluLookAtLH();
                 * //camera.gluLookAtLH();
                 *
                 * Gl.glInitNames();
                 *
                 * //draw floor
                 * Gl.glEnable(Gl.GL_DEPTH_TEST);
                 * Gl.glPushName(1);
                 * /* for (int ii = 50; ii > -50; ii -= 5)
                 * {
                 *   Gl.glBegin(Gl.GL_TRIANGLE_STRIP);
                 *   Gl.glNormal3f(0.0f, 1.0f, 0.0f);
                 *
                 *   for (int jj = -50; jj < 50; jj += 5)
                 *   {
                 *       Gl.glColor3f(0.4f, 0.6f, 0.8f);
                 *       Gl.glVertex3f(jj, -10, ii);
                 *       Gl.glVertex3f(jj, -10, ii + 5);
                 *   }
                 *
                 *   Gl.glEnd();
                 * }*/
                //model.sortEntities(camera);
                //Gl.glEnable(Gl.GL_BLEND);
                //Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
                //Gl.glDepthMask(Gl.GL_FALSE);


                // Gl.glLoadIdentity();

                /*
                 * //Glu.gluSphere(new Glu.GLUquadric(), 1.0, 1, 1);
                 * Gl.glPopName();
                 * Gl.glPushName(2);
                 * loaded.Render();
                 * Gl.glMatrixMode(Gl.GL_PROJECTION);
                 * Gl.glPopName();
                 *
                 *
                 * Gl.glDisable(Gl.GL_BLEND);
                 * Gl.glDisable(Gl.GL_DEPTH_TEST);
                 * //Draw XYZ axis
                 * // this.setViewportAndCamera(this.ClientSize.Width - 50, 0, 50, 50);
                 * //Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport);
                 *
                 * //Glu.gluPickMatrix(mouseX, mouseY, width, height, viewport);
                 * // Gl.glClear(Gl.GL_COLOR_BUFFER_BIT | Gl.GL_DEPTH_BUFFER_BIT);
                 * //Gl.glDisable(Gl.GL_BLEND);
                 * //Gl.glDisable(Gl.GL_POLYGON_SMOOTH);
                 * //Gl.glLoadIdentity();
                 * Gl.glEnable(Gl.GL_DEPTH_TEST);
                 * //draw floor
                 *
                 * // model.sortEntities(camera);
                 * //  Gl.glEnable(Gl.GL_BLEND);
                 * //Gl.glBlendFunc(Gl.GL_SRC_ALPHA, Gl.GL_ONE_MINUS_SRC_ALPHA);
                 * //Gl.glDepthMask(Gl.GL_FALSE);
                 * Gl.glMatrixMode(Gl.GL_PROJECTION);
                 * Gl.glPopMatrix();
                 * Gl.glDisable(Gl.GL_DEPTH_TEST);
                 * Gl.glFlush();
                 * int hits = Gl.glRenderMode(Gl.GL_RENDER);
                 */
                Gl.glMatrixMode(Gl.GL_PROJECTION);
                Gl.glPushMatrix();
                Gl.glMatrixMode(Gl.GL_MODELVIEW);
                Gl.glPushMatrix();
                int[] viewport = new int[4];
                Gl.glViewport(0, 0, this.Width, this.Height);
                Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport);
                TransformMatrixes trans    = new TransformMatrixes();
                SelectionData     selected = Selection.GetNearest(Selection.Pick <CLoadedObject>(model_manager.getSelectionDict(), new double[] { e.X, this.Height - e.Y - 1 }, new double[] { 1, 1 }, camera,
                                                                                                 viewport, false, out trans));
                if (selected != null)
                {
                    model_manager.SelectModel(selected.names[0]);
                    // (selected.item as CLoadedObject).changeState(new Jusin.ObjectModel.State.ModelStateSelected());
                }

                Gl.glMatrixMode(Gl.GL_PROJECTION);
                Gl.glPopMatrix();
                Gl.glMatrixMode(Gl.GL_MODELVIEW);
                Gl.glPopMatrix();
                this.Invalidate();
            }
        }
        override public void MouseMove(ModelManager model_manager, CCamera camera, Control control, MouseEventArgs e)
        {
            if (is_mid_mouse_on)
            {
                //ミドルボタンが押されているときはカメラの回転処理
                //この時、モデルが選ばれていたらモデルの中心点を中心に回転
                int    sub_x   = mouse_old_x - e.X;
                int    sub_y   = mouse_old_y - e.Y;
                double angle_x = Math.PI * sub_x / 180.0;
                double angle_y = Math.PI * sub_y / 180.0;
                if (Math.Abs(sub_x) < 1 && Math.Abs(sub_y) < 1)
                {
                    return;
                }
                Vector3d center;
                if (model_manager.getModelList().Count > 0)
                {
                    center = model_manager.getModelList()[0].getCenterPoint();
                }
                else
                {
                    center = new Vector3d(0, 0, 0);
                }
                camera.eyeRotateAxis(center, angle_x, camera.getUp());
                Vector3d axis = camera.getUp().cross(camera.getEye() - camera.getCenter());
                axis.Normalize();

                camera.eyeRotateAxis(center, angle_y, axis);
                mouse_old_x = e.X;
                mouse_old_y = e.Y;

                Gl.glMatrixMode(Gl.GL_PROJECTION);
                Gl.glLoadIdentity();
                camera.ApplyProjection();
                camera.gluLookAtLH();
                Gl.glMatrixMode(Gl.GL_MODELVIEW);

                control.Invalidate();
            }
            else
            {
                foreach (CLoadedObject obj in model_manager.getModelList())
                {
                    obj.state.onMouseLeave(obj, e);
                }
                Gl.glMatrixMode(Gl.GL_PROJECTION);
                Gl.glPushMatrix();
                Gl.glMatrixMode(Gl.GL_MODELVIEW);
                Gl.glPushMatrix();
                int[] viewport = new int[4];
                Gl.glViewport(0, 0, control.Width, control.Height);
                Gl.glGetIntegerv(Gl.GL_VIEWPORT, viewport);
                TransformMatrixes    trans = new TransformMatrixes();
                List <SelectionData> picks;
                try
                {
                    picks = Selection.Pick <CLoadedObject>(model_manager.getSelectionDict(), new double[] { e.X, control.Height - e.Y - 1 }, new double[] { 1, 1 }, camera,
                                                           viewport, false, out trans);
                }
                catch (Exception except)
                {
                    return;
                }
                SelectionData selected = Selection.GetNearest(picks);
                if (selected != null)
                {
                    (selected.item as CLoadedObject).state.onMouseOver(selected.item, e);
                    // (selected.item as CLoadedObject).changeState(new Jusin.ObjectModel.State.ModelStateSelected());
                }

                Gl.glMatrixMode(Gl.GL_PROJECTION);
                Gl.glPopMatrix();
                Gl.glMatrixMode(Gl.GL_MODELVIEW);
                Gl.glPopMatrix();
            }
        }