Beispiel #1
0
        public override void InjectMousePressed(MouseEvent arg, MouseButtonID id)
        {
            base.InjectMousePressed(arg, id);
            if (id == MouseButtonID.MB_Right)
            {
                if (state == EditState.Free)
                {
                    editor.HidePivot();
                    return;
                }
                MaterialPtr material = currentSelectedEnt.GetSubEntity(0).GetMaterial();
                material.GetTechnique(0).SetAmbient(0, 0, 0);
                currentSelectedEnt.GetSubEntity(0).SetMaterial(material);

                state = EditState.Free;
                currentSelectedEnt.ParentSceneNode.ShowBoundingBox = false;
                currentSelectedEnt = null;
                editor.HidePivot();
                operation = EditOperation.None;
            }
            else if (id == MouseButtonID.MB_Left)
            {
                Ray ray   = GameManager.Instance.trayMgr.getCursorRay(editor.Map.Camera);
                var query = editor.Map.SceneManager.CreateRayQuery(ray);
                RaySceneQueryResult result = query.Execute();
                foreach (var sResult in result)
                {
                    if (sResult.movable != null &&
                        (sResult.movable.Name.StartsWith("SCENE_OBJECT") || sResult.movable.Name.StartsWith("AIMESH")))
                    {
                        //High light the object
                        var         ent      = editor.Map.SceneManager.GetEntity(sResult.movable.Name);
                        MaterialPtr material = ent.GetSubEntity(0).GetMaterial();
                        ColourValue cv       = new ColourValue(1, 0, 0);
                        material.GetTechnique(0).SetAmbient(cv);
                        ColourValue cv2 = new ColourValue(1, 0, 0);
                        material.GetTechnique(0).SetDiffuse(cv2);
                        ent.GetSubEntity(0).SetMaterial(material);
                        ent.ParentSceneNode.ShowBoundingBox = true;
                        currentSelectedEnt = ent;
                        state = EditState.Edit;
                        Mogre.Vector3 entCenterPos = ent.GetWorldBoundingBox().Center;
                        editor.ShowPivotAtPosition(entCenterPos);
                    }
                }
            }
        }
Beispiel #2
0
        public void updateFilpTerrain()
        {
            Ray                 ray            = new Ray(Position, Mogre.Vector3.NEGATIVE_UNIT_Y);
            RaySceneQuery       rayQuery       = mCamera.SceneManager.CreateRayQuery(ray);
            RaySceneQueryResult rayQueryResult = rayQuery.Execute();

            foreach (var result in rayQueryResult)
            {
                if (result.worldFragment != null)
                {
                    mBodyNode.SetPosition(
                        Position.x,
                        result.worldFragment.singleIntersection.y + 10,
                        Position.z);
                }
            }
        }
        public bool Tick(int diffX, int diffY, string startX, string startY, int searchCounter)
        {
            if (mRoot != null && IsInitialized == true)
            {
                renderScene();
                foobar();
                if (mAnimationState != null)
                {
                    mAnimationState.AddTime(((float).01)); //todo - might not render last frame
                    if (mAnimationState.HasEnded)
                    {
                        return(false);
                    }
                }

                // Setup the scene query
                Vector3 camPos    = mCamera.RealPosition;
                Ray     cameraRay = new Ray(new Vector3(camPos.x, 5000.0f, camPos.z),
                                            Vector3.NEGATIVE_UNIT_Y);
                mRaySceneQuery.Ray = cameraRay;

                // Perform the scene query;
                RaySceneQueryResult            result = mRaySceneQuery.Execute();
                RaySceneQueryResult.Enumerator itr    = (RaySceneQueryResult.Enumerator)result.GetEnumerator();

                // Get the results, set the camera height
                if ((itr != null) && itr.MoveNext())
                {
                    if (itr.Current != null && itr.Current.worldFragment != null)
                    {
                        float terrainHeight = itr.Current.worldFragment.singleIntersection.y;

                        if ((terrainHeight + 120.0f) > camPos.y)
                        {// mCamera.SetPosition(camPos.x, terrainHeight + 150.0f, camPos.z);
                            cameraNode.Translate(cameraYawNode.Orientation *
                                                 cameraPitchNode.Orientation *
                                                 new Vector3(0, 10, 0),
                                                 SceneNode.TransformSpace.TS_LOCAL);
                        }
                    }
                }

                mRoot.RenderOneFrame();
            }
            return(true);
        }
