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); }
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); }
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); }