Skip to content

Commit d7c497e

Browse files
committed
Added nVerts parameter to OptimizeFaces
1 parent b08a540 commit d7c497e

File tree

4 files changed

+66
-42
lines changed

4 files changed

+66
-42
lines changed

DirectXMesh/DirectXMesh.h

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -426,48 +426,48 @@ namespace DirectX
426426
};
427427

428428
DIRECTX_MESH_API HRESULT __cdecl OptimizeFaces(
429-
_In_reads_(nFaces * 3) const uint16_t* indices, _In_ size_t nFaces,
429+
_In_reads_(nFaces * 3) const uint16_t* indices, _In_ size_t nFaces, _In_ size_t nVerts,
430430
_In_reads_(nFaces * 3) const uint32_t* adjacency,
431431
_Out_writes_(nFaces) uint32_t* faceRemap,
432432
_In_ uint32_t vertexCache = OPTFACES_V_DEFAULT,
433433
_In_ uint32_t restart = OPTFACES_R_DEFAULT);
434434
DIRECTX_MESH_API HRESULT __cdecl OptimizeFaces(
435-
_In_reads_(nFaces * 3) const uint32_t* indices, _In_ size_t nFaces,
435+
_In_reads_(nFaces * 3) const uint32_t* indices, _In_ size_t nFaces, _In_ size_t nVerts,
436436
_In_reads_(nFaces * 3) const uint32_t* adjacency,
437437
_Out_writes_(nFaces) uint32_t* faceRemap,
438438
_In_ uint32_t vertexCache = OPTFACES_V_DEFAULT,
439439
_In_ uint32_t restart = OPTFACES_R_DEFAULT);
440440
DIRECTX_MESH_API HRESULT __cdecl OptimizeFacesLRU(
441-
_In_reads_(nFaces * 3) const uint16_t* indices, _In_ size_t nFaces,
441+
_In_reads_(nFaces * 3) const uint16_t* indices, _In_ size_t nFaces, _In_ size_t nVerts,
442442
_Out_writes_(nFaces) uint32_t* faceRemap,
443443
_In_ uint32_t lruCacheSize = OPTFACES_LRU_DEFAULT);
444444
DIRECTX_MESH_API HRESULT __cdecl OptimizeFacesLRU(
445-
_In_reads_(nFaces * 3) const uint32_t* indices, _In_ size_t nFaces,
445+
_In_reads_(nFaces * 3) const uint32_t* indices, _In_ size_t nFaces, _In_ size_t nVerts,
446446
_Out_writes_(nFaces) uint32_t* faceRemap,
447447
_In_ uint32_t lruCacheSize = OPTFACES_LRU_DEFAULT);
448448
// Reorders faces to increase hit rate of vertex caches
449449

450450
DIRECTX_MESH_API HRESULT __cdecl OptimizeFacesEx(
451-
_In_reads_(nFaces * 3) const uint16_t* indices, _In_ size_t nFaces,
451+
_In_reads_(nFaces * 3) const uint16_t* indices, _In_ size_t nFaces, _In_ size_t nVerts,
452452
_In_reads_(nFaces * 3) const uint32_t* adjacency,
453453
_In_reads_(nFaces) const uint32_t* attributes,
454454
_Out_writes_(nFaces) uint32_t* faceRemap,
455455
_In_ uint32_t vertexCache = OPTFACES_V_DEFAULT,
456456
_In_ uint32_t restart = OPTFACES_R_DEFAULT);
457457
DIRECTX_MESH_API HRESULT __cdecl OptimizeFacesEx(
458-
_In_reads_(nFaces * 3) const uint32_t* indices, _In_ size_t nFaces,
458+
_In_reads_(nFaces * 3) const uint32_t* indices, _In_ size_t nFaces, _In_ size_t nVerts,
459459
_In_reads_(nFaces * 3) const uint32_t* adjacency,
460460
_In_reads_(nFaces) const uint32_t* attributes,
461461
_Out_writes_(nFaces) uint32_t* faceRemap,
462462
_In_ uint32_t vertexCache = OPTFACES_V_DEFAULT,
463463
_In_ uint32_t restart = OPTFACES_R_DEFAULT);
464464
DIRECTX_MESH_API HRESULT __cdecl OptimizeFacesLRUEx(
465-
_In_reads_(nFaces * 3) const uint16_t* indices, _In_ size_t nFaces,
465+
_In_reads_(nFaces * 3) const uint16_t* indices, _In_ size_t nFaces, _In_ size_t nVerts,
466466
_In_reads_(nFaces) const uint32_t* attributes,
467467
_Out_writes_(nFaces) uint32_t* faceRemap,
468468
_In_ uint32_t lruCacheSize = OPTFACES_LRU_DEFAULT);
469469
DIRECTX_MESH_API HRESULT __cdecl OptimizeFacesLRUEx(
470-
_In_reads_(nFaces * 3) const uint32_t* indices, _In_ size_t nFaces,
470+
_In_reads_(nFaces * 3) const uint32_t* indices, _In_ size_t nFaces, _In_ size_t nVerts,
471471
_In_reads_(nFaces) const uint32_t* attributes,
472472
_Out_writes_(nFaces) uint32_t* faceRemap,
473473
_In_ uint32_t lruCacheSize = OPTFACES_LRU_DEFAULT);