Beispiel #4
0
        protected override bool FrameEnded(FrameEvent e)
        {
            if (!base.FrameEnded(e))
            {
                return(false);
            }

            SetDebugCaption(0, string.Format("Camera Location: ({0}, {1}, {2}) ",
                                             mCamera.GetPosition().x, mCamera.GetPosition().y, mCamera.GetPosition().z));

            SetDebugCaption(1, string.Format("Camera Orientation: ({0}, {1}, {2}, {3}) ",
                                             mCamera.GetOrientation().x, mCamera.GetOrientation().y, mCamera.GetOrientation().z, mCamera.GetOrientation().w));


            Vector3 p = mCamera.GetPosition();

            p.y = 3000.0f;
            mRay.setOrigin(p);
            SetDebugCaption(2, string.Format("  ray at : ({0}, {1}, {2}) ", mRay.getOrigin().x, mRay.getOrigin().y, mRay.getOrigin().z));
            SetDebugCaption(3, "");
            mRaySceneQuery.setRay(mRay);
            RaySceneQueryResult qryResult = mRaySceneQuery.execute();

            if (qryResult.Count > 0)
            {
                float newY = -999.0f;
                foreach (RaySceneQueryResultEntry qryEntry in qryResult)
                {
                    if (newY < qryEntry.distance)
                    {
                        newY = qryEntry.distance;
                    }
                }
                if (newY != -999.0f)
                {
                    newY = 3000.0f - newY;
                    p    = mCamera.GetPosition();
                    p.y  = newY + 5.0f;
                    mCamera.SetPosition(p.x, p.y, p.z);
                    SetDebugCaption(3, string.Format("  intersect at : ({0}, {1}, {2}) ", p.x, p.y, p.z));
                }
            }
            return(true);
        }
Beispiel #5
0
        public string selectObject(Point mousePoint, float width, float height)
        {
            RestoreBoxnodes();

            Ray ray = camera.GetCameraToViewportRay(mousePoint.X / width, mousePoint.Y / height);

            raySceneQuery.Ray = ray;

            // Execute query
            raySceneQuery.SetSortByDistance(true, 1);
            RaySceneQueryResult result = raySceneQuery.Execute();

            if (result.Count > 0)
            {
                isTubeRool = true;
                RaySceneQueryResultEntry entry = result[0];
                string entryName = entry.movable.Name;
                if (entryName.Substring(0, 3).Equals("box"))
                {
                    Node    node         = entry.movable.ParentNode;
                    Vector3 nodePosition = node.Position;
                    if (nodePosition.x == 0)
                    {
                        nodePosition.x += 20;
                        node.Position   = nodePosition;
                    }
                }
                else if (entryName.Substring(0, 4).Equals("tube"))
                {
                    isTubeRool = false;
                    Node nodeParent = entry.movable.ParentNode.Parent;
                    for (int i = 1; i < 4; i++)
                    {
                        Node nodeChild = nodeParent.GetChild("tube" + i.ToString() + "Node");
                        nodeChild.ResetOrientation();
                    }
                }
                return(entryName);
            }
            return("");
        }
Beispiel #6
0
        private void picRender_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Right)
            {
                return;
            }

            SelectedItem = "";

            RaySceneQuery mRaySceneQuery = null;

            // Save mouse position
            float mouseX = (float)e.X / picRender.Width; float mouseY = (float)e.Y / picRender.Height;

            // Setup the ray scene query
            Ray mouseRay = mgr.GetCamera("Camera").GetCameraToViewportRay(mouseX, mouseY);

            mRaySceneQuery = mgr.CreateRayQuery(mouseRay);

            // Execute query
            RaySceneQueryResult      result = mRaySceneQuery.Execute();
            RaySceneQueryResultEntry oneobj;

            ctxPickObject.Items.Clear();

            // Get results, create a node/entity on the position
            for (Int16 i = 0; i < result.Count; i++)
            {
                oneobj = result[i];

                if (oneobj.movable != null && oneobj.movable.Name != "canvas")
                {
                    ctxPickObject.Items.Add(oneobj.movable.Name).Click += new EventHandler(ItemPicked);
                }
            } //

            ctxPickObject.Show(picRender, e.X, e.Y);

            drawFrame();
        }
