diff --git a/source/common b/source/common index 8c9eadcdfdb5e5c8cd8dad0fd0eabb6e3fe0f00a..6ac114eeb7c088e7560e26475ad41f5aded8a047 160000 --- a/source/common +++ b/source/common @@ -1 +1 @@ -Subproject commit 8c9eadcdfdb5e5c8cd8dad0fd0eabb6e3fe0f00a +Subproject commit 6ac114eeb7c088e7560e26475ad41f5aded8a047 diff --git a/source/xcsg/BrushMesh.cpp b/source/xcsg/BrushMesh.cpp index b92d8af810e46a212bc6ca60db34d416fb8fbab5..6dee9556932889c26cded1887eff617601bd4b2e 100644 --- a/source/xcsg/BrushMesh.cpp +++ b/source/xcsg/BrushMesh.cpp @@ -64,7 +64,7 @@ void CBrushMesh::enable(bool yesNo) } } -void CBrushMesh::buildMesh(CMeshBuilder *pBuilder) +void CBrushMesh::buildMesh(CMeshBuilder *pBuilder, bool bOnlyComputeCounts) { Array<UINT> aSubsets(m_aMaterials.size()); fora(i, m_aMaterials) @@ -82,6 +82,14 @@ void CBrushMesh::buildMesh(CMeshBuilder *pBuilder) TextureInfo &texInfo = face.texInfo; Subset &subset = pBuilder->getSubset(aSubsets[texInfo.uMatId]); + if(bOnlyComputeCounts) + { + UINT uEdges = face.aEdges.size(); + subset.uVertexCount += uEdges; + subset.uIndexCount += (uEdges - 2) * 3; + continue; + } + bool isFirst = true; UINT uFirstIdx; UINT uNextIdx; @@ -161,7 +169,9 @@ void CBrushMesh::buildModel(bool bBuildPhysbox) } CMeshBuilder meshBuilder; - buildMesh(&meshBuilder); + buildMesh(&meshBuilder, true); + meshBuilder.allocArrays(); + buildMesh(&meshBuilder, false); // create model IXResourceManager *pRM = m_pCore->getResourceManager(); @@ -2399,6 +2409,16 @@ UINT CMeshBuilder::getSubsetIndexForMaterial(const char *szMat) return(idx); } +void CMeshBuilder::allocArrays() +{ + fora(i, m_aSubsets) + { + Subset &ss = m_aSubsets[i]; + ss.aIndices.reserve(ss.uIndexCount); + ss.aVertices.reserve(ss.uVertexCount); + } +} + UINT CMeshBuilder::getSubsetCount() { return(m_aMaterials.size()); diff --git a/source/xcsg/BrushMesh.h b/source/xcsg/BrushMesh.h index 352c664c13babbabdfd9b977f855d312d13e7bca..39f72d434e2938a725d9cc3558aa89daa86b2e68 100644 --- a/source/xcsg/BrushMesh.h +++ b/source/xcsg/BrushMesh.h @@ -34,6 +34,9 @@ struct Subset { Array<XResourceModelStaticVertex> aVertices; Array<UINT> aIndices; + + UINT uVertexCount = 0; + UINT uIndexCount = 0; }; class CMeshBuilder @@ -48,6 +51,8 @@ public: void buildResource(IXResourceModelStatic *pResource, UINT idx = UINT_MAX); + void allocArrays(); + private: Array<Subset> m_aSubsets; Array<String> m_aMaterials; @@ -101,7 +106,7 @@ public: bool findInternalFace(Array<float3_t> &aDest); bool fillInternalFace(const Array<float3_t> &aSrc); - void buildMesh(CMeshBuilder *pBuilder); + void buildMesh(CMeshBuilder *pBuilder, bool bOnlyComputeCounts); void buildPhysbox(IXResourceModel *pResource); void setFinalized(bool set); diff --git a/source/xcsg/Combiner.cpp b/source/xcsg/Combiner.cpp index 5ce45e31280fa73e5d34f79ce0d3b6bc1dc5a599..63f0cdad3a07a1f863b7805b74b76f4fcea61f17 100644 --- a/source/xcsg/Combiner.cpp +++ b/source/xcsg/Combiner.cpp @@ -33,7 +33,17 @@ void CCombiner::build() if(!aObjects[i]->getModel()) { hasObjects = true; - aObjects[i]->buildMesh(&meshBuilder); + aObjects[i]->buildMesh(&meshBuilder, true); + } + } + + meshBuilder.allocArrays(); + + fora(i, aObjects) + { + if(!aObjects[i]->getModel()) + { + aObjects[i]->buildMesh(&meshBuilder, false); aObjects[i]->buildPhysbox(pResource); } } diff --git a/source/xcsg/EditorModel.cpp b/source/xcsg/EditorModel.cpp index 273ae59f49a0fbd6f64bf562b16800db3234a4df..28fca2c72af565a15fc7f2217158bf330724e45c 100644 --- a/source/xcsg/EditorModel.cpp +++ b/source/xcsg/EditorModel.cpp @@ -60,7 +60,14 @@ void XMETHODCALLTYPE CEditorModel::getResource(IXResourceModel **ppOut) CMeshBuilder meshBuilder; fora(i, m_aObjects) { - m_aObjects[i]->buildMesh(&meshBuilder); + m_aObjects[i]->buildMesh(&meshBuilder, true); + } + + meshBuilder.allocArrays(); + + fora(i, m_aObjects) + { + m_aObjects[i]->buildMesh(&meshBuilder, false); m_aObjects[i]->buildPhysbox(pResource); } diff --git a/source/xcsg/EditorObject.cpp b/source/xcsg/EditorObject.cpp index 1ff89234361bfa37c2bc648d36d39f0b4de0bf33..47fcd5fd42c778cf08088ea9119d1dd30eb6b4f8 100644 --- a/source/xcsg/EditorObject.cpp +++ b/source/xcsg/EditorObject.cpp @@ -691,11 +691,11 @@ void CEditorObject::removeBrush(UINT idx) m_aBrushes.erase(idx); } -void CEditorObject::buildMesh(CMeshBuilder *pBuilder) +void CEditorObject::buildMesh(CMeshBuilder *pBuilder, bool bOnlyComputeCounts) { fora(i, m_aBrushes) { - m_aBrushes[i]->buildMesh(pBuilder); + m_aBrushes[i]->buildMesh(pBuilder, bOnlyComputeCounts); } } diff --git a/source/xcsg/EditorObject.h b/source/xcsg/EditorObject.h index 938a3fb44a0f6f5a1e8dc9628d944015c03df351..365cf5c270ff22c3825f22d3c32552af246cba47 100644 --- a/source/xcsg/EditorObject.h +++ b/source/xcsg/EditorObject.h @@ -103,7 +103,7 @@ public: return(m_pModel); } - void buildMesh(CMeshBuilder *pBuilder); + void buildMesh(CMeshBuilder *pBuilder, bool bOnlyComputeCounts); void buildPhysbox(IXResourceModel *pResource); bool isRemoved()