Exemple #1
0
        public static void ExtractCenter(EPMDelaunayTerrain terrain, List <List <Vector2d> > pointList, EPMPoint.PointType oldType, EPMPoint.PointType newType, double halfWidth)
        {
            List <EPMTriangle> intersectList = new List <EPMTriangle>();
            List <EPMTriangle> oldTypeList   = terrain.ExtractTriangles_ByTypes(null, EPMPoint.GenerateTypesInt(false, oldType));

            for (int i = 0; i < pointList.Count; i++)
            {
                List <Vector2d> lineSet = pointList[i];
                for (int j = 0; j < lineSet.Count; j++)
                {
                    intersectList.AddRange(terrain.ExtractTriangles_PointsInCircle(lineSet[j], halfWidth, 1, oldTypeList));
                    if (j >= 1)
                    {
                        Vector2d dir = lineSet[j] - lineSet[j - 1];
                        dir.Normalize();
                        Vector2d normal = new Vector2d(-dir.y, dir.x);
                        intersectList.AddRange(terrain.ExtractTriangles_PointsInLineWithDistance(lineSet[j - 1] - dir * halfWidth, lineSet[j] + dir * halfWidth, halfWidth, 1, oldTypeList));
                        intersectList.AddRange(terrain.ExtractTriangles_IntersectLine(lineSet[j - 1] + normal * halfWidth - dir * halfWidth, lineSet[j] + normal * halfWidth + dir * halfWidth, oldTypeList));
                        intersectList.AddRange(terrain.ExtractTriangles_IntersectLine(lineSet[j - 1] - normal * halfWidth - dir * halfWidth, lineSet[j] - normal * halfWidth + dir * halfWidth, oldTypeList));
                    }
                }
            }

            for (int i = 0; i < intersectList.Count; i++)
            {
                EPMTriangle t = (EPMTriangle)intersectList[i];
                t.g_pointList[0].g_type = newType;
                t.g_pointList[1].g_type = newType;
                t.g_pointList[2].g_type = newType;
                t.SetType(newType);
            }
            intersectList.Clear();
            CheckAndSetTileTypeByNeighbor(terrain, oldType, newType, newType);
        }
Exemple #2
0
        public void CreateMesh()
        {
            int rowSplit    = g_customData.rowSplit;
            int columnSplit = g_customData.columnSplit;

            //First, delete the former created Mesh.
            for (int i = m_meshRoot.transform.childCount - 1; i >= 0; i--)
            {
                GameObject.DestroyImmediate(m_meshRoot.transform.GetChild(i).gameObject);
            }
            m_meshRoot.transform.DetachChildren();

            //Split Mesh to smaller meshes.
            List <List <EPMTriangle> > submeshTriangleList = new List <List <EPMTriangle> >();

            for (int i = 0; i < rowSplit * columnSplit; i++)
            {
                submeshTriangleList.Add(new List <EPMTriangle>());
            }

            //Don't Draw Ocean, use an sea plane to replace it.
            List <EPMTriangle> triangleList = m_terrain.ExtractTriangles_ByTypes(null, EPMPoint.GenerateTypesInt(true, EPMPoint.PointType.Ocean));

            for (int i = 0; i < triangleList.Count; i++)
            {
                EPMTriangle t = triangleList[i];

                EPMPoint p1 = t.g_pointList[0];
                //Check which submesh the point p1 falls in, than put the triangle into this submesh list.
                Vector2d v2     = p1.pos2d;
                int      column = (int)((v2.x - m_terrain.g_startPoint.x) / m_terrain.getXLength() * columnSplit);
                if (column >= columnSplit)
                {
                    column = columnSplit - 1;
                }
                int row = (int)((v2.y - m_terrain.g_startPoint.y) / m_terrain.getZlength() * rowSplit);
                if (row >= rowSplit)
                {
                    row = rowSplit - 1;
                }
                submeshTriangleList[column + row * columnSplit].Add(t);
            }

            for (int i = 0; i < submeshTriangleList.Count; i++)
            {
                if (submeshTriangleList[i].Count == 0)
                {
                    continue;
                }
                string name = (i / columnSplit).ToString() + "_" + (i % columnSplit).ToString();
                CreateSubMesh(submeshTriangleList[i], name);
            }
            CreateSeaPlane((float)g_customData.seaLevel);
        }
