Example #1
0
        // Use this for initialization
        public void Init(SLO_Join j0, SLO_Join j1, SLO_Join j2, Material mat, float thickness, int index, TriMesh.Extrusion extrusion)
        {
            m_Join0 = j0;
            m_Join1 = j1;
            m_Join2 = j2;

            m_Index = index;

            gameObject.name = "Face " + index;

            m_TriMesh       = gameObject.AddComponent <TriMesh>() as TriMesh;
            m_TriMesh.m_Mat = mat;

            m_Thickness = thickness;

            m_TriMesh.m_Thickness = m_Thickness * .001f;

            // TODO: If edge is tube then the diameter should come from the edge to give a flush finish
            m_InnerVerts = new Vector3[3];
            m_InnerVerts = TriMeshTest1.FindInnerVertsForFace(j0.transform.position, j1.transform.position, j2.transform.position, ((m_Join0.Diameter / 2f) + m_TabTolerance) * .001f);

            // need to put in code to handle inner, outer, center offset and line it up with joint tabs
            m_TriMesh.CreateTri(m_InnerVerts[0], m_InnerVerts[1], m_InnerVerts[2], extrusion);

            UpdateMeasurements();

            // Make selectable
            gameObject.tag = "Selectable";
            gameObject.AddComponent <MeshCollider>();
        }
Example #2
0
        public void Init(SLO_Edge edge, SLO_Join attachedJoin, SLO_Join lookAtJoin, float maxLength, float joinerMaxPercentageOfEdge)
        {
            m_Edge         = edge;
            m_AttachedJoin = attachedJoin;
            m_LookAtJoin   = lookAtJoin;
            m_SleeveLength = maxLength;
            m_JoinerMaxPercentageOfEdge = joinerMaxPercentageOfEdge;

            m_TubeMesh = new GameObject("Tube Mesh").AddComponent <ProceduralMesh_Tube>();
            m_TubeMesh.transform.SetParent(transform);
            m_TubeMesh.Init();
            m_TubeMesh.transform.localScale    = Vector3.one;
            m_TubeMesh.transform.localRotation = Quaternion.Euler(90, 0, 0);

            m_TubeMesh.m_Renderer.material = SLOResourceManager.Instance.m_MatJoiner;

            if (edge.m_Join0 == m_AttachedJoin)
            {
                edge.m_JoinArm0 = this;
            }
            else
            {
                edge.m_JoinArm1 = this;
            }

            transform.LookAt(LookAt);

            UpdateArm();
        }
Example #3
0
        // Create a tab by passing in 3 joins
        public void CreateTab(SLO_Join j0, SLO_Join j1, SLO_Join j2)
        {
            SLO_Join_Tab newTab = new GameObject().AddComponent <SLO_Join_Tab>() as SLO_Join_Tab;

            newTab.transform.position = j0.transform.position;
            newTab.Init(this, j0, j1, j2, SLOResourceManager.Instance.m_MatJoiner, m_OuterTabs, m_InnerTabs);
            m_Tabs.Add(newTab);
        }
Example #4
0
        public void CreateCap(SLO_Join join)
        {
            print("Creating cap");
            SLO_JoinCap newCap = new GameObject("Cap" + Caps.Count).AddComponent <SLO_JoinCap>();

            newCap.transform.SetParent(transform);
            newCap.Init(join);
            Caps.Add(newCap);
        }
Example #5
0
        public void CreateFace(SLO_Join j0, SLO_Join j1, SLO_Join j2)
        {
            SLO_Face newFace = new GameObject().AddComponent <SLO_Face>() as SLO_Face;

            newFace.Init(j0, j1, j2, SLOResourceManager.Instance.m_MatFace, m_FaceThickness, m_Faces.Count, m_FaceExtrusionPlacement);
            newFace.transform.SetParent(transform);

            // Add to list
            m_Faces.Add(newFace);
        }
 public Vector3 GetOppositeJoinPos(SLO_Join join)
 {
     if (join == m_Join0)
     {
         return(m_Join1.transform.position);
     }
     else
     {
         return(m_Join0.transform.position);
     }
 }
 public Vector3 GetPositionAlongEdge(SLO_Join join, float distance)
 {
     if (join == m_Join0)
     {
         return((m_Join1.transform.position - m_Join0.transform.position).normalized * distance);
     }
     else
     {
         return((m_Join0.transform.position - m_Join1.transform.position).normalized * distance);
     }
 }
        public void AddEdge(SLO_Edge edge, float maxJoinLength)
        {
            m_ConnectedEdges.Add(edge);

            SLO_Join lookAtJoin = edge.m_Join0;

            if (lookAtJoin.transform.position == transform.position)
            {
                lookAtJoin = edge.m_Join1;
            }

            // Create new arm
            SLO_Join_Arm newArm = new GameObject("Join Arm").AddComponent <SLO_Join_Arm>();

            newArm.name = "Join Arm";
            newArm.transform.SetParent(transform);
            newArm.Init(edge, this, lookAtJoin, maxJoinLength, m_MaxLengthPercentage);
            m_Arms.Add(newArm);
        }