Beispiel #7
0
        protected Vector3 GetFirstRealHit(Vector3 origin, Vector3 direction)
        {
            Vector3 hit         = origin;
            float   minDistance = float.MaxValue;

            RaySceneQuery raySceneQuery = CameraCS.SceneManager.CreateRayQuery(new Ray(origin, direction));

            RaySceneQueryResult result = raySceneQuery.Execute();
            var iterator = result.GetEnumerator();

            bool intersect = false;

            while (iterator.MoveNext() /*&& !intersect*/)
            //! @todo are the results ordered ?? if so, uncomment (optimization)

            {
                var itr = iterator.Current;
                if (itr.distance < minDistance && // take the shorter
                    itr.movable.ParentSceneNode != CameraCS.CameraSceneNode &&
                    itr.movable.ParentSceneNode != CameraCS.TargetNode &&
                    !_ignoreList.Contains(itr.movable))
                {
                    minDistance = itr.distance;
                    intersect   = true;
                    if (itr.worldFragment != null)
                    {
                        hit = itr.worldFragment.singleIntersection;
                    }
                    else   //if(itr.movable)
                    {
                        hit = origin + (direction * itr.distance);
                    }
                }
            }

            CameraCS.SceneManager.DestroyQuery(raySceneQuery);

            return(hit);
        }
        public void LeftClicked(float x, float y, string currentEntity)
        {
            // Save mouse position
            mouseX = x; mouseY = y;

            // Setup the ray scene query
            Ray mouseRay = mCamera.GetCameraToViewportRay(mouseX, mouseY);

            Ray newRay = new Ray(new Vector3(mouseRay.Origin.x, System.Math.Abs(mouseRay.Origin.y), mouseRay.Origin.z), mouseRay.Direction);

            mRaySceneQuery.Ray = newRay;

            // Execute query
            RaySceneQueryResult result = mRaySceneQuery.Execute();

            RaySceneQueryResult.Enumerator itr = (RaySceneQueryResult.Enumerator)result.GetEnumerator();

            // Get results, create a node/entity on the position
            if (itr != null && itr.MoveNext())
            {
                if (string.IsNullOrWhiteSpace(currentEntity))
                {
                    return;
                }

                if (itr.Current != null && itr.Current.worldFragment != null)
                {
                    Entity ent = mMgr.CreateEntity(currentEntity + mCount.ToString(), currentEntity);
                    mCurrentObject = mMgr.RootSceneNode.CreateChildSceneNode(currentEntity + "Node" + mCount.ToString(),
                                                                             itr.Current.worldFragment.singleIntersection);
                    mCount++;
                    mCurrentObject.AttachObject(ent);
                    mCurrentObject.SetScale(scale);
                }
            } //

            mLMouseDown = true;
            return;
        }
Beispiel #9
0
        public static Vector3 GetBestLocationFromYDown(Vector3 vector, float fallbackY, float sizeY)
        {
            Ray ray = new Ray(vector + new Vector3(0, (float.MaxValue), 0), Vector3.NEGATIVE_UNIT_Y);

            RaySceneQuery mRaySceneQuery = Engine.Renderer.Scene.CreateRayQuery(ray);

            mRaySceneQuery.SetSortByDistance(true, 64);
            mRaySceneQuery.QueryMask     = (uint)QueryFlags.INSTANCE_ENTITY;
            mRaySceneQuery.QueryTypeMask =
                SceneManager.ENTITY_TYPE_MASK |
                SceneManager.STATICGEOMETRY_TYPE_MASK |
                SceneManager.USER_TYPE_MASK_LIMIT |
                SceneManager.FRUSTUM_TYPE_MASK |
                SceneManager.FX_TYPE_MASK |
                SceneManager.LIGHT_TYPE_MASK |
                SceneManager.WORLD_GEOMETRY_TYPE_MASK;

            RaySceneQueryResult result = mRaySceneQuery.Execute();

            RaySceneQueryResult.Enumerator itr = (RaySceneQueryResult.Enumerator)(result.GetEnumerator());

            Vector3 max = new Vector3(vector.x, fallbackY, vector.z);

            if (itr != null)
            {
                while (itr.MoveNext())
                {
                    RaySceneQueryResultEntry entry = itr.Current;
                    SceneNode parentNode           = entry.movable.ParentSceneNode;
                    Vector3   current = new Vector3(vector.x, parentNode.Position.y + sizeY, vector.z);
                    if (current.y > max.y)
                    {
                        max = current;
                    }
                }
            }
            return(max);
        }
