Repository navigation
Expand file tree
/
Copy pathBoneVisibilityMaskProbe.cpp
More file actions
39 lines (39 loc) · 2.32 KB
/
Copy pathBoneVisibilityMaskProbe.cpp
File metadata and controls
39 lines (39 loc) · 2.32 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "BoneVisibilityMask.h"
#include <array>
#include <cstdio>
using namespace BoneVisibilityMask;
#define CHECK(x) do{if(!(x)){std::printf("FAIL line %d: %s\n",__LINE__,#x);return 1;}}while(0)
int main(){
// Head, face and head attachments are hidden; neck, shoulders and weapon
// attachments remain visible, even when child IDs precede their parents.
int parents[]{-1,0,1,2,5,3,5,6,3,8};unsigned char mask[10]{};
CHECK(HeadSubtree(parents,10,5,mask));
CHECK(!mask[0]&&!mask[1]&&!mask[2]&&!mask[3]&&!mask[8]&&!mask[9]);
CHECK(mask[4]&&mask[5]&&mask[6]&&mask[7]);
CHECK(!HeadSubtree(parents,10,-1,mask));CHECK(!HeadSubtree(parents,10,10,mask));
int cycle[]{-1,2,1};CHECK(!HeadSubtree(cycle,3,1,mask));
int unrelatedCycle[]{-1,0,3,2};CHECK(!HeadSubtree(unrelatedCycle,4,1,mask));
int invalid[]{-1,4};CHECK(!HeadSubtree(invalid,2,1,mask));
int invalidRoot[]{-2};CHECK(!HeadSubtree(invalidRoot,1,0,mask));
std::array<int,MaxBones> chain{};std::array<unsigned char,MaxBones> selected{};
for(unsigned i=0;i<MaxBones;++i)chain[i]=int(i)-1;
CHECK(HeadSubtree(chain.data(),MaxBones,MaxBones-2,selected.data()));
CHECK(!selected[MaxBones-3]&&selected[MaxBones-2]&&selected[MaxBones-1]);
CHECK(!HeadSubtree(chain.data(),MaxBones+1,0,selected.data()));
CHECK(!HeadSubtree(nullptr,1,0,mask));CHECK(!HeadSubtree(parents,0,0,mask));
// Restore the previous head flags without unhiding unrelated body bones,
// including native visibility changes made while first person was active.
unsigned char chosen[]{0,1,1,0},original[]{1,1,0,1},current[]{1,1,0,1};
CHECK(Apply(chosen,4,current));CHECK(current[0]&& !current[1]&& !current[2]&¤t[3]);
CHECK(!Apply(chosen,4,current));
auto restored=Restore(chosen,original,4,current);
CHECK(restored.unchanged&&restored.changed&¤t[1]&&!current[2]);
CHECK(Apply(chosen,4,current));current[3]=0;
restored=Restore(chosen,original,4,current);
CHECK(!restored.unchanged&&restored.changed&¤t[1]&&!current[2]&&!current[3]);
// A native change to a head flag also keeps the array explicit.
CHECK(Apply(chosen,4,current));current[2]=1;
restored=Restore(chosen,original,4,current);
CHECK(!restored.unchanged&¤t[1]&¤t[2]);
std::puts("Bone visibility hierarchy and restoration checks passed");return 0;
}