Example #9
0
        public void Init(SLO_Join join)
        {
            m_Join       = join;
            m_TriFanMesh = gameObject.AddComponent <TriFanMesh>();

            m_Transforms = new Transform[m_Join.ConnectedEdges.Count];

            transform.SetParent(m_Join.transform);
            transform.localPosition = Vector3.zero;

            // Create transforms
            for (int i = 0; i < m_Join.ConnectedEdges.Count; i++)
            {
                Transform t = new GameObject(i.ToString()).transform;
                t.SetParent(transform);
                m_Transforms[i]          = t;
                m_Transforms[i].position = m_Join.ConnectedEdges[i].GetOppositeJoinPos(m_Join);
            }

            m_TriFanMesh.Init(m_Transforms);
        }
Example #10
0
        /*
         * void OnMouseDown()
         * {
         *  m_Object.SetSelectedObject(gameObject);
         * }
         */

        SLO_Edge FindEdgeConnectedToJoin(SLO_Join baseJoin, SLO_Join secondaryJoin)
        {
            foreach (SLO_Edge edge in baseJoin.ConnectedEdges)
            {
                if (baseJoin == edge.m_Join0)
                {
                    if (secondaryJoin == edge.m_Join1)
                    {
                        return(edge);
                    }
                }
                else if (baseJoin == edge.m_Join1)
                {
                    if (secondaryJoin == edge.m_Join0)
                    {
                        return(edge);
                    }
                }
            }

            return(null);
        }