Beispiel #10
0
        /// <summary>
        /// Calculates collistion from Rays and check distance between bullet and object gets from the Ray result.
        /// </summary>
        /// <returns>Returns if bullet hits any target.</returns>
        private bool Collision()
        {
            Ray ray                    = new Ray(sceneNode.Position, GetDirection(sceneNode.Orientation));
            var mRaySceneQuery         = Game.SceneManager.CreateRayQuery(ray);
            RaySceneQueryResult result = mRaySceneQuery.Execute();

            // Check all objects from the Ray result.
            foreach (var item in result)
            {
                if ((item.distance < farfarAway) && (item.distance > 0))
                {
                    // Meet something
                    var hitTest = Game.HitTest;
                    if (hitTest.IsObjectControllable(item.movable.Name))
                    {
                        // Can hit just controlable game objects (no bullets, no pointers...)
                        hittedObject = hitTest.GetGameObject(item.movable.Name);
                        return(true);
                    }
                }
            }
            return(false);
        }
Beispiel #11
0
        private bool FrameStarted(FrameEvent evt)
        {
            // Check camera height
            RaySceneQuery       raySceneQuery = sceneMgr.CreateRayQuery(new Ray(camera.Position + new Vector3(0, 1000000, 0), Vector3.NEGATIVE_UNIT_Y));
            RaySceneQueryResult qryResult     = raySceneQuery.Execute();

            RaySceneQueryResult.Iterator it = qryResult.Begin();
            if (it != qryResult.End() && it.Value.worldFragment != null)
            {
                if (camera.DerivedPosition.y < it.Value.worldFragment.singleIntersection.y + 30)
                {
                    camera.SetPosition(camera.Position.x,
                                       it.Value.worldFragment.singleIntersection.y + 30,
                                       camera.Position.z);
                }

                it.MoveNext();
            }

            //SkyX::AtmosphereManager::Options SkyXOptions = mSkyX->getAtmosphereManager()->getOptions();

            // Time
            if (!showInformation)
            {
                manager.TimeMultiplier = 0.1f;
            }
            else
            {
                manager.TimeMultiplier = 0.0f;
            }

            textArea.Caption = GetConfigString();
            manager.Update(evt.timeSinceLastFrame);

            return(true);
        }
        public float GetTSMHeightAt(float x, float z)
        {
            float y = 0.0f;

            Ray updateRay = new Ray();

            updateRay.Origin    = new Vector3(x, 9999, z);
            updateRay.Direction = Vector3.NEGATIVE_UNIT_Y;

            RaySceneQuery tsmRaySceneQuery = this.sceneMgr.CreateRayQuery(updateRay);

            RaySceneQueryResult qryResult = tsmRaySceneQuery.Execute();

            RaySceneQueryResult.Iterator i = qryResult.Begin();
            if (i != qryResult.End() && i.Value.worldFragment != null)
            {
                y = i.Value.worldFragment.singleIntersection.y;
            }

            this.sceneMgr.DestroyQuery(tsmRaySceneQuery);
            tsmRaySceneQuery.Dispose();

            return(y);
        }
Beispiel #13
0
        protected override bool ExampleApp_FrameStarted(FrameEvent evt)
        {
            if (base.ExampleApp_FrameStarted(evt) == false)
            {
                return(false);
            }

            // clamp to terrain
            Ray updateRay = new Ray(this.camera.Position, Vector3.NEGATIVE_UNIT_Y);

            raySceneQuery.Ray = updateRay;
            RaySceneQueryResult qryResult = raySceneQuery.Execute();

            RaySceneQueryResultEntry rs = qryResult[0];

            if (rs != null && rs.worldFragment != null)
            {
                camera.SetPosition(camera.Position.x,
                                   rs.worldFragment.singleIntersection.y + 10,
                                   camera.Position.z);
            }

            return(true);
        }
