bool TryCreateMRPlane(MRLayerPlaneData layerPlane, Pose layerOriginPose)
        {
            var     mrPlaneVertices = new List <Vector3>();
            Pose    pose;
            Vector3 center;
            Vector2 extents;

            if (!TryGetPlaneData(layerPlane, layerOriginPose, mrPlaneVertices, out pose, out center, out extents))
            {
                return(false);
            }

            var vertsCount         = mrPlaneVertices.Count;
            var normals            = new List <Vector3>(vertsCount);
            var textureCoordinates = new List <Vector2>(vertsCount);
            var indices            = new List <int>();

            PlaneUtils.TriangulatePlaneFromVertices(pose, mrPlaneVertices, indices, normals, textureCoordinates);

            var mrPlane = new MRPlane
            {
                id                 = MarsTrackableId.Create(),
                alignment          = m_PlaneAlignment,
                vertices           = mrPlaneVertices,
                normals            = normals,
                indices            = indices,
                textureCoordinates = textureCoordinates,
                pose               = pose,
                center             = center,
                extents            = extents
            };

            layerPlane.MRPlane = mrPlane;
            return(true);
        }
Beispiel #2
0
        void UpdatePlaneFromData()
        {
            if (m_UseMRPlaneMesh)
            {
                m_GeneratedPlane = m_RuntimePlane;
                var localScale = transform.localScale;

                // We duplicate the vertices here since the original list is serialized with the base plane
                if (localScale != Vector3.one && m_GeneratedPlane.vertices != null)
                {
                    m_GeneratedPlane.vertices = m_GeneratedPlane.vertices.ToList();
                }

                ScaleVertices(m_GeneratedPlane.vertices, localScale);
            }
            else
            {
                m_GeneratedPlane = new MRPlane {
                    id = m_RuntimePlane.id
                };

                if (m_OriginalMesh != null)
                {
                    var vertices       = m_OriginalMesh.vertices.ToList();
                    var verticesLength = vertices.Count;

                    ScaleVertices(vertices, transform.localScale);

                    var indices   = new List <int>(verticesLength * 3);
                    var normals   = new List <Vector3>(verticesLength);
                    var texCoords = new List <Vector2>(verticesLength);

                    PlaneUtils.TriangulatePlaneFromVertices(m_GeneratedPlane.pose, vertices, indices, normals, texCoords);

                    indices.TrimExcess();

                    // Mesh data is not initialized when MR Plane is created
                    m_GeneratedPlane.vertices           = vertices;
                    m_GeneratedPlane.indices            = indices;
                    m_GeneratedPlane.normals            = normals;
                    m_GeneratedPlane.textureCoordinates = texCoords;
                }
            }

            // Traits from other synthesized data
            m_GeneratedPlane.pose      = m_PoseSource.GetTraitData();
            m_GeneratedPlane.alignment = (MarsPlaneAlignment)m_AlignmentSource.GetTraitData();
            m_GeneratedPlane.extents   = m_ExtentsSource.GetTraitData();

            m_MRPlaneGenerated = true;
        }
        void UpdateMRPlane(MRLayerPlaneData layerPlane, Pose layerOriginPose)
        {
            var mrPlane         = layerPlane.MRPlane;
            var mrPlaneVertices = mrPlane.vertices;

            mrPlaneVertices.Clear();
            Pose    pose;
            Vector3 center;
            Vector2 extents;

            TryGetPlaneData(layerPlane, layerOriginPose, mrPlaneVertices, out pose, out center, out extents);
            mrPlane.pose    = pose;
            mrPlane.center  = center;
            mrPlane.extents = extents;

            // Grow capacity for normals and UVs if needed
            const int capacityBuffer = 8;
            var       vertsCount     = mrPlaneVertices.Count;
            var       normals        = mrPlane.normals;

            if (normals.Capacity <= vertsCount)
            {
                normals.Capacity = vertsCount + capacityBuffer;
            }

            var textureCoordinates = mrPlane.textureCoordinates;

            if (textureCoordinates.Capacity <= vertsCount)
            {
                textureCoordinates.Capacity = vertsCount + capacityBuffer;
            }

            var indices = mrPlane.indices;

            indices.Clear();
            normals.Clear();
            textureCoordinates.Clear();
            PlaneUtils.TriangulatePlaneFromVertices(mrPlane.pose, mrPlaneVertices, indices, normals, textureCoordinates);

            layerPlane.MRPlane = mrPlane;
        }
Beispiel #4
0
        public static MRPlane ToMRPlane(this ARPlane plane)
        {
            var alignment = plane.alignment;
            var pose      = plane.transform.GetWorldPose();

            var mrPlane = new MRPlane
            {
                id        = plane.trackableId.ToMarsId(),
                alignment = alignment.ToMarsPlaneAlignment(),
                pose      = pose,
                extents   = plane.extents * 2.0f, // MR extents are diameter, AR extends are "(half dimensions) of the plane in meters."
                center    = new Vector3(plane.centerInPlaneSpace.x, 0.0f, plane.centerInPlaneSpace.y)
            };

            var nativeVertices = plane.boundary;

            if (nativeVertices.Length <= 0)
            {
                return(mrPlane);
            }

            var count              = nativeVertices.Length;
            var vertices           = new List <Vector3>(count);
            var normals            = new List <Vector3>(count);
            var textureCoordinates = new List <Vector2>(count);
            var indices            = new List <int>();

            for (var i = 0; i < count; i++)
            {
                var nativeVertex = nativeVertices[i];
                vertices.Add(new Vector3(nativeVertex.x, 0.0f, nativeVertex.y));
            }

            mrPlane.vertices           = vertices;
            mrPlane.normals            = normals;
            mrPlane.textureCoordinates = textureCoordinates;
            mrPlane.indices            = indices;
            PlaneUtils.TriangulatePlaneFromVertices(mrPlane.pose, vertices, indices, normals, textureCoordinates);

            return(mrPlane);
        }
