Esempio n. 1
0
 public override void RenderForPicking(PickingEventArgs arg)
 {
     if (this.RenderWireframe || this.RenderBody)
     {
         base.RenderForPicking(arg);
     }
 }
Esempio n. 2
0
        /// <summary>
        /// 在三角形图元中拾取指定位置的Line
        /// </summary>
        /// <param name="arg"></param>
        /// <param name="lastVertexId">三角形图元的最后一个顶点</param>
        /// <param name="picker"></param>
        /// <returns></returns>
        internal override uint[] Search(PickingEventArgs arg,
                                        uint lastVertexId, ZeroIndexPicker picker)
        {
            // 创建临时索引
            OneIndexBuffer buffer = GLBuffer.Create(IndexBufferElementType.UInt, 6, DrawMode.Lines, BufferUsage.StaticDraw);

            unsafe
            {
                var array = (uint *)buffer.MapBuffer(MapBufferAccess.WriteOnly);
                array[0] = lastVertexId - 1; array[1] = lastVertexId - 0;
                array[2] = lastVertexId - 2; array[3] = lastVertexId - 1;
                array[4] = lastVertexId - 0; array[5] = lastVertexId - 2;
                buffer.UnmapBuffer();
            }
            // 用临时索引渲染此三角形图元(仅渲染此三角形图元)
            picker.Renderer.Render4InnerPicking(arg, buffer);
            // id是拾取到的Line的Last Vertex Id
            uint id = ColorCodedPicking.ReadStageVertexId(arg.X, arg.Y);

            buffer.Dispose();

            // 对比临时索引,找到那个Line
            if (id + 2 == lastVertexId)
            {
                return(new uint[] { id + 2, id, });
            }
            else
            {
                return(new uint[] { id - 1, id, });
            }
        }
Esempio n. 3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="arg"></param>
        /// <param name="lastVertexId"></param>
        /// <param name="picker"></param>
        /// <returns></returns>
        internal override uint[] Search(PickingEventArgs arg,
                                        uint lastVertexId, DrawArraysPicker picker)
        {
            IndexBuffer buffer = GLBuffer.Create(IndexBufferElementType.UInt, 8, BufferUsage.StaticDraw);

            unsafe
            {
                var array = (uint *)buffer.MapBuffer(MapBufferAccess.WriteOnly);
                array[0] = lastVertexId - 1; array[1] = lastVertexId - 0;
                array[2] = lastVertexId - 2; array[3] = lastVertexId - 1;
                array[4] = lastVertexId - 3; array[5] = lastVertexId - 2;
                array[6] = lastVertexId - 0; array[7] = lastVertexId - 3;
                buffer.UnmapBuffer();
            }
            var cmd = new DrawElementsCmd(buffer, DrawMode.Lines);

            picker.Node.Render4InnerPicking(arg, ControlMode.ByFrame, cmd);
            uint id = ColorCodedPicking.ReadStageVertexId(arg.X, arg.Y);

            buffer.Dispose();

            if (id + 3 == lastVertexId)
            {
                return(new uint[] { id + 3, id, });
            }
            else
            {
                return(new uint[] { id - 1, id, });
            }
        }
Esempio n. 4
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="arg"></param>
        /// <param name="lastVertexId"></param>
        /// <param name="picker"></param>
        /// <returns></returns>
        internal override uint[] Search(PickingEventArgs arg,
                                        uint lastVertexId, ZeroIndexPicker picker)
        {
            OneIndexBuffer buffer = GLBuffer.Create(IndexBufferElementType.UInt, 6, DrawMode.Lines, BufferUsage.StaticDraw);

            unsafe
            {
                var array = (uint *)buffer.MapBuffer(MapBufferAccess.WriteOnly);
                array[0] = lastVertexId - 2; array[1] = lastVertexId - 0;
                array[2] = lastVertexId - 4; array[3] = lastVertexId - 2;
                array[4] = lastVertexId - 0; array[5] = lastVertexId - 4;
                buffer.UnmapBuffer();
            }

            picker.Renderer.Render4InnerPicking(arg, buffer);
            uint id = ColorCodedPicking.ReadStageVertexId(arg.X, arg.Y);

            buffer.Dispose();

            if (id + 4 == lastVertexId)
            {
                return(new uint[] { id + 4, id, });
            }
            else
            {
                return(new uint[] { id - 2, id, });
            }
        }
Esempio n. 5
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="arg"></param>
        /// <param name="flatColorVertexId"></param>
        /// <param name="picker"></param>
        /// <returns></returns>
        internal override uint[] Search(PickingEventArgs arg, uint flatColorVertexId, DrawArraysPicker picker)
        {
            var cmd = picker.DrawCommand as DrawArraysCmd;
            // when the temp index buffer could be long, it's no longer needed.
            // what a great OpenGL API design!
            DrawArraysCmd drawCmd = new DrawArraysCmd(DrawMode.LineLoop, cmd.FirstVertex, cmd.RenderingVertexCount, cmd.InstanceCount, cmd.FrameCount);

            picker.Node.Render4InnerPicking(arg, IndexAccessMode.ByFrame, drawCmd);
            uint id = ColorCodedPicking.ReadStageVertexId(arg.X, arg.Y);

            if (id == cmd.FirstVertex)
            {
                return(new uint[] { (uint)(cmd.FirstVertex + cmd.RenderingVertexCount - 1), id, });
            }
            else
            {
                return(new uint[] { id - 1, id, });
            }
        }
