/// <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); }
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); }