Beispiel #5
0
        /// <summary>
        /// Set the data for the MRPlane backing this SynthesizedPlane
        /// </summary>
        /// <param name="vertices">The vertices for the boundary polygon</param>
        /// <param name="center">The position of the center of the plane</param>
        /// <param name="extents">The extents of the boundary polygon</param>
        public void SetMRPlaneData(List <Vector3> vertices, Vector3 center, Vector2 extents)
        {
            if (m_ExtentsSource == null)
            {
                m_ExtentsSource = GetComponent <SynthesizedBounds2D>();
            }

            m_ExtentsSource.baseBounds = extents;
            m_Plane.center             = center;

            m_Plane.vertices.Clear();
            m_Plane.indices.Clear();
            m_Plane.normals.Clear();
            m_Plane.textureCoordinates.Clear();

            m_Plane.vertices.AddRange(vertices);
            PlaneUtils.TriangulatePlaneFromVertices(m_Plane.pose, m_Plane.vertices, m_Plane.indices, m_Plane.normals, m_Plane.textureCoordinates);

            SetMeshData();
            CopyToRuntimePlane();

            m_MRPlaneGenerated = false;
        }
Beispiel #6
0
        void CreateOrUpdateGameObject(MRPlane plane)
        {
            if (MARSCore.instance.paused)
            {
                return;
            }

            GameObject   go;
            Mesh         mesh         = null;
            MeshCollider meshCollider = null;
            var          id           = plane.id;
            var          useGeometry  = m_UsePlaneGeometry && plane.vertices != null;
            var          makeEdge     = m_EdgeSettings.MakeEdge;

            if (m_Planes.TryGetValue(id, out var planeVisual))
            {
                go           = planeVisual.GameObject;
                mesh         = planeVisual.Mesh;
                meshCollider = planeVisual.Collider;
                if (useGeometry && mesh == null)
                {
                    mesh             = new Mesh();
                    planeVisual.Mesh = mesh;
                }
            }
            else
            {
                go = Instantiate(m_PlanePrefab, transform);

#if UNITY_EDITOR
                // This allows the instantiated objects to use layer locking for scene picking in the editor.
                if (m_UseParentLayer)
                {
                    go.SetLayerAndHideFlagsRecursively(gameObject.layer, HideFlags.DontSave);
                }
                else
                {
                    go.SetHideFlagsRecursively(HideFlags.DontSave);
                }
#else
                go.SetHideFlagsRecursively(HideFlags.DontSave);
#endif

                if (useGeometry)
                {
                    mesh = new Mesh();

                    var meshFilter = go.GetComponentInChildren <MeshFilter>();
                    if (meshFilter)
                    {
                        meshFilter.sharedMesh = mesh;
                    }

                    meshCollider = go.GetComponentInChildren <MeshCollider>();
                    if (meshCollider)
                    {
                        meshCollider.sharedMesh = mesh;
                    }

                    planeVisual = PlaneVisual.GetOrCreate(go, mesh, meshCollider, makeEdge);
                }
                else
                {
                    planeVisual = PlaneVisual.GetOrCreate(go, null, null, makeEdge);
                }

                m_Planes.Add(id, planeVisual);
            }

            var goTransform = go.transform;
            var pose        = this.ApplyOffsetToPose(plane.pose);
            goTransform.SetWorldPose(pose);

            var cameraScale = this.GetCameraScale();
            if (useGeometry)
            {
                var vertices            = plane.vertices;
                var textureCoordinates  = plane.textureCoordinates;
                var textureCoordinates2 = planeVisual.TextureCoordinates2;
                var indices             = plane.indices;
                if (makeEdge)
                {
                    planeVisual.InitializeEdgeLists();
                    PlaneUtils.GeneratePlaneWithBorders(plane.pose, vertices, planeVisual.Vertices, planeVisual.TextureCoordinates,
                                                        planeVisual.TextureCoordinates2, planeVisual.Indices, m_EdgeSettings);

                    vertices           = planeVisual.Vertices;
                    textureCoordinates = planeVisual.TextureCoordinates;
                    indices            = planeVisual.Indices;
                }
                else
                {
                    // Need to set uv2's with all 0's to clear out edge UVs if they exist (can happen if MakeEdge is toggled during play mode)
                    var vertexCount = vertices.Count;
                    textureCoordinates2.SetSize(vertexCount);
                    for (var i = 0; i < vertexCount; i++)
                    {
                        textureCoordinates2[i] = default;
                    }
                }

                goTransform.localScale = Vector3.one * cameraScale;
                mesh.triangles         = null;
                mesh.SetVertices(vertices);
                mesh.SetUVs(0, textureCoordinates);
                mesh.SetUVs(1, textureCoordinates2);
                mesh.SetTriangles(indices, 0, true);
                mesh.RecalculateNormals();

                if (meshCollider != null)
                {
                    meshCollider.sharedMesh = mesh; // this needs to re-applied to take effect
                }
            }
            else
            {
                var extents = plane.extents;
                goTransform.position  += pose.rotation * (plane.center * cameraScale);
                goTransform.localScale = new Vector3(extents.x, 1f, extents.y) * cameraScale;
            }
        }