Exemple #3
0
        public static void CheckAndSetTileTypeByNeighbor(EPMDelaunayTerrain terrain, int checkTypeEnum, int neighborTypeEnum, EPMPoint.PointType newTypeForPassCheck, EPMPoint.PointType newTypeForNotPassCheck, bool processNotPassChcek = true, int minNeighborCount = 2, bool shareEdge = true, bool alsoSetPointsType = false)
        {
            List <EPMTriangle> triangleList = terrain.ExtractTriangles_ByTypes(null, checkTypeEnum);

            if (shareEdge)
            {
                for (int i = 0; i < triangleList.Count; i++)
                {
                    EPMTriangle t     = (EPMTriangle)triangleList[i];
                    int         count = 0;
                    for (int j = 0; j < t.g_shareEdgeNeighbors.Count; j++)
                    {
                        if (t.g_shareEdgeNeighbors[j].HasShapeType(neighborTypeEnum))
                        {
                            count++;
                        }
                        if (count >= minNeighborCount)
                        {
                            t.g_visited = true;
                            break;
                        }
                    }
                }
            }
            else
            {
                for (int i = 0; i < triangleList.Count; i++)
                {
                    EPMTriangle t     = (EPMTriangle)triangleList[i];
                    int         count = 0;
                    for (int j = 0; j < t.g_sharePointNeighbors.Count; j++)
                    {
                        if (t.g_sharePointNeighbors[j].HasShapeType(neighborTypeEnum))
                        {
                            count++;
                        }
                        if (count >= minNeighborCount)
                        {
                            t.g_visited = true;
                            break;
                        }
                    }
                }
            }

            for (int i = 0; i < triangleList.Count; i++)
            {
                EPMTriangle t = triangleList[i];
                if (t.g_visited)
                {
                    t.g_visited = false;
                    t.SetType(newTypeForPassCheck);
                    if (alsoSetPointsType)
                    {
                        t.g_pointList[0].g_type = newTypeForPassCheck;
                        t.g_pointList[1].g_type = newTypeForPassCheck;
                        t.g_pointList[2].g_type = newTypeForPassCheck;
                    }
                }
                else if (processNotPassChcek)
                {
                    t.SetType(newTypeForNotPassCheck);
                    if (alsoSetPointsType)
                    {
                        t.g_pointList[0].g_type = newTypeForNotPassCheck;
                        t.g_pointList[1].g_type = newTypeForNotPassCheck;
                        t.g_pointList[2].g_type = newTypeForNotPassCheck;
                    }
                }
            }
        }
Exemple #4
0
        public static void ExtractSide(EPMDelaunayTerrain terrain, EPMPoint.PointType oldType, EPMPoint.PointType sideType, double inLength = 2f)
        {
            List <EPMTriangle> list      = terrain.ExtractTriangles_ByTypes(null, EPMPoint.GenerateTypesInt(false, oldType));
            List <EPMPoint>    allPoints = terrain.ExtractPoints_All();
            List <EPMTriangle> sideList  = new List <EPMTriangle>();
            int groundEnum = EPMPoint.GetGroundEnums();

            for (int i = 0; i < list.Count; i++)
            {
                EPMTriangle t = (EPMTriangle)list[i];
                int         count = 0;
                int         ep1, ep2;
                ep1 = ep2 = 0;
                for (int j = 0; j < t.g_shareEdgeNeighbors.Count; j++)
                {
                    //The edge has an ground tile neighbor.
                    if (t.g_shareEdgeNeighbors[j].HasShapeType(groundEnum))
                    {
                        count++;
                        t.GetShareEdge((EPMTriangle)t.g_shareEdgeNeighbors[j], out ep1, out ep2);
                    }
                }

                if (count == 1)
                {
                    if (!t.g_visited)
                    {
                        sideList.Add(t);
                        t.g_visited = true;
                    }

                    int ep3 = t.g_sortedIndexList[0];
                    if (ep3 == ep1 || ep3 == ep2)
                    {
                        ep3 = t.g_sortedIndexList[1];
                    }
                    if (ep3 == ep1 || ep3 == ep2)
                    {
                        ep3 = t.g_sortedIndexList[2];
                    }

                    Vector2d p1, p2, p3;
                    p1 = allPoints[ep1].pos2d;
                    p2 = allPoints[ep2].pos2d;
                    p3 = allPoints[ep3].pos2d;

                    Vector2d dir    = p2 - p1;
                    Vector2d normal = new Vector2d(-dir.y, dir.x);
                    normal.Normalize();
                    if ((p3 - p1) * normal < 0)
                    {
                        normal = -normal;
                    }

                    for (int k = 0; k < t.g_shareEdgeNeighbors.Count; k++)
                    {
                        if (t.g_shareEdgeNeighbors[k].HasShapeType(oldType))
                        {
                            EPMTriangle nei = (EPMTriangle)t.g_shareEdgeNeighbors[k];
                            if (nei.g_visited == false)
                            {
                                nei.g_visited = true;
                                sideList.Add(nei);
                            }
                            for (int j = 0; j < nei.g_sharePointNeighbors.Count; j++)
                            {
                                EPMTriangle t2 = (EPMTriangle)nei.g_sharePointNeighbors[j];
                                if (t2.HasShapeType(oldType) && t2.g_visited == false)
                                {
                                    Vector2d v2  = t2.g_pointList[0].pos2d;
                                    double   dot = (v2 - p1) * normal;
                                    if (dot >= inLength)
                                    {
                                        continue;
                                    }

                                    v2  = t2.g_pointList[1].pos2d;
                                    dot = (v2 - p1) * normal;
                                    if (dot >= inLength)
                                    {
                                        continue;
                                    }

                                    v2  = t2.g_pointList[2].pos2d;
                                    dot = (v2 - p1) * normal;
                                    if (dot >= inLength)
                                    {
                                        continue;
                                    }

                                    t2.g_visited = true;
                                    sideList.Add((EPMTriangle)nei.g_sharePointNeighbors[j]);
                                }
                            }
                        }
                    }
                }
            }

            for (int i = 0; i < sideList.Count; i++)
            {
                sideList[i].SetType(sideType);
            }

            for (int i = 0; i < list.Count; i++)
            {
                EPMTriangle t = (EPMTriangle)list[i];
                if (t.HasShapeType(sideType))
                {
                    continue;
                }
                bool finded = true;
                for (int j = 0; j < t.g_shareEdgeNeighbors.Count; j++)
                {
                    if (t.g_shareEdgeNeighbors[j].HasShapeType(oldType))
                    {
                        finded = false;
                        break;
                    }
                }
                if (finded)
                {
                    t.SetType(sideType);
                }
            }

            for (int i = 0; i < list.Count; i++)
            {
                list[i].g_visited = false;
            }
        }
