コード例 #1
0
        bool MogitorsRoot.IDragDropHandler.OnDragOver(DragData dragData, Mogre.Viewport vp, Mogre.Vector2 position)
        {
            if (dragData.Object == null)
            {
                return(false);
            }

            Mogre.Ray mouseRay = vp.Camera.GetCameraToViewportRay(position.x, position.y);

            EntityEditor entity = dragData.Object as EntityEditor;

            bool hitFound = false;

            if (!hitFound)
            {
                if (entity.Position.x == 999999 && entity.Position.y == 999999 && entity.Position.z == 999999)
                {
                    entity.Position = mouseRay.Origin + mouseRay.Direction * 40.0f;
                }
                else
                {
                    entity.Position = MogitorsRoot.Instance.GetGizmoIntersectCameraPlane(entity, mouseRay);
                }
            }

            return(true);
        }
コード例 #2
0
        private bool FindNewClosest(Mogre.Ray ray, ref float closestDistance, Mogre.Entity entity)
        {
            // mesh data to retrieve
            uint vertexCount, indexCount;

            Mogre.Vector3[] vertices;
            uint[]          indices;

            // get the mesh information
            GetMeshInformationEx(entity.GetMesh(), out vertexCount, out vertices, out indexCount, out indices,
                                 entity.ParentNode._getDerivedPosition(),
                                 entity.ParentNode._getDerivedOrientation(),
                                 entity.ParentNode._getDerivedScale());

            // test for hitting individual triangles on the mesh
            bool newClosestFound = false;

            for (uint i = 0; i < indexCount; i += 3)
            {
                // check for a hit against this triangle
                var hit = Mogre.Math.Intersects(ray, vertices[indices[i]], vertices[indices[i + 1]], vertices[indices[i + 2]], true, false);

                // if it was a hit check if its the closest
                if (hit.first)
                {
                    if ((closestDistance < 0.0f) || (hit.second < closestDistance))
                    {
                        // this is the closes so far, save it off
                        closestDistance = hit.second;
                        newClosestFound = true;
                    }
                }
            }
            return(newClosestFound);
        }
コード例 #3
0
        public Mogre.Vector3 GetGizmoIntersectCameraPlane(BaseEditor obj, Mogre.Ray pickRay)
        {
            Mogre.Vector3            vPos   = obj.DerivedPosition;
            Mogre.Pair <bool, float> result = pickRay.Intersects(new Mogre.Plane(-ActiveViewport.CameraEditor.Camera.DerivedDirection, vPos));

            if (result.first)
            {
                Mogre.Vector3 AxisX = obj.DerivedOrientation.XAxis;
                Mogre.Vector3 AxisY = obj.DerivedOrientation.YAxis;
                Mogre.Vector3 AxisZ = obj.DerivedOrientation.ZAxis;

                Mogre.Vector3 Proj  = pickRay.GetPoint(result.second) - vPos;
                Mogre.Vector3 vPos1 = (AxisX.DotProduct(Proj) * AxisX);
                Mogre.Vector3 vPos2 = (AxisY.DotProduct(Proj) * AxisY);
                Mogre.Vector3 vPos3 = (AxisZ.DotProduct(Proj) * AxisZ);
                vPos += vPos1 + vPos2 + vPos3;
            }

            return(vPos);
        }
コード例 #4
0
        public bool PickEntity(Mogre.RaySceneQuery raySceneQuery, Mogre.Ray ray, out Mogre.Entity result, Mogre.Vector3 hitPoint, string excludedObject, float maxDistance)
        {
            result = null;

            raySceneQuery.Ray       = ray;
            raySceneQuery.QueryMask = QueryFlags.Movable;
            raySceneQuery.SetSortByDistance(true);

            if (raySceneQuery.Execute().Count <= 0)
            {
                result = null;
                return(false);
            }

            // at this point we have raycast to a series of different objects bounding boxes.
            float closestDistance = maxDistance;

            Mogre.Vector3 closestResult = Mogre.Vector3.ZERO;
            foreach (var thisResult in raySceneQuery.GetLastResults())
            {
                // stop checking if we have found a raycast hit that is closer
                // than all remaining entities
                if ((closestDistance >= 0.0f) && (closestDistance < thisResult.distance))
                {
                    break;
                }

                // only check this result if its a hit against an entity
                if ((thisResult.movable != null) && (thisResult.movable.MovableType == "Entity"))
                {
                    Mogre.Entity entity = thisResult.movable as Mogre.Entity;

                    if (!entity.Visible || entity.Name == excludedObject)
                    {
                        continue;
                    }

                    bool newClosestFound = FindNewClosest(ray, ref closestDistance, entity);

                    // if we found a new closes raycast for this object, update the
                    // closes_result before moving on to the next object.
                    if (newClosestFound)
                    {
                        closestResult = ray.GetPoint(closestDistance);
                        result        = entity;
                    }
                }
            }

            // Return the result
            if (closestDistance != maxDistance)
            {
                hitPoint = closestResult;
                return(true);
            }
            else
            {
                // Raycast failed
                return(false);
            }
        }