Beispiel #14
0
        public RaycastResult Raycast(Ray ray, uint queryMask)
        {
            RaycastResult rr = new RaycastResult();

            RaySceneQuery raySceneQuery = this.sceneMgr.CreateRayQuery(new Ray());

            raySceneQuery.SetSortByDistance(true);

            // check we are initialised
            if (raySceneQuery != null)
            {
                // create a query object
                raySceneQuery.Ray = ray;
                raySceneQuery.SetSortByDistance(true);
                raySceneQuery.QueryMask = queryMask;

                using (RaySceneQueryResult queryResult = raySceneQuery.Execute())
                {
                    // execute the query, returns a vector of hits
                    if (queryResult.Count <= 0)
                    {
                        // raycast did not hit an objects bounding box
                        this.sceneMgr.DestroyQuery(raySceneQuery);
                        raySceneQuery.Dispose();
                        return(null);
                    }

                    // at this point we have raycast to a series of different objects bounding boxes.
                    // we need to test these different objects to see which is the first polygon hit.
                    // there are some minor optimizations (distance based) that mean we wont have to
                    // check all of the objects most of the time, but the worst case scenario is that
                    // we need to test every triangle of every object.
                    // Ogre::Real closest_distance = -1.0f;
                    rr.Distance = -1.0f;
                    Vector3 closestResult = Vector3.ZERO;

                    for (int qridx = 0; qridx < queryResult.Count; qridx++)
                    {
                        // stop checking if we have found a raycast hit that is closer
                        // than all remaining entities
                        if (rr.Distance >= 0.0f && rr.Distance < queryResult[qridx].distance)
                        {
                            break;
                        }

                        // only check this result if its a hit against an entity
                        if (queryResult[qridx].movable != null &&
                            queryResult[qridx].movable.MovableType == "Entity")
                        {
                            // get the entity to check
                            Entity entity = (Entity)queryResult[qridx].movable;

                            // mesh data to retrieve
                            Vector3[] vertices;
                            int[]     indices;
                            RenderOperation.OperationTypes opType;

                            // get the mesh information
                            using (MeshPtr mesh = entity.GetMesh())
                            {
                                opType = mesh.GetSubMesh(0).operationType;

                                Debug.Assert(CheckSubMeshOpType(mesh, opType));

                                GetMeshInformation(
                                    mesh,
                                    out vertices,
                                    out indices,
                                    entity.ParentNode._getDerivedPosition(),
                                    entity.ParentNode._getDerivedOrientation(),
                                    entity.ParentNode._getDerivedScale());
                            }

                            int vertexCount = vertices.Length;
                            int indexCount  = indices.Length;

                            // test for hitting individual triangles on the mesh
                            bool newClosestFound = false;
                            Pair <bool, float> hit;
                            switch (opType)
                            {
                            case RenderOperation.OperationTypes.OT_TRIANGLE_LIST:
                                for (int i = 0; i < indexCount; i += 3)
                                {
                                    hit = Mogre.Math.Intersects(ray, vertices[indices[i]], vertices[indices[i + 1]], vertices[indices[i + 2]], true, false);

                                    if (CheckDistance(rr, hit))
                                    {
                                        newClosestFound = true;
                                    }
                                }
                                break;

                            case RenderOperation.OperationTypes.OT_TRIANGLE_STRIP:
                                for (int i = 0; i < indexCount - 2; i++)
                                {
                                    hit = Mogre.Math.Intersects(ray, vertices[indices[i]], vertices[indices[i + 1]], vertices[indices[i + 2]], true, true);

                                    if (CheckDistance(rr, hit))
                                    {
                                        newClosestFound = true;
                                    }
                                }
                                break;

                            case RenderOperation.OperationTypes.OT_TRIANGLE_FAN:
                                for (int i = 0; i < indexCount - 2; i++)
                                {
                                    hit = Mogre.Math.Intersects(ray, vertices[indices[0]], vertices[indices[i + 1]], vertices[indices[i + 2]], true, true);

                                    if (CheckDistance(rr, hit))
                                    {
                                        newClosestFound = true;
                                    }
                                }
                                break;

                            default:
                                throw new Exception("invalid operation type");
                            }

                            // if we found a new closest raycast for this object, update the
                            // closest_result before moving on to the next object.
                            if (newClosestFound)
                            {
                                rr.Target     = entity;
                                closestResult = ray.GetPoint(rr.Distance);
                            }
                        }
                    }

                    this.sceneMgr.DestroyQuery(raySceneQuery);
                    raySceneQuery.Dispose();

                    // return the result
                    if (rr.Distance >= 0.0f)
                    {
                        // raycast success
                        rr.Position = closestResult;
                        return(rr);
                    }
                    else
                    {
                        return(null);
                    }
                }
            }
            else
            {
                return(null);
            }
        }
