Ejemplo n.º 1
0
        /// <summary>
        /// 根据高度图,重建三角面
        /// </summary>
        public bool RebuildTriangle(TerrainChunk chunk, TerrainMeshPool pool, ref TerrainMeshPool.MemoryFlag flag, int index)
        {
            if (groupInfo != null)
            {
                int value0 = groupInfo.CopyData[chunkIndex.v0Index];
                int value1 = groupInfo.CopyData[chunkIndex.v1Index];
                int value2 = groupInfo.CopyData[chunkIndex.v2Index];

                int valueSurface0 = groupInfo.CopySurfaceData[chunkIndex.v0Index];
                int valueSurface1 = groupInfo.CopySurfaceData[chunkIndex.v1Index];
                int valueSurface2 = groupInfo.CopySurfaceData[chunkIndex.v2Index];

                bool hasShowSurface = false;

                if (value0 != valueSurface0)
                {
                    hasShowSurface = true;
                }

                if (value1 != valueSurface1)
                {
                    hasShowSurface = true;
                }

                if (value2 != valueSurface2)
                {
                    hasShowSurface = true;
                }

                if (value0 == v0value && value1 == v1value && value2 == v2value && hasShowSurface == false)
                {
                    if (pool.vertticeIndex != verticesStart)
                    {
                        int det        = pool.vertticeIndex - verticesStart;
                        int indexCount = indicesCount;
                        for (int idx = 0; idx < indexCount; ++idx)
                        {
                            chunk.indicesAry[IndicesStart + idx] = chunk.indicesAry[IndicesStart + idx] + det;
                        }
                    }

                    if (flag.flagOldPoint == false)
                    {
                        flag.verticeOldStart = verticesStart;
                        flag.indiceOldStart  = IndicesStart;
                        flag.flagOldPoint    = true;
                    }
                    flag.verticeCount += verticesCount;
                    flag.indiceCount  += indicesCount;

                    verticesStart       = pool.vertticeIndex;
                    IndicesStart        = pool.IndicesIndex;
                    pool.IndicesIndex  += indicesCount;
                    pool.vertticeIndex += verticesCount;
                    return(false);
                }
                else
                {
                    v0value = value0;
                    v1value = value1;
                    v2value = value2;
                }

                float maxValue = (float)ushort.MaxValue;
                _v0.y = (value0 / maxValue) * groupInfo.worldSize.z;
                _v1.y = (value1 / maxValue) * groupInfo.worldSize.z;
                _v2.y = (value2 / maxValue) * groupInfo.worldSize.z;

                groupInfo.CalculateHeightFlag(chunkIndex.v0Index);
                groupInfo.CalculateHeightFlag(chunkIndex.v1Index);
                groupInfo.CalculateHeightFlag(chunkIndex.v2Index);

                /*if (hasShowSurface)
                 * {
                 *  colorConfig.testSurface = true;
                 * }*/

                buildTriangle(pool, _v0, _v1, _v2);

                // buildTriangle(pool, _v0, _v1, _v2);

                if (hasShowSurface)
                {
                    int minSurfaceValue = Mathf.Min(valueSurface0, valueSurface1, valueSurface2);
                    _v0.y = (minSurfaceValue / maxValue) * groupInfo.worldSize.z;
                    _v1.y = (minSurfaceValue / maxValue) * groupInfo.worldSize.z;
                    _v2.y = (minSurfaceValue / maxValue) * groupInfo.worldSize.z;
                    buildTriangle(pool, _v0, _v1, _v2);
                }
                //colorConfig.testSurface = false;
                return(true);
            }
            return(false);
        }
