private bool CreateMeshVertChunkCollection(Mesh mesh) { MeshVertexChunkCollection meshVertexChunkCollection = new MeshVertexChunkCollection(); if (!meshVertexChunkCollection.FromMesh(mesh)) { return(false); } _vertexChunkCollections.Add(meshVertexChunkCollection); _meshToVChunkCollection.Add(mesh, meshVertexChunkCollection); return(true); }
protected bool GetWorldPointClosestToInputDevice(Camera focusCamera, IEnumerable <GameObject> gameObjects, out Vector3 point) { point = Vector3.zero; if (gameObjects == null) { return(false); } if (!RTInputDevice.Get.Device.HasPointer()) { return(false); } Vector2 inputDeviceScreenPt = RTInputDevice.Get.Device.GetPositionYAxisUp(); float minDistSqr = float.MaxValue; bool foundPoint = false; foreach (GameObject srcObject in gameObjects) { Mesh mesh = srcObject.GetMesh(); if (mesh != null) { MeshVertexChunkCollection meshVChunkCollection = MeshVertexChunkCollectionDb.Get[mesh]; if (meshVChunkCollection == null) { continue; } Matrix4x4 worldMtx = srcObject.transform.localToWorldMatrix; List <MeshVertexChunk> testChunks = meshVChunkCollection.GetWorldChunksHoveredByPoint(inputDeviceScreenPt, worldMtx, focusCamera); if (testChunks.Count == 0) { MeshVertexChunk closestChunk = meshVChunkCollection.GetWorldVertChunkClosestToScreenPt(inputDeviceScreenPt, worldMtx, focusCamera); if (closestChunk != null && closestChunk.VertexCount != 0) { testChunks.Add(closestChunk); } } foreach (MeshVertexChunk chunk in testChunks) { Vector3 worldVert = chunk.GetWorldVertClosestToScreenPt(inputDeviceScreenPt, worldMtx, focusCamera); Vector2 screenVert = focusCamera.WorldToScreenPoint(worldVert); float distSqr = (inputDeviceScreenPt - screenVert).sqrMagnitude; if (distSqr < minDistSqr) { minDistSqr = distSqr; point = worldVert; foundPoint = true; } } } else { OBB spriteWorldOBB = ObjectBounds.CalcSpriteWorldOBB(srcObject); if (spriteWorldOBB.IsValid) { List <Vector3> obbPoints = spriteWorldOBB.GetCenterAndCornerPoints(); List <Vector2> screenPoints = focusCamera.ConvertWorldToScreenPoints(obbPoints); int closestPtIndex = Vector2Ex.GetPointClosestToPoint(screenPoints, inputDeviceScreenPt); if (closestPtIndex >= 0) { Vector2 closestPt = screenPoints[closestPtIndex]; float distSqr = (inputDeviceScreenPt - closestPt).sqrMagnitude; if (distSqr < minDistSqr) { minDistSqr = distSqr; point = obbPoints[closestPtIndex]; foundPoint = true; } } } } } return(foundPoint); }