Esempio n. 6
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="arg"></param>
        /// <param name="lastVertexId"></param>
        /// <param name="picker"></param>
        /// <returns></returns>
        internal override uint[] Search(PickingEventArgs arg, uint lastVertexId, ZeroIndexPicker picker)
        {
            var zeroIndexBuffer = picker.Node.PickingRenderUnit.VertexArrayObject.IndexBuffer as ZeroIndexBuffer;
            // when the temp index buffer could be long, it's no longer needed.
            // what a great OpenGL API design!
            ZeroIndexBuffer indexBuffer = ZeroIndexBuffer.Create(DrawMode.LineLoop, zeroIndexBuffer.FirstVertex, zeroIndexBuffer.RenderingVertexCount, zeroIndexBuffer.InstanceCount);

            picker.Node.Render4InnerPicking(arg, indexBuffer);
            uint id = ColorCodedPicking.ReadStageVertexId(arg.X, arg.Y);

            indexBuffer.Dispose();

            if (id == zeroIndexBuffer.FirstVertex)
            {
                return(new uint[] { (uint)(zeroIndexBuffer.FirstVertex + zeroIndexBuffer.RenderingVertexCount - 1), id, });
            }
            else
            {
                return(new uint[] { id - 1, id, });
            }
        }
        public void OnMouseDown(object ob, System.Windows.Forms.MouseEventArgs e)
        {
            if (m_sceneObjects != null)
            {
                ISceneObject pickedObject = null;

                /* Find the mouse position in screen space */
                Vector2 screenSpacePosition = new Vector2(e.X, e.Y);

                /* Find the picking ray for intersection tests */
                Ray pickingRay = CastPickingRay(screenSpacePosition);

                /* Find the closest sceneobject to the camera with a bound sphere that intersects the picking ray */
                float distanceFromCamera = 99999.0f; // hack, this should be m_camera.FarPlaneDistance
                foreach (KeyValuePair<String, ISceneObject> kv in m_sceneObjects)
                {
                    ISceneObject so = kv.Value;
                    BoundingSphere boundSphere = so.BoundingSphere;
                    float? intersect = pickingRay.Intersects(boundSphere);
                    if (intersect != null && intersect < distanceFromCamera)
                    {
                        pickedObject = so;
                    }
                }

                /* Notify listeners that the sceneObject was picked */
                if (pickedObject != null)
                {
                    if (SceneObjectSelected != null)
                    {
                        PickingEventArgs ea = new PickingEventArgs();
                        ea.SceneObject = pickedObject;
                        SceneObjectSelected(this, ea);
                    }

                    // Fire_ObjectPicked(pickedObject);
                }
            }
        }
Esempio n. 8
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="arg"></param>
 /// <param name="lastVertexId"></param>
 /// <param name="picker"></param>
 /// <returns></returns>
 internal abstract uint[] Search(PickingEventArgs arg,
                                 uint lastVertexId, ZeroIndexPicker picker);
Esempio n. 9
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="arg"></param>
 /// <param name="lastVertexId"></param>
 /// <param name="picker"></param>
 /// <returns></returns>
 internal abstract uint[] Search(PickingEventArgs arg,
                                 uint lastVertexId, DrawArraysPicker picker);
Esempio n. 10
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="arg"></param>
 /// <param name="primitiveInfo"></param>
 /// <param name="picker"></param>
 /// <returns></returns>
 internal abstract uint Search(PickingEventArgs arg,
                               RecognizedPrimitiveInfo primitiveInfo,
                               DrawElementsPicker picker);
Esempio n. 11
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="arg"></param>
 /// <param name="primitiveInfo"></param>
 /// <param name="singleNodeVertexId"></param>
 /// <param name="stageVertexId"></param>
 /// <param name="picker"></param>
 /// <returns></returns>
 internal abstract uint Search(PickingEventArgs arg,
                               RecognizedPrimitiveInfo primitiveInfo,
                               uint singleNodeVertexId, uint stageVertexId,
                               DrawElementsPicker picker);
 /// <summary>
 ///
 /// </summary>
 /// <param name="arg"></param>
 /// <param name="singleNodeVertexId">identify location inside this node.</param>
 /// <param name="stageVertexId">identify location when rendering multiple nodes.</param>
 /// <param name="picker"></param>
 /// <returns></returns>
 internal abstract uint Search(PickingEventArgs arg,
                               uint singleNodeVertexId, uint stageVertexId, DrawArraysPicker picker);
Esempio n. 13
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="arg"></param>
 /// <param name="primitiveInfo"></param>
 /// <param name="picker"></param>
 /// <returns></returns>
 internal abstract uint Search(PickingEventArgs arg,
                               RecognizedPrimitiveInfo primitiveInfo,
                               OneIndexPicker picker);
Esempio n. 14
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="arg"></param>
 /// <param name="flatColorVertexId"></param>
 /// <param name="picker"></param>
 /// <returns></returns>
 internal abstract uint Search(PickingEventArgs arg,
                               uint flatColorVertexId, DrawArraysPicker picker);