Ejemplo n.º 2
0
        public bool RebuildTriangle(TerrainChunk chunk, TerrainMeshPool pool, ref TerrainMeshPool.MemoryFlag flag, int boxindex)
        {
            int value0 = groupInfo.CopyData[v0Index];
            int value1 = groupInfo.CopyData[v1Index];
            int value2 = groupInfo.CopyData[v2Index];
            int value3 = groupInfo.CopyData[v3Index];

            int valueSurface0 = groupInfo.CopySurfaceData[v0Index];
            int valueSurface1 = groupInfo.CopySurfaceData[v1Index];
            int valueSurface2 = groupInfo.CopySurfaceData[v2Index];
            int valueSurface3 = groupInfo.CopySurfaceData[v3Index];

            int valueCull0 = groupInfo.copyCullfaceData[v0Index];
            int valueCull1 = groupInfo.copyCullfaceData[v1Index];
            int valueCull2 = groupInfo.copyCullfaceData[v2Index];
            int valueCull3 = groupInfo.copyCullfaceData[v3Index];


            bool hasShowSurface = false;

            if (value0 != valueSurface0)
            {
                hasShowSurface = true;
            }

            if (value1 != valueSurface1)
            {
                hasShowSurface = true;
            }

            if (value2 != valueSurface2)
            {
                hasShowSurface = true;
            }

            if (value3 != valueSurface3)
            {
                hasShowSurface = true;
            }

            bool hasCullFace = false;

            if (value0 != valueCull0)
            {
                hasCullFace = true;
            }

            if (value1 != valueCull1)
            {
                hasCullFace = true;
            }

            if (value2 != valueCull2)
            {
                hasCullFace = true;
            }

            if (value3 != valueCull3)
            {
                hasCullFace = true;
            }


            if (value0 == v0value && value1 == v1value && value2 == v2value && value3 == v3value && hasShowSurface == false && hasCullFace == false)
            {
                if (pool.vertticeIndex != verticesStart)
                {
                    int det        = pool.vertticeIndex - verticesStart;
                    int indexCount = indicesCount;
                    for (int idx = 0; idx < indexCount; ++idx)
                    {
                        chunk.indicesAry[IndicesStart + idx] = chunk.indicesAry[IndicesStart + idx] + det;
                    }
                }
                if (flag.flagOldPoint == false)
                {
                    flag.verticeOldStart = verticesStart;
                    flag.indiceOldStart  = IndicesStart;
                    flag.flagOldPoint    = true;
                }
                flag.verticeCount += verticesCount;
                flag.indiceCount  += indicesCount;

                verticesStart       = pool.vertticeIndex;
                IndicesStart        = pool.IndicesIndex;
                pool.IndicesIndex  += indicesCount;
                pool.vertticeIndex += verticesCount;
                return(false);
            }
            else
            {
                v0value = value0;
                v1value = value1;
                v2value = value2;
                v3value = value3;
            }

            float maxValue = (float)ushort.MaxValue;

            _v0.y = (value0 / maxValue) * groupInfo.worldSize.z;
            _v1.y = (value1 / maxValue) * groupInfo.worldSize.z;
            _v2.y = (value2 / maxValue) * groupInfo.worldSize.z;
            _v3.y = (value3 / maxValue) * groupInfo.worldSize.z;

            if (hasCullFace)
            {
                valueCull0 = (int)((valueCull0 / maxValue) * groupInfo.worldSize.z);
                valueCull1 = (int)((valueCull1 / maxValue) * groupInfo.worldSize.z);
                valueCull2 = (int)((valueCull2 / maxValue) * groupInfo.worldSize.z);
                valueCull3 = (int)((valueCull3 / maxValue) * groupInfo.worldSize.z);
            }

            verticesStart = pool.vertticeIndex;
            verticesCount = 0;
            IndicesStart  = pool.IndicesIndex;
            indicesCount  = 0;
            //Debug.Log (chunk.name +  v0Index + ":" + v1Index + ":" + v2Index + ":" + v3Index);

            /*switch (TestCode)
             *          {
             *          case 1:
             *                  {
             *                          colorConfig.testSurface = true;
             *                          colorConfig.Red.r = 255;
             *                          colorConfig.Red.b = 0;
             *                          colorConfig.Red.g = 0;
             *                  }break;
             *     case 2:
             *                  {
             *                          colorConfig.testSurface = true;
             *                          colorConfig.Red.r = 0;
             *                          colorConfig.Red.b = 0;
             *                          colorConfig.Red.g = 255;
             *                  }
             *                  break;
             *
             *          }
             *
             */
            groupInfo.CalculateHeightFlag(v0Index);
            groupInfo.CalculateHeightFlag(v1Index);
            groupInfo.CalculateHeightFlag(v2Index);
            groupInfo.CalculateHeightFlag(v3Index);

            //colorConfig.testSurface = hasCullFace;


            if (Mathf.Max(_v0.y, _v2.y) > Mathf.Max(_v1.y, _v3.y))
            {
                int CullFaca = -1;
                if (hasCullFace)
                {
                    CullFaca = Mathf.Max(valueCull0, valueCull1, valueCull3);
                }

                buildTriangleLeft(pool, _v0, _v1, _v3, CullFaca);
                if (hasCullFace)
                {
                    CullFaca = Mathf.Max(valueCull2, valueCull1, valueCull3);
                }
                buildTriangleLeft(pool, _v3, _v1, _v2, CullFaca);

                if (hasShowSurface)
                {
                    int minSurfaceValue = Mathf.Min(valueSurface0, valueSurface1, valueSurface3);
                    _v0.y = (minSurfaceValue / maxValue) * groupInfo.worldSize.z;
                    _v1.y = (minSurfaceValue / maxValue) * groupInfo.worldSize.z;
                    _v3.y = (minSurfaceValue / maxValue) * groupInfo.worldSize.z;
                    buildTriangleLeft(pool, _v0, _v1, _v3);
                    minSurfaceValue = Mathf.Min(valueSurface2, valueSurface1, valueSurface3);
                    _v2.y           = (minSurfaceValue / maxValue) * groupInfo.worldSize.z;
                    _v1.y           = (minSurfaceValue / maxValue) * groupInfo.worldSize.z;
                    _v3.y           = (minSurfaceValue / maxValue) * groupInfo.worldSize.z;
                    buildTriangleLeft(pool, _v3, _v1, _v2);
                }
            }
            else
            {
                int CullFaca = -1;
                if (hasCullFace)
                {
                    CullFaca = Mathf.Max(valueCull0, valueCull1, valueCull2);
                }
                buildTriangleLeft(pool, _v0, _v1, _v2, CullFaca);
                if (hasCullFace)
                {
                    CullFaca = Mathf.Max(valueCull0, valueCull2, valueCull3);
                }

                buildTriangleLeft(pool, _v0, _v2, _v3, CullFaca);

                if (hasShowSurface)
                {
                    int minSurfaceValue = Mathf.Min(valueSurface0, valueSurface1, valueSurface2);
                    _v0.y = (minSurfaceValue / maxValue) * groupInfo.worldSize.z;
                    _v1.y = (minSurfaceValue / maxValue) * groupInfo.worldSize.z;
                    _v2.y = (minSurfaceValue / maxValue) * groupInfo.worldSize.z;
                    buildTriangleLeft(pool, _v0, _v1, _v2);

                    minSurfaceValue = Mathf.Min(valueSurface0, valueSurface2, valueSurface3);
                    _v0.y           = (minSurfaceValue / maxValue) * groupInfo.worldSize.z;
                    _v2.y           = (minSurfaceValue / maxValue) * groupInfo.worldSize.z;
                    _v3.y           = (minSurfaceValue / maxValue) * groupInfo.worldSize.z;

                    buildTriangleLeft(pool, _v0, _v1, _v2);
                    buildTriangleLeft(pool, _v0, _v2, _v3);
                }
            }
            // colorConfig.testSurface = false;
            pool.vertticeIndex += verticesCount;
            pool.IndicesIndex  += indicesCount;

            return(true);
        }