DirectXMesh/DirectXMeshOptimizeLRU.cpp

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,7 @@ namespace
194194

195195
template <typename IndexType>
196196
HRESULT OptimizeFacesImpl(
197-
_In_reads_(indexCount) const IndexType* indexList, uint32_t indexCount,
197+
_In_reads_(indexCount) const IndexType* indexList, uint32_t indexCount, size_t nVerts,
198198
_Out_writes_(indexCount / 3) uint32_t* faceRemap, uint32_t lruCacheSize, uint32_t offset)
199199
{
200200
std::unique_ptr<OptimizeVertexData<IndexType>[]> vertexDataList(new (std::nothrow) OptimizeVertexData<IndexType>[indexCount]);
@@ -245,6 +245,9 @@ namespace
245245
continue;
246246
}
247247

248+
if (indexList[idx] >= nVerts)
249+
return E_INVALIDARG;
250+
248251
if (!i || first || sortFunc(indexSorted[i - 1], idx))
249252
{
250253
// it's not a duplicate
@@ -510,10 +513,11 @@ _Use_decl_annotations_
510513
HRESULT DirectX::OptimizeFacesLRU(
511514
const uint16_t* indices,
512515
size_t nFaces,
516+
size_t nVerts,
513517
uint32_t* faceRemap,
514518
uint32_t lruCacheSize)
515519
{
516-
if (!indices || !nFaces || !faceRemap)
520+
if (!indices || !nFaces || !nVerts || !faceRemap)
517521
return E_INVALIDARG;
518522

519523
if (!lruCacheSize || lruCacheSize > kMaxVertexCacheSize)
@@ -528,17 +532,18 @@ HRESULT DirectX::OptimizeFacesLRU(
528532
std::call_once(s_initOnce, ComputeVertexScores);
529533
#endif
530534

531-
return OptimizeFacesImpl<uint16_t>(indices, static_cast<uint32_t>(nFaces * 3), faceRemap, lruCacheSize, 0);
535+
return OptimizeFacesImpl<uint16_t>(indices, static_cast<uint32_t>(nFaces * 3), nVerts, faceRemap, lruCacheSize, 0);
532536
}
533537

534538
_Use_decl_annotations_
535539
HRESULT DirectX::OptimizeFacesLRU(
536540
const uint32_t* indices,
537541
size_t nFaces,
542+
size_t nVerts,
538543
uint32_t* faceRemap,
539544
uint32_t lruCacheSize)
540545
{
541-
if (!indices || !nFaces || !faceRemap)
546+
if (!indices || !nFaces || !nVerts || !faceRemap)
542547
return E_INVALIDARG;
543548

544549
if (!lruCacheSize || lruCacheSize > kMaxVertexCacheSize)
@@ -553,7 +558,7 @@ HRESULT DirectX::OptimizeFacesLRU(
553558
std::call_once(s_initOnce, ComputeVertexScores);
554559
#endif
555560

556-
return OptimizeFacesImpl<uint32_t>(indices, static_cast<uint32_t>(nFaces * 3), faceRemap, lruCacheSize, 0);
561+
return OptimizeFacesImpl<uint32_t>(indices, static_cast<uint32_t>(nFaces * 3), nVerts, faceRemap, lruCacheSize, 0);
557562
}
558563

559564

@@ -562,11 +567,12 @@ _Use_decl_annotations_
562567
HRESULT DirectX::OptimizeFacesLRUEx(
563568
const uint16_t* indices,
564569
size_t nFaces,
570+
size_t nVerts,
565571
const uint32_t* attributes,
566572
uint32_t* faceRemap,
567573
uint32_t lruCacheSize)
568574
{
569-
if (!indices || !nFaces || !attributes || !faceRemap)
575+
if (!indices || !nFaces || !nVerts || !attributes || !faceRemap)
570576
return E_INVALIDARG;
571577

572578
if (!lruCacheSize || lruCacheSize > kMaxVertexCacheSize)
@@ -602,7 +608,7 @@ HRESULT DirectX::OptimizeFacesLRUEx(
602608
return E_UNEXPECTED;
603609

604610
HRESULT hr = OptimizeFacesImpl<uint16_t>(
605-
&indices[it.first * 3], static_cast<uint32_t>(it.second * 3),
611+
&indices[it.first * 3], static_cast<uint32_t>(it.second * 3), nVerts,
606612
&faceRemap[it.first], lruCacheSize, uint32_t(it.first));
607613
if (FAILED(hr))
608614
return hr;
@@ -615,11 +621,12 @@ _Use_decl_annotations_
615621
HRESULT DirectX::OptimizeFacesLRUEx(
616622
const uint32_t* indices,
617623
size_t nFaces,
624+
size_t nVerts,
618625
const uint32_t* attributes,
619626
uint32_t* faceRemap,
620627
uint32_t lruCacheSize)
621628
{
622-
if (!indices || !nFaces || !attributes || !faceRemap)
629+
if (!indices || !nFaces || !nVerts || !attributes || !faceRemap)
623630
return E_INVALIDARG;
624631

625632
if (!lruCacheSize || lruCacheSize > kMaxVertexCacheSize)
@@ -655,7 +662,7 @@ HRESULT DirectX::OptimizeFacesLRUEx(
655662
return E_UNEXPECTED;
656663

657664
HRESULT hr = OptimizeFacesImpl<uint32_t>(
658-
&indices[it.first * 3], static_cast<uint32_t>(it.second * 3),
665+
&indices[it.first * 3], static_cast<uint32_t>(it.second * 3), nVerts,
659666
&faceRemap[it.first], lruCacheSize, uint32_t(it.first));
660667
if (FAILED(hr))
661668
return hr;

DirectXMesh/DirectXMeshOptimizeTVC.cpp

Lines changed: 38 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,9 @@ namespace
3131
{}
3232

3333
HRESULT initialize(
34-
_In_reads_(nFaces * 3) const index_t* indices, size_t nFaces,
34+
_In_reads_(nFaces * 3) const index_t* indices,
35+
size_t nFaces,
36+
size_t nVerts,
3537
_In_reads_(nFaces * 3) const uint32_t* adjacency,
3638
const std::vector<std::pair<size_t, size_t>>& subsets)
3739
{
@@ -74,7 +76,13 @@ namespace
7476
index_t i1 = indices[face * 3 + 1];
7577
index_t i2 = indices[face * 3 + 2];
7678

77-
if (i0 == index_t(-1)
79+
if ((i0 != index_t(-1) && i0 >= nVerts)
80+
|| (i1 != index_t(-1) && i1 >= nVerts)
81+
|| (i2 != index_t(-1) && i2 >= nVerts))
82+
{
83+
return E_UNEXPECTED;
84+
}
85+
else if (i0 == index_t(-1)
7886
|| i1 == index_t(-1)
7987
|| i2 == index_t(-1)
8088
|| i0 == i1
@@ -163,7 +171,7 @@ namespace
163171
}
164172

165173
HRESULT setSubset(
166-
_In_reads_(nFaces * 3) const index_t* indices, size_t nFaces,
174+
_In_reads_(nFaces * 3) const index_t* indices, size_t nFaces, size_t nVerts,
167175
size_t faceOffset, size_t faceCount) noexcept
168176
{
169177
if (!indices || !mListElements)
@@ -202,6 +210,11 @@ namespace
202210
continue;
203211
}
204212

213+
if (i0 >= nVerts
214+
|| i1 >= nVerts
215+
|| i2 >= nVerts)
216+
return E_UNEXPECTED;
217+
205218
uint32_t unprocessed = 0;
206219

207220
for (uint32_t n = 0; n < 3; ++n)
@@ -508,7 +521,7 @@ namespace
508521
//---------------------------------------------------------------------------------
509522
template<class index_t>
510523
HRESULT StripReorderImpl(
511-
_In_reads_(nFaces * 3) const index_t* indices, _In_ size_t nFaces,
524+
_In_reads_(nFaces * 3) const index_t* indices, _In_ size_t nFaces, _In_ size_t nVerts,
512525
_In_reads_(nFaces * 3) const uint32_t* adjacency,
513526
_In_reads_opt_(nFaces) const uint32_t* attributes,
514527
_Out_writes_(nFaces) uint32_t* faceRemap)
@@ -518,7 +531,7 @@ namespace
518531
return E_UNEXPECTED;
519532

520533
mesh_status<index_t> status;
521-
HRESULT hr = status.initialize(indices, nFaces, adjacency, subsets);
534+
HRESULT hr = status.initialize(indices, nFaces, nVerts, adjacency, subsets);
522535
if (FAILED(hr))
523536
return hr;
524537

@@ -530,7 +543,7 @@ namespace
530543

531544
for (const auto& it : subsets)
532545
{
533-
hr = status.setSubset(indices, nFaces, it.first, it.second);
546+
hr = status.setSubset(indices, nFaces, nVerts, it.first, it.second);
534547
if (FAILED(hr))
535548
return hr;
536549

@@ -585,7 +598,7 @@ namespace
585598
//---------------------------------------------------------------------------------
586599
template<class index_t>
587600
HRESULT VertexCacheStripReorderImpl(
588-
_In_reads_(nFaces * 3) const index_t* indices, _In_ size_t nFaces,
601+
_In_reads_(nFaces * 3) const index_t* indices, _In_ size_t nFaces, _In_ size_t nVerts,
589602
_In_reads_(nFaces * 3) const uint32_t* adjacency,
590603
_In_reads_opt_(nFaces) const uint32_t* attributes,
591604
_Out_writes_(nFaces) uint32_t* faceRemap,
@@ -596,7 +609,7 @@ namespace
596609
return E_UNEXPECTED;
597610

598611
mesh_status<index_t> status;
599-
HRESULT hr = status.initialize(indices, nFaces, adjacency, subsets);
612+
HRESULT hr = status.initialize(indices, nFaces, nVerts, adjacency, subsets);
600613
if (FAILED(hr))
601614
return hr;
602615

@@ -616,7 +629,7 @@ namespace
616629

617630
for (const auto& it : subsets)
618631
{
619-
hr = status.setSubset(indices, nFaces, it.first, it.second);
632+
hr = status.setSubset(indices, nFaces, nVerts, it.first, it.second);
620633
if (FAILED(hr))
621634
return hr;
622635

@@ -771,55 +784,57 @@ _Use_decl_annotations_
771784
HRESULT DirectX::OptimizeFaces(
772785
const uint16_t* indices,
773786
size_t nFaces,
787+
size_t nVerts,
774788
const uint32_t* adjacency,
775789
uint32_t* faceRemap,
776790
uint32_t vertexCache,
777791
uint32_t restart)
778792
{
779-
if (!indices || !nFaces || !adjacency || !faceRemap)
793+
if (!indices || !nFaces || !nVerts || !adjacency || !faceRemap)
780794
return E_INVALIDARG;
781795

782796
if ((uint64_t(nFaces) * 3) >= UINT32_MAX)
783797
return HRESULT_E_ARITHMETIC_OVERFLOW;
784798

785799
if (vertexCache == OPTFACES_V_STRIPORDER)
786800
{
787-
return StripReorderImpl<uint16_t>(indices, nFaces, adjacency, nullptr, faceRemap);
801+
return StripReorderImpl<uint16_t>(indices, nFaces, nVerts, adjacency, nullptr, faceRemap);
788802
}
789803
else
790804
{
791805
if (restart > vertexCache)
792806
return E_INVALIDARG;
793807

794-
return VertexCacheStripReorderImpl<uint16_t>(indices, nFaces, adjacency, nullptr, faceRemap, vertexCache, restart);
808+
return VertexCacheStripReorderImpl<uint16_t>(indices, nFaces, nVerts, adjacency, nullptr, faceRemap, vertexCache, restart);
795809
}
796810
}
797811

798812
_Use_decl_annotations_
799813
HRESULT DirectX::OptimizeFaces(
800814
const uint32_t* indices,
801815
size_t nFaces,
816+
size_t nVerts,
802817
const uint32_t* adjacency,
803818
uint32_t* faceRemap,
804819
uint32_t vertexCache,
805820
uint32_t restart)
806821
{
807-
if (!indices || !nFaces || !adjacency || !faceRemap)
822+
if (!indices || !nFaces || !nVerts || !adjacency || !faceRemap)
808823
return E_INVALIDARG;
809824

810825
if ((uint64_t(nFaces) * 3) >= UINT32_MAX)
811826
return HRESULT_E_ARITHMETIC_OVERFLOW;
812827

813828
if (vertexCache == OPTFACES_V_STRIPORDER)
814829
{
815-
return StripReorderImpl<uint32_t>(indices, nFaces, adjacency, nullptr, faceRemap);
830+
return StripReorderImpl<uint32_t>(indices, nFaces, nVerts, adjacency, nullptr, faceRemap);
816831
}
817832
else
818833
{
819834
if (restart > vertexCache)
820835
return E_INVALIDARG;
821836

822-
return VertexCacheStripReorderImpl<uint32_t>(indices, nFaces, adjacency, nullptr, faceRemap, vertexCache, restart);
837+
return VertexCacheStripReorderImpl<uint32_t>(indices, nFaces, nVerts, adjacency, nullptr, faceRemap, vertexCache, restart);
823838
}
824839
}
825840

@@ -829,56 +844,58 @@ _Use_decl_annotations_
829844
HRESULT DirectX::OptimizeFacesEx(
830845
const uint16_t* indices,
831846
size_t nFaces,
847+
size_t nVerts,
832848
const uint32_t* adjacency,
833849
const uint32_t* attributes,
834850
uint32_t* faceRemap,
835851
uint32_t vertexCache,
836852
uint32_t restart)
837853
{
838-
if (!indices || !nFaces || !adjacency || !attributes || !faceRemap)
854+
if (!indices || !nFaces || !nVerts || !adjacency || !attributes || !faceRemap)
839855
return E_INVALIDARG;
840856

841857
if ((uint64_t(nFaces) * 3) >= UINT32_MAX)
842858
return HRESULT_E_ARITHMETIC_OVERFLOW;
843859

844860
if (vertexCache == OPTFACES_V_STRIPORDER)
845861
{
846-
return StripReorderImpl<uint16_t>(indices, nFaces, adjacency, attributes, faceRemap);
862+
return StripReorderImpl<uint16_t>(indices, nFaces, nVerts, adjacency, attributes, faceRemap);
847863
}
848864
else
849865
{
850866
if (restart > vertexCache)
851867
return E_INVALIDARG;
852868

853-
return VertexCacheStripReorderImpl<uint16_t>(indices, nFaces, adjacency, attributes, faceRemap, vertexCache, restart);
869+
return VertexCacheStripReorderImpl<uint16_t>(indices, nFaces, nVerts, adjacency, attributes, faceRemap, vertexCache, restart);
854870
}
855871
}
856872

857873
_Use_decl_annotations_
858874
HRESULT DirectX::OptimizeFacesEx(
859875
const uint32_t* indices,
860876
size_t nFaces,
877+
size_t nVerts,
861878
const uint32_t* adjacency,
862879
const uint32_t* attributes,
863880
uint32_t* faceRemap,
864881
uint32_t vertexCache,
865882
uint32_t restart)
866883
{
867-
if (!indices || !nFaces || !adjacency || !attributes || !faceRemap)
884+
if (!indices || !nFaces || !nVerts || !adjacency || !attributes || !faceRemap)
868885
return E_INVALIDARG;
869886

870887
if ((uint64_t(nFaces) * 3) >= UINT32_MAX)
871888
return HRESULT_E_ARITHMETIC_OVERFLOW;
872889

873890
if (vertexCache == OPTFACES_V_STRIPORDER)
874891
{
875-
return StripReorderImpl<uint32_t>(indices, nFaces, adjacency, attributes, faceRemap);
892+
return StripReorderImpl<uint32_t>(indices, nFaces, nVerts, adjacency, attributes, faceRemap);
876893
}
877894
else
878895
{
879896
if (restart > vertexCache)
880897
return E_INVALIDARG;
881898

882-
return VertexCacheStripReorderImpl<uint32_t>(indices, nFaces, adjacency, attributes, faceRemap, vertexCache, restart);
899+
return VertexCacheStripReorderImpl<uint32_t>(indices, nFaces, nVerts, adjacency, attributes, faceRemap, vertexCache, restart);
883900
}
884901
}

0 commit comments

Comments
 (0)