From 15740faf9fe9fe4be08965098bbf2947e096aeeb Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 14 Aug 2019 22:50:43 +0800 Subject: +Unity Runtime code --- Runtime/Terrain/TerrainIndexGenerator.cpp | 379 ++++++++++++++++++++++++++++++ 1 file changed, 379 insertions(+) create mode 100644 Runtime/Terrain/TerrainIndexGenerator.cpp (limited to 'Runtime/Terrain/TerrainIndexGenerator.cpp') diff --git a/Runtime/Terrain/TerrainIndexGenerator.cpp b/Runtime/Terrain/TerrainIndexGenerator.cpp new file mode 100644 index 0000000..bcbc8d3 --- /dev/null +++ b/Runtime/Terrain/TerrainIndexGenerator.cpp @@ -0,0 +1,379 @@ +#include "UnityPrefix.h" +#include "TerrainIndexGenerator.h" + +#if ENABLE_TERRAIN + +#include "Runtime/Graphics/TriStripper.h" +#include "Runtime/Filters/Mesh/LodMesh.h" +#include "Runtime/Terrain/Heightmap.h" + +static unsigned int AddSliverTriangles (unsigned int *triangles, unsigned int index, int direction, int edgeMask); +static unsigned int AddSliverCorner (unsigned int* triangles, unsigned int index, int direction, int edgeMask); +static void FlipTriangle (unsigned int *triangles, unsigned int index); +static unsigned int AddQuad (unsigned int *triangles, unsigned int index, int xBase, int yBase); + + +struct CachedStrip { + unsigned int count; + unsigned short* triangles; + + CachedStrip() {count = 0; triangles = NULL;} + ~CachedStrip() { if(triangles) delete[] triangles;} +}; + +static CachedStrip gCachedStrips[16]; + +unsigned int *TerrainIndexGenerator::GetIndexBuffer (int edgeMask, unsigned int &count, int stride) +{ + unsigned int *triangles = new unsigned int[(kPatchSize) * (kPatchSize) * 6]; + unsigned int index = 0; + int size = kPatchSize; + + int minX = 0; + int minY = 0; + int maxX = kPatchSize-1; + int maxY = kPatchSize-1; + + if((edgeMask & kDirectionLeftFlag) == 0) + { + minX+=1; + index = AddSliverTriangles (triangles, index, kDirectionLeft, edgeMask); + } + if((edgeMask & kDirectionRightFlag) == 0) + { + maxX-=1; + index = AddSliverTriangles (triangles, index, kDirectionRight, edgeMask); + } + if((edgeMask & kDirectionUpFlag) == 0) + { + maxY-=1; + index = AddSliverTriangles (triangles, index, kDirectionUp, edgeMask); + } + if((edgeMask & kDirectionDownFlag) == 0) + { + minY+=1; + index = AddSliverTriangles (triangles, index, kDirectionDown, edgeMask); + } + + if((edgeMask & kDirectionLeftFlag) == 0 || (edgeMask & kDirectionUpFlag) == 0) + index = AddSliverCorner (triangles, index, kDirectionLeftUp, edgeMask); + if((edgeMask & kDirectionRightFlag) == 0 || (edgeMask & kDirectionUpFlag) == 0) + index = AddSliverCorner (triangles, index, kDirectionRightUp, edgeMask); + if((edgeMask & kDirectionLeftFlag) == 0 || (edgeMask & kDirectionDownFlag) == 0) + index = AddSliverCorner (triangles, index, kDirectionLeftDown, edgeMask); + if((edgeMask & kDirectionRightFlag) == 0 || (edgeMask & kDirectionDownFlag) == 0) + index = AddSliverCorner (triangles, index, kDirectionRightDown, edgeMask); + + for (int y=minY;y