Exemple #5
0
        public void CreateSubMesh(List <EPMTriangle> triangleList, string name)
        {
            int pointsNum  = triangleList.Count * 3;
            int indicesNum = pointsNum;

            Vector3[] vertices     = new Vector3[pointsNum];
            int[]     indices      = new int[indicesNum];
            Vector2[] uvs          = new Vector2[pointsNum];
            int       currVertices = 0;
            int       currIndices  = 0;
            Vector2   uv           = new Vector2(0, 0);

            for (int i = 0; i < triangleList.Count; i++)
            {
                EPMTriangle t = triangleList[i];
                EPMPoint    p1, p2, p3;
                p1 = t.g_pointList[0];
                p2 = t.g_pointList[1];
                p3 = t.g_pointList[2];
                Vector3 v1 = new Vector3((float)p1.posX, (float)p1.posY, (float)p1.posZ);
                Vector3 v2 = new Vector3((float)p2.posX, (float)p2.posY, (float)p2.posZ);
                Vector3 v3 = new Vector3((float)p3.posX, (float)p3.posY, (float)p3.posZ);

                vertices[currVertices]     = v1;
                vertices[currVertices + 1] = v2;
                vertices[currVertices + 2] = v3;
                //Vector3 cross = Vector3.Cross(v3 - v1, v2 - v1);
                //if (Vector3.Dot(cross, Vector3.up) > 0)
                //{
                indices[currIndices]     = currVertices;
                indices[currIndices + 1] = currVertices + 2;
                indices[currIndices + 2] = currVertices + 1;
                //}
                //else
                //{
                //	indices[currIndices] = currVertices;
                //	indices[currIndices + 1] = currVertices + 1;
                //	indices[currIndices + 2] = currVertices + 2;
                //}

                uv = m_materialAgent.getUV(t.g_shapeType);

                uvs[currVertices]     = uv;
                uvs[currVertices + 1] = uv;
                uvs[currVertices + 2] = uv;

                currVertices += 3;
                currIndices  += 3;
            }

            GameObject obj  = new GameObject();
            Mesh       mesh = new Mesh();

            obj.transform.SetParent(m_meshRoot.transform);
            obj.name = name;
            obj.transform.localPosition    = Vector3.zero;
            obj.transform.localEulerAngles = Vector3.zero;
            obj.transform.localScale       = Vector3.one;
            mesh.vertices = vertices;
            mesh.SetIndices(indices, MeshTopology.Triangles, 0);
            mesh.uv = uvs;
            mesh.RecalculateNormals();
            obj.AddComponent <MeshFilter>().sharedMesh = mesh;
            MeshRenderer mr = obj.AddComponent <MeshRenderer>();

            mr.material          = m_materialAgent.mat;
            mr.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
            mr.receiveShadows    = false;
        }