Beispiel #1
0
        public Vivid.Pick.PickResult CamPick(int x, int y)
        {
            if (SceneUpdating == true)
            {
                return(null);
            }

            System.Console.WriteLine("Checking Scene: CacheSize:" + SceneCache.Length);

            Pick.PickResult res = new Pick.PickResult();

            Pick.Ray mr = Pick.Picker.CamRay(Cams[0], x, y);

            float  cd = 0;
            bool   firstHit = true;
            float  cu = 0, cv = 0;
            Node3D cn = null;

            int ms = System.Environment.TickCount;

            for (int i = 0; i < SceneCache.Length; i += 3)
            {
                var r0 = SceneCache[i];
                var r1 = SceneCache[i + 1];
                var r2 = SceneCache[i + 2];

                Vector3?pr = Pick.Picker.GetTimeAndUvCoord(mr.pos, mr.dir, r0, r1, r2);
                if (pr == null)
                {
                }
                else
                {
                    Vector3 cr = (Vector3)pr;
                    if (cr.X < cd || firstHit)
                    {
                        firstHit = false;
                        cd       = cr.X;
                        cn       = SceneNodes[i];
                        cu       = cr.Y;
                        cv       = cr.Z;
                    }
                }
            }

            ms = System.Environment.TickCount - ms;
            System.Console.WriteLine("PickTime:" + ms + " Secs:" + (ms / 1000));

            if (firstHit)
            {
                return(null);
            }

            res.Dist = cd;
            res.Node = cn;
            res.Pos  = Pick.Picker.GetTrilinearCoordinateOfTheHit(cd, mr.pos, mr.dir);
            res.Ray  = mr;
            res.UV   = new Vector3(cu, cv, 0);

            return(res);
        }
Beispiel #2
0
        public Vivid.Pick.PickResult CamPick(int x, int y)
        {
            Pick.PickResult res = new Pick.PickResult();

            Pick.Ray mr = Pick.Picker.CamRay(SceneGraph3D.CurScene.Cams[0], x, y);

            float  cd = 0;
            bool   firstHit = true;
            Mesh3D hitMesh = null;
            float  cu = 0, cv = 0;

            foreach (var msh in Meshes)
            {
                for (int i = 0; i < msh.TriData.Length; i++)
                {
                    var td = msh.TriData[i];

                    var r0 = msh.VertexData[td.V0].Pos;
                    var r1 = msh.VertexData[td.V1].Pos;
                    var r2 = msh.VertexData[td.v2].Pos;

                    r0 = Vector3.TransformPosition(r0, World);
                    r1 = Vector3.TransformPosition(r1, World);
                    r2 = Vector3.TransformPosition(r2, World);

                    Vector3?pr = Pick.Picker.GetTimeAndUvCoord(mr.pos, mr.dir, r0, r1, r2);
                    if (pr == null)
                    {
                    }
                    else
                    {
                        Vector3 cr = (Vector3)pr;
                        if (cr.X < cd || firstHit)
                        {
                            firstHit = false;
                            cd       = cr.X;
                            hitMesh  = msh;

                            cu = cr.Y;
                            cv = cr.Z;
                        }
                    }
                }
            }

            if (firstHit)
            {
                return(null);
            }

            res.Dist = cd;
            res.Node = this;
            res.Pos  = Pick.Picker.GetTrilinearCoordinateOfTheHit(cd, mr.pos, mr.dir);
            res.Ray  = mr;
            res.UV   = new Vector3(cu, cv, 0);
            res.Mesh = hitMesh;

            return(res);
        }
Beispiel #3
0
        public FusionEngine.Pick.PickResult CamPick(int x, int y)
        {
            Pick.PickResult res = new Pick.PickResult( );

            List <Node3D> nl = GetList(true);

            Pick.Ray mr = Pick.Picker.CamRay(Cams [0], x, y);

            float  cd = 0;
            bool   firstHit = true;
            float  cu = 0, cv = 0;
            Node3D cn = null;

            foreach (Node3D n in nl)
            {
                Entity3D e = n as Entity3D;

                foreach (Data.Mesh3D msh in e.Meshes)
                {
                    for (int i = 0; i < msh.TriData.Length; i++)
                    {
                        int     v0 = msh.TriData[i].V0;
                        int     v1 = msh.TriData[i].V1;
                        int     v2 = msh.TriData[i].v2;
                        Vector3 r0, r1, r2;
                        r0 = Rot(msh.VertexData [v0].Pos, n);
                        r1 = Rot(msh.VertexData [v1].Pos, n);
                        r2 = Rot(msh.VertexData [v2].Pos, n);
                        Vector3?pr = Pick.Picker.GetTimeAndUvCoord(mr.pos, mr.dir, r0, r1, r2);
                        if (pr == null)
                        {
                        }
                        else
                        {
                            Vector3 cr = (Vector3)pr;
                            if (cr.X < cd || firstHit)
                            {
                                firstHit = false;
                                cd       = cr.X;
                                cn       = n;
                                cu       = cr.Y;
                                cv       = cr.Z;
                            }
                        }
                    }
                }
            }

            if (firstHit)
            {
                return(null);
            }

            res.Dist = cd;
            res.Node = cn;
            res.Pos  = Pick.Picker.GetTrilinearCoordinateOfTheHit(cd, mr.pos, mr.dir);
            res.Ray  = mr;
            res.UV   = new Vector3(cu, cv, 0);

            return(res);
        }