Example #11
0
        public SLOObject ConvertMesh(MeshFilter meshfilter, bool addOuterTabs, bool addInnerTabs)
        {
            // Create new object
            SLOObject sloObj = new GameObject("SLO Obj - ").AddComponent <SLOObject>();

            sloObj.transform.position = Vector3.zero;

            float m_EdgeDiameter = PlayerPrefs.GetFloat("m_EdgeDiameter", 9.5f);
            float m_JoinerLength = PlayerPrefs.GetFloat("m_JoinerLength", 20);
            float WallThickness  = PlayerPrefs.GetFloat("WallThickness", 2);

            Mesh mesh = meshfilter.mesh;

            // Create array of edges
            for (int i = 0; i < mesh.triangles.Length / 3; i++)
            {
                // Create edge for 0 - 1
                sloObj.CreateEdge(mesh.vertices[mesh.triangles[(i * 3)]], mesh.vertices[mesh.triangles[(i * 3) + 1]]);
                // Create edge for 1 - 2
                sloObj.CreateEdge(mesh.vertices[mesh.triangles[(i * 3) + 1]], mesh.vertices[mesh.triangles[(i * 3) + 2]]);
                // Create edge for 2 - 0
                sloObj.CreateEdge(mesh.vertices[mesh.triangles[(i * 3) + 2]], mesh.vertices[mesh.triangles[(i * 3)]]);
            }

            #region Find and remove duplicate edges
            // Check if any edges are the same and remove copies
            // If edges share a vertex add them to the appropriate connection list
            List <SLO_Edge> edgesToRemove = new List <SLO_Edge>();
            for (int i = 0; i < sloObj.Edges.Count; i++)
            {
                SLO_Edge baseEdge = sloObj.Edges[i];

                if (edgesToRemove.Contains(baseEdge))
                {
                    continue;
                }

                for (int j = 0; j < sloObj.Edges.Count; j++)
                {
                    if (j == i)
                    {
                        continue;
                    }

                    SLO_Edge compareEdge = sloObj.Edges[j];

                    if (edgesToRemove.Contains(compareEdge))
                    {
                        continue;
                    }

                    // If not same length then continue
                    if (baseEdge.Length != compareEdge.Length)
                    {
                        continue;
                    }
                    else if (baseEdge.m_VertexPos0 == compareEdge.m_VertexPos0 && baseEdge.m_VertexPos1 == compareEdge.m_VertexPos1)
                    {
                        edgesToRemove.Add(baseEdge);
                    }
                    else if (baseEdge.m_VertexPos0 == compareEdge.m_VertexPos1 && baseEdge.m_VertexPos1 == compareEdge.m_VertexPos0)
                    {
                        edgesToRemove.Add(baseEdge);
                    }
                }
            }

            // Remove duplicate edges
            foreach (SLO_Edge e in edgesToRemove)
            {
                if (e != null)
                {
                    sloObj.Edges.Remove(e);
                    DestroyImmediate(e.gameObject);
                }
            }
            #endregion

            // Index the remaining edges
            for (int i = 0; i < sloObj.Edges.Count; i++)
            {
                sloObj.Edges[i].m_Index = i;
                sloObj.Edges[i].name    = "Edge " + i;
            }

            // Find all unique verts
            List <Vector3> uniqueVertPositions = new List <Vector3>();
            for (int i = 0; i < mesh.vertices.Length; i++)
            {
                if (!uniqueVertPositions.Contains(mesh.vertices[i]))
                {
                    uniqueVertPositions.Add(mesh.vertices[i]);
                }
            }

            // Set to the transform of the mesh
            sloObj.transform.position = transform.position;

            // Create joiners for each unique vert
            for (int i = 0; i < uniqueVertPositions.Count; i++)
            {
                sloObj.CreateJoiner(meshfilter.transform.TransformPoint(uniqueVertPositions[i]));
            }

            // Assign joiners to edges
            for (int i = 0; i < sloObj.Edges.Count; i++)
            {
                for (int j = 0; j < sloObj.Joiners.Count; j++)
                {
                    if (meshfilter.transform.TransformPoint(sloObj.Edges[i].m_VertexPos0) == sloObj.Joiners[j].transform.position)
                    {
                        sloObj.Edges[i].m_Join0 = sloObj.Joiners[j];
                    }

                    if (meshfilter.transform.TransformPoint(sloObj.Edges[i].m_VertexPos1) == sloObj.Joiners[j].transform.position)
                    {
                        sloObj.Edges[i].m_Join1 = sloObj.Joiners[j];
                    }
                }
            }

            // Assign joiners to edges
            for (int i = 0; i < sloObj.Edges.Count; i++)
            {
                sloObj.Edges[i].m_Join0.AddEdge(sloObj.Edges[i], m_JoinerLength);
                sloObj.Edges[i].m_Join1.AddEdge(sloObj.Edges[i], m_JoinerLength);
            }

            // Initalize edges
            for (int i = 0; i < sloObj.Edges.Count; i++)
            {
                sloObj.Edges[i].transform.position = sloObj.Edges[i].m_Join0.transform.position;
                sloObj.Edges[i].transform.LookAt(sloObj.Edges[i].m_Join1.transform.position);
                sloObj.Edges[i].transform.SetParent(sloObj.transform);
                sloObj.Edges[i].AddEdgeMesh();
                // sloObj.Edges[i].SetMaterial(SLOManager.Instance.m_MatEdge);
            }

            // Create faces
            for (int i = 0; i < mesh.triangles.Length / 3f; i++)
            {
                int triIndex = (i * 3);

                Vector3 v0 = meshfilter.transform.TransformPoint(mesh.vertices[mesh.triangles[triIndex]]);
                Vector3 v1 = meshfilter.transform.TransformPoint(mesh.vertices[mesh.triangles[triIndex + 1]]);
                Vector3 v2 = meshfilter.transform.TransformPoint(mesh.vertices[mesh.triangles[triIndex + 2]]);

                SLO_Join j0 = sloObj.FindJoinFromPos(v0);
                SLO_Join j1 = sloObj.FindJoinFromPos(v1);
                SLO_Join j2 = sloObj.FindJoinFromPos(v2);

                sloObj.CreateFace(j0, j1, j2);
            }

            for (int i = 0; i < sloObj.Faces.Count; i++)
            {
                int triIndex = (i * 3);

                SLO_Join j0 = sloObj.Faces[i].Join0; // m_MeshParent.TransformPoint(m_Mesh.vertices[m_Mesh.triangles[triIndex]]);
                SLO_Join j1 = sloObj.Faces[i].Join1; //m_MeshParent.TransformPoint(m_Mesh.vertices[m_Mesh.triangles[triIndex + 1]]);
                SLO_Join j2 = sloObj.Faces[i].Join2; //m_MeshParent.TransformPoint(m_Mesh.vertices[m_Mesh.triangles[triIndex + 2]]);

                // Tri 1
                sloObj.CreateTab(j0, j1, j2);
                sloObj.CreateTab(j1, j2, j0);
                sloObj.CreateTab(j2, j0, j1);
            }

            sloObj.CreateCaps();

            sloObj.RecalculateAllStats();

            // Deactivate original meshfilter
            meshfilter.transform.gameObject.SetActive(false);

            return(sloObj);
        }
        // Use this for initialization
        public void Init(SLOObject sloObj, SLO_Join j0, SLO_Join j1, SLO_Join j2, Material mat, bool makeInner, bool makeOuter)
        {
            #region Initialization of references
            // Sets reference to SLO object
            m_Object = sloObj;

            // Set name
            gameObject.name = "Tab";

            // Setup the connect joins
            m_BaseJoin      = j0;
            m_ConnctedJoin0 = j1;
            m_ConnctedJoin1 = j2;

            // Find arms
            for (int i = 0; i < m_BaseJoin.m_Arms.Count; i++)
            {
                if (m_BaseJoin.m_Arms[i].LookAtJoin == m_ConnctedJoin0)
                {
                    m_Arm12 = m_BaseJoin.m_Arms[i];
                }

                if (m_BaseJoin.m_Arms[i].LookAtJoin == m_ConnctedJoin1)
                {
                    m_Arm13 = m_BaseJoin.m_Arms[i];
                }
            }
            #endregion

            #region Calculations
            m_InnerVerts = TriMeshTest1.FindInnerVerts(m_BaseJoin.transform.position, m_ConnctedJoin0.transform.position, m_ConnctedJoin1.transform.position, (m_BaseJoin.Diameter / 2f) * .001f, m_BaseJoin.Length * .001f);
            Vector3 v0 = m_InnerVerts[0];
            Vector3 v1 = m_InnerVerts[1];
            Vector3 v2 = m_InnerVerts[2];

            // Get the normal of the triangle
            m_Normal = Vector3.Cross(v1 - v0, v2 - v0).normalized;

            // calculate the offset based on spacing
            //Vector3 normalOffset = m_Normal * ((SpacingRadius / 2f)) * .001f;
            #endregion

            if (makeInner)
            {
                // FIND INNER VERTS HERE
                m_TabInner      = new GameObject().AddComponent <TriMesh>() as TriMesh;
                m_TabInner.name = "Tab Inner";
                m_TabInner.transform.SetParent(transform);
                m_TabInner.transform.position = Vector3.zero;
                m_TabInner.transform.rotation = Quaternion.identity;
                m_TabInner.m_Mat       = mat;
                m_TabInner.m_Thickness = .001f;
                m_TabInner.CreateTri(v0, v1, v2, TriMesh.Extrusion.Center);
            }

            if (makeOuter)
            {
                m_TabOuter      = new GameObject().AddComponent <TriMesh>() as TriMesh;
                m_TabOuter.name = "Tab Outer";
                m_TabOuter.transform.SetParent(transform);
                m_TabOuter.m_Mat       = mat;
                m_TabOuter.m_Thickness = .001f;
                m_TabOuter.CreateTri(v0, v1, v2, TriMesh.Extrusion.Center);
            }

            //transform.SetParent (m_BaseJoin.transform );
        }
 public void SetSelectedJoint(SLO_Join join)
 {
     m_JointPosXInput.text = m_Manager.SelectedJoin.transform.position.x.ToString();
     m_JointPosYInput.text = m_Manager.SelectedJoin.transform.position.y.ToString();
     m_JointPosZInput.text = m_Manager.SelectedJoin.transform.position.z.ToString();
 }