Beispiel #15
0
        public override void InjectMouseMove(MouseEvent arg)
        {
            base.InjectMouseMove(arg);

            Vector2 cursorPos = new Vector2(arg.state.X.abs, arg.state.Y.abs);
            Ray     ray       = UIManager.Instance.GetCursorRay(editor.Map.Camera);

            switch (state)
            {
            case EditState.Add:
                switch (type)
                {
                case EditType.EditAIMeshMode:
                    Mogre.Vector3 pos = Helper.ConvertScreenCoordToWorldCoord(
                        lastMousePos,
                        editor.Map.Camera,
                        EngineManager.Instance.renderWindow);
                    HandleObjectCreate(pos);
                    state     = EditState.Edit;
                    operation = EditOperation.ChangingObjCoordFllowMouse;
                    break;

                case EditType.EditObjectMode:
                    break;

                case EditType.EditTerrainMode:
                    break;
                }
                break;

            case EditState.Edit:
                switch (type)
                {
                case EditType.EditAIMeshMode:
                    Mogre.Vector3 pos = ray.Origin + ray.Direction * distance;
                    HandleObjOperationNoResize(pos, cursorPos);
                    break;

                case EditType.EditObjectMode:
                    break;

                case EditType.EditTerrainMode:
                    break;
                }
                break;

            case EditState.Free:
                Degree deCameraYaw = new Degree(arg.state.X.rel * -0.1f);
                editor.Map.Camera.Yaw(deCameraYaw);
                Degree deCameraPitch = new Degree(arg.state.Y.rel * -0.1f);
                editor.Map.Camera.Pitch(deCameraPitch);

                if (currentSelectedEnt != null)
                {
                    currentSelectedEnt.ParentSceneNode.ShowBoundingBox = false;
                }
                var query = editor.Map.SceneManager.CreateRayQuery(ray);
                query.QueryMask = 1 << 0;
                RaySceneQueryResult result = query.Execute();
                foreach (var sResult in result)
                {
                    if (sResult.movable != null &&
                        (sResult.movable.Name.StartsWith("SCENE_OBJECT") || sResult.movable.Name.StartsWith("AIMESH")))
                    {
                        //High light the object
                        var         ent      = editor.Map.SceneManager.GetEntity(sResult.movable.Name);
                        MaterialPtr material = ent.GetSubEntity(0).GetMaterial();
                        ColourValue cv       = new ColourValue(1, 0, 0);
                        material.GetTechnique(0).SetAmbient(cv);
                        ColourValue cv2 = new ColourValue(1, 0, 0);
                        material.GetTechnique(0).SetDiffuse(cv2);
                        ent.GetSubEntity(0).SetMaterial(material);
                        ent.ParentSceneNode.ShowBoundingBox = true;
                        currentSelectedEnt = ent;
                    }
                }
                break;
            }
            lastMousePos = cursorPos;
        }
        public RaycastResult Raycast(Ray ray, uint queryMask)
        {
            RaycastResult rr = new RaycastResult();

            RaySceneQuery raySceneQuery = this.sceneMgr.CreateRayQuery(new Ray());

            raySceneQuery.SetSortByDistance(true);

            // check we are initialised
            if (raySceneQuery != null)
            {
                // create a query object
                raySceneQuery.Ray = ray;
                raySceneQuery.SetSortByDistance(true);
                raySceneQuery.QueryMask = queryMask;

                // execute the query, returns a vector of hits
                if (raySceneQuery.Execute().Count <= 0)
                {
                    // raycast did not hit an objects bounding box
                    return(null);
                }
            }
            else
            {
                // LogManager.Singleton.LogMessage("Cannot raycast without RaySceneQuery instance");
                return(null);
            }

            // at this point we have raycast to a series of different objects bounding boxes.
            // we need to test these different objects to see which is the first polygon hit.
            // there are some minor optimizations (distance based) that mean we wont have to
            // check all of the objects most of the time, but the worst case scenario is that
            // we need to test every triangle of every object.
            // Ogre::Real closest_distance = -1.0f;
            rr.Distance = -1.0f;
            Vector3             closest_result = Vector3.ZERO;
            RaySceneQueryResult query_result   = raySceneQuery.GetLastResults();

            for (int qridx = 0; qridx < query_result.Count; qridx++)
            {
                // stop checking if we have found a raycast hit that is closer
                // than all remaining entities
                if ((rr.Distance >= 0.0f) && (rr.Distance < query_result[qridx].distance))
                {
                    break;
                }

                // only check this result if its a hit against an entity
                if ((query_result[qridx].movable != null) &&
                    (query_result[qridx].movable.MovableType.CompareTo("Entity") == 0))
                {
                    // get the entity to check
                    Entity pentity = (Entity)query_result[qridx].movable;

                    // mesh data to retrieve
                    uint      vertex_count;
                    uint      index_count;
                    Vector3[] vertices;
                    ulong[]   indices;

                    // get the mesh information
                    GetMeshInformation(
                        pentity.GetMesh(),
                        out vertex_count,
                        out vertices,
                        out index_count,
                        out indices,
                        pentity.ParentNode._getDerivedPosition(),
                        pentity.ParentNode._getDerivedOrientation(),
                        pentity.ParentNode.GetScale());

                    // test for hitting individual triangles on the mesh
                    bool new_closest_found = false;
                    for (int i = 0; i < (int)index_count; i += 3)
                    {
                        // check for a hit against this triangle
                        Pair <bool, float> 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 ((rr.Distance < 0.0f) ||
                                (hit.second < rr.Distance))
                            {
                                // this is the closest so far, save it off
                                rr.Distance       = hit.second;
                                new_closest_found = true;
                            }
                        }
                    }

                    // if we found a new closest raycast for this object, update the
                    // closest_result before moving on to the next object.
                    if (new_closest_found)
                    {
                        rr.Target      = pentity;
                        closest_result = ray.GetPoint(rr.Distance);
                    }
                }
            }

            this.sceneMgr.DestroyQuery(raySceneQuery);
            raySceneQuery.Dispose();

            // return the result
            if (rr.Distance >= 0.0f)
            {
                // raycast success
                rr.Position = closest_result;
                return(rr);
            }
            else
            {
                return(null);
            }
        }
 internal static global::System.Runtime.InteropServices.HandleRef getCPtr(RaySceneQueryResult obj)
 {
     return((obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr);
 }
        private void renderBox_MouseClick(object sender, MouseEventArgs e)
        {
            if (e.Button != MouseButtons.Left)
            {
                return;
            }
            foreach (MovableObject selectedNode in selectedNodes)
            {
                try
                {
                    selectedNode.ParentSceneNode.ShowBoundingBox = false;
                }
                catch (Exception ex)
                {
                    //log(ex.ToString());
                }
            }
            selectedNodes = new ArrayList();
            float               scrx         = (float)e.X / OgreWindow.Instance.mViewport.ActualWidth;
            float               scry         = (float)e.Y / OgreWindow.Instance.mViewport.ActualHeight;
            Ray                 ray          = OgreWindow.Instance.mCamera.GetCameraToViewportRay(scrx, scry);
            RaySceneQuery       query        = OgreWindow.Instance.mSceneMgr.CreateRayQuery(ray);
            RaySceneQueryResult results      = query.Execute();
            float               nearest      = 100000000f; //100 mill
            int                 nearestIndex = -1;


            for (int i = 0; i < results.Count; i++)
            {
                RaySceneQueryResultEntry entry = results[i];
                if (entry.movable.Name == "MainCamera")
                {
                    continue;
                }
                if (entry.movable.Name.IndexOf("SphereEntity") > -1)
                {
                    continue;
                }
                if (entry.movable.Name.IndexOf("SkyXMeshEnt") > -1)
                {
                    continue;
                }
                if (entry.movable.Name.IndexOf("_Hydrax_GodRays_ManualObject") > -1)
                {
                    continue;
                }
                if (entry.movable.Name.IndexOf("_Hydrax_GodRays_Projector_Camera") > -1)
                {
                    continue;
                }
                if (entry.movable.Name.IndexOf("_Hydrax_Projector_Camera") > -1)
                {
                    continue;
                }
                if (entry.movable.Name.IndexOf("HydraxMeshEnt") > -1)
                {
                    continue;
                }

                bool cancel = false;
                foreach (string s in preventSelect)
                {
                    if (entry.movable.Name.IndexOf(s) > -1)
                    {
                        cancel = true;
                        break;
                    }
                }
                if (cancel)
                {
                    continue;
                }
                if (entry.distance < nearest)
                {
                    nearest      = entry.distance;
                    nearestIndex = i;
                }
            }
            if (nearestIndex > -1)
            {
                RaySceneQueryResultEntry entry = results[nearestIndex];
                selectSceneNode(entry.movable);
            }
        }
Beispiel #19
0
        private static bool GetRaySceneLocationWithPlane(double x, double y, Plane plane, out Vector3 vector, SceneNode ignore)
        {
            float width  = Engine.Renderer.Camera.Viewport.ActualWidth;
            float height = Engine.Renderer.Camera.Viewport.ActualHeight;

            Ray mouseRay = Engine.Renderer.Camera.GetCameraToViewportRay((float)((x - 1) / width), (float)((y - 1) / height));

            Plane inverse = new Plane(-plane.normal, -plane.d);

            Pair <bool, float> d0 = mouseRay.Intersects(plane);
            Pair <bool, float> d1 = mouseRay.Intersects(inverse);

            RaySceneQuery mRaySceneQuery = Engine.Renderer.Scene.CreateRayQuery(mouseRay);

            mRaySceneQuery.SetSortByDistance(true, 16);
            mRaySceneQuery.QueryMask     = (uint)QueryFlags.INSTANCE_ENTITY;
            mRaySceneQuery.QueryTypeMask =
                SceneManager.ENTITY_TYPE_MASK |
                SceneManager.STATICGEOMETRY_TYPE_MASK |
                SceneManager.USER_TYPE_MASK_LIMIT |
                SceneManager.FRUSTUM_TYPE_MASK |
                SceneManager.FX_TYPE_MASK |
                SceneManager.LIGHT_TYPE_MASK |
                SceneManager.WORLD_GEOMETRY_TYPE_MASK;

            RaySceneQueryResult result = mRaySceneQuery.Execute();

            RaySceneQueryResult.Enumerator itr = (RaySceneQueryResult.Enumerator)(result.GetEnumerator());

            if (itr != null)
            {
                RaySceneQueryResultEntry entry = null;
                while (itr.MoveNext())
                {
                    entry = itr.Current;
                    if (entry != null && !entry.movable.ParentSceneNode.Equals(ignore))
                    {
                        vector = mouseRay.GetPoint(entry.distance);
                        return(true);
                    }
                }
                if (d0.first)
                {
                    Vector3 planePoint = mouseRay.GetPoint(d0.second);
                    if ((Engine.Renderer.Camera.Position - planePoint).Length < MAX_TRANSLATE_DRAG_DISTANCE)
                    {
                        vector = planePoint;
                        return(true);
                    }
                }
                if (d1.first)
                {
                    Vector3 planePoint = mouseRay.GetPoint(d1.second);
                    if ((Engine.Renderer.Camera.Position - planePoint).Length < MAX_TRANSLATE_DRAG_DISTANCE)
                    {
                        vector = planePoint;
                        return(true);
                    }
                    else
                    {
                        vector = Vector3.ZERO;
                        return(false);
                    }
                }
                else
                {
                    vector = Vector3.ZERO;
                    return(false);
                }
            }
            else
            {
                vector = Vector3.ZERO;
                return(false);
            }
        }
 public RaySceneQueryResult(RaySceneQueryResult other) : this(OgrePINVOKE.new_RaySceneQueryResult__SWIG_1(RaySceneQueryResult.getCPtr(other)), true)
 {
     if (OgrePINVOKE.SWIGPendingException.Pending)
     {
         throw OgrePINVOKE.SWIGPendingException.Retrieve();
     }
 }