From 6107ce973e5cd351e3d23b1f2e9e5628539977dc Mon Sep 17 00:00:00 2001 From: aozhiwei Date: Mon, 11 Jul 2022 17:36:52 +0800 Subject: [PATCH] 1 --- cpp/inputgeom.cc | 181 +++++++++++++++++++++++++---------------------- 1 file changed, 95 insertions(+), 86 deletions(-) diff --git a/cpp/inputgeom.cc b/cpp/inputgeom.cc index 268b9d5..2ee45b5 100644 --- a/cpp/inputgeom.cc +++ b/cpp/inputgeom.cc @@ -48,118 +48,127 @@ static void calcExtends(const BoundsItem* items, const int /*nitems*/, bmax[0] = items[imin].bmax[0]; bmax[1] = items[imin].bmax[1]; - for (int i = imin+1; i < imax; ++i) - { - const BoundsItem& it = items[i]; - if (it.bmin[0] < bmin[0]) bmin[0] = it.bmin[0]; - if (it.bmin[1] < bmin[1]) bmin[1] = it.bmin[1]; + for (int i = imin+1; i < imax; ++i) { + const BoundsItem& it = items[i]; + if (it.bmin[0] < bmin[0]) bmin[0] = it.bmin[0]; + if (it.bmin[1] < bmin[1]) bmin[1] = it.bmin[1]; - if (it.bmax[0] > bmax[0]) bmax[0] = it.bmax[0]; - if (it.bmax[1] > bmax[1]) bmax[1] = it.bmax[1]; - } + if (it.bmax[0] > bmax[0]) bmax[0] = it.bmax[0]; + if (it.bmax[1] > bmax[1]) bmax[1] = it.bmax[1]; + } } -static void subdivide(BoundsItem* items, int nitems, int imin, int imax, int trisPerChunk, - int& curNode, rcChunkyTriMeshNode* nodes, const int maxNodes, - int& curTri, int* outTris, const int* inTris) +static void subdivide(BoundsItem* items, + int nitems, + int imin, + int imax, + int trisPerChunk, + int& curNode, + rcChunkyTriMeshNode* nodes, + const int maxNodes, + int& curTri, + int* outTris, + const int* inTris) { int inum = imax - imin; int icur = curNode; - if (curNode > maxNodes) + if (curNode > maxNodes) { + abort(); return; + } rcChunkyTriMeshNode& node = nodes[curNode++]; - if (inum <= trisPerChunk) - { - // Leaf - calcExtends(items, nitems, imin, imax, node.bmin, node.bmax); + if (inum <= trisPerChunk) { + // Leaf + calcExtends(items, nitems, imin, imax, node.bmin, node.bmax); - // Copy triangles. - node.i = curTri; - node.n = inum; + // Copy triangles. + node.i = curTri; + node.n = inum; - for (int i = imin; i < imax; ++i) - { - const int* src = &inTris[items[i].i*3]; - int* dst = &outTris[curTri*3]; - curTri++; - dst[0] = src[0]; - dst[1] = src[1]; - dst[2] = src[2]; - } - } - else - { - // Split - calcExtends(items, nitems, imin, imax, node.bmin, node.bmax); + for (int i = imin; i < imax; ++i) { + const int* src = &inTris[items[i].i*3]; + int* dst = &outTris[curTri*3]; + curTri++; + dst[0] = src[0]; + dst[1] = src[1]; + dst[2] = src[2]; + } + } else { + // Split + calcExtends(items, nitems, imin, imax, node.bmin, node.bmax); - int axis = longestAxis(node.bmax[0] - node.bmin[0], - node.bmax[1] - node.bmin[1]); + int axis = longestAxis(node.bmax[0] - node.bmin[0], + node.bmax[1] - node.bmin[1]); - if (axis == 0) - { - // Sort along x-axis - qsort(items+imin, static_cast(inum), sizeof(BoundsItem), compareItemX); - } - else if (axis == 1) - { - // Sort along y-axis - qsort(items+imin, static_cast(inum), sizeof(BoundsItem), compareItemY); - } + if (axis == 0) { + // Sort along x-axis + qsort(items+imin, static_cast(inum), sizeof(BoundsItem), compareItemX); + } else if (axis == 1) { + // Sort along y-axis + qsort(items+imin, static_cast(inum), sizeof(BoundsItem), compareItemY); + } - int isplit = imin+inum/2; + int isplit = imin+inum/2; - // Left - subdivide(items, nitems, imin, isplit, trisPerChunk, curNode, nodes, maxNodes, curTri, outTris, inTris); - // Right - subdivide(items, nitems, isplit, imax, trisPerChunk, curNode, nodes, maxNodes, curTri, outTris, inTris); + // Left + subdivide(items, nitems, imin, isplit, trisPerChunk, curNode, nodes, maxNodes, curTri, outTris, inTris); + // Right + subdivide(items, nitems, isplit, imax, trisPerChunk, curNode, nodes, maxNodes, curTri, outTris, inTris); - int iescape = curNode - icur; - // Negative index means escape. - node.i = -iescape; - } + int iescape = curNode - icur; + // Negative index means escape. + node.i = -iescape; + } } -bool rcCreateChunkyTriMesh(const float* verts, const int* tris, int ntris, - int trisPerChunk, rcChunkyTriMesh* cm) +static bool rcCreateChunkyTriMesh(const float* verts, + const int* tris, + int ntris, + int trisPerChunk, + rcChunkyTriMesh* cm) { int nchunks = (ntris + trisPerChunk-1) / trisPerChunk; cm->nodes = new rcChunkyTriMeshNode[nchunks*4]; - if (!cm->nodes) + if (!cm->nodes) { + abort(); return false; + } cm->tris = new int[ntris*3]; - if (!cm->tris) + if (!cm->tris) { + abort(); return false; + } cm->ntris = ntris; // Build tree BoundsItem* items = new BoundsItem[ntris]; - if (!items) + if (!items) { + abort(); return false; + } - for (int i = 0; i < ntris; i++) - { - const int* t = &tris[i*3]; - BoundsItem& it = items[i]; - it.i = i; - // Calc triangle XZ bounds. - it.bmin[0] = it.bmax[0] = verts[t[0]*3+0]; - it.bmin[1] = it.bmax[1] = verts[t[0]*3+2]; - for (int j = 1; j < 3; ++j) - { - const float* v = &verts[t[j]*3]; - if (v[0] < it.bmin[0]) it.bmin[0] = v[0]; - if (v[2] < it.bmin[1]) it.bmin[1] = v[2]; + for (int i = 0; i < ntris; i++) { + const int* t = &tris[i*3]; + BoundsItem& it = items[i]; + it.i = i; + // Calc triangle XZ bounds. + it.bmin[0] = it.bmax[0] = verts[t[0]*3+0]; + it.bmin[1] = it.bmax[1] = verts[t[0]*3+2]; + for (int j = 1; j < 3; ++j) { + const float* v = &verts[t[j]*3]; + if (v[0] < it.bmin[0]) it.bmin[0] = v[0]; + if (v[2] < it.bmin[1]) it.bmin[1] = v[2]; - if (v[0] > it.bmax[0]) it.bmax[0] = v[0]; - if (v[2] > it.bmax[1]) it.bmax[1] = v[2]; - } - } + if (v[0] > it.bmax[0]) it.bmax[0] = v[0]; + if (v[2] > it.bmax[1]) it.bmax[1] = v[2]; + } + } int curTri = 0; int curNode = 0; @@ -171,14 +180,14 @@ bool rcCreateChunkyTriMesh(const float* verts, const int* tris, int ntris, // Calc max tris per node. cm->maxTrisPerChunk = 0; - for (int i = 0; i < cm->nnodes; ++i) - { - rcChunkyTriMeshNode& node = cm->nodes[i]; - const bool isLeaf = node.i >= 0; - if (!isLeaf) continue; - if (node.n > cm->maxTrisPerChunk) - cm->maxTrisPerChunk = node.n; - } + for (int i = 0; i < cm->nnodes; ++i) { + rcChunkyTriMeshNode& node = cm->nodes[i]; + const bool isLeaf = node.i >= 0; + if (!isLeaf) continue; + if (node.n > cm->maxTrisPerChunk) { + cm->maxTrisPerChunk = node.n; + } + } return true; } @@ -235,11 +244,11 @@ namespace f8 verts_.push_back(0); verts_.push_back(0); - verts_.push_back(height); + verts_.push_back(-height); verts_.push_back(width); verts_.push_back(0); - verts_.push_back(height); + verts_.push_back(-height); verts_.push_back(width); verts_.push_back(0);