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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// SPDX-License-Identifier: BSD-3-Clause
// Copyright (c) 2026 Fernando Sahmkow
#include <whiteout/models/wem/materials/looks.h>
#include <whiteout/models/wem/materials/material.h>
namespace whiteout {
namespace models {
namespace wem {
// ============================================================================
// NativeSync
// ============================================================================
const char* ToString(NativeSync sync) {
switch (sync) {
case NativeSync::Absent:
return "absent";
case NativeSync::InSync:
return "in_sync";
case NativeSync::NativeAuthoritative:
return "native_authoritative";
case NativeSync::CommonEdited:
return "common_edited";
}
return "invalid";
}
// ============================================================================
// Material
// ============================================================================
CommonMaterial& Material::MutableCommon() {
// Both transitions, not just the InSync one: an edit to a lossy view still
// makes the view the newest truth.
if (sync_ == NativeSync::InSync || sync_ == NativeSync::NativeAuthoritative) {
sync_ = NativeSync::CommonEdited;
}
return common_;
}
void Material::SetNativeInSync(NativeMaterial native) {
native_ = std::move(native);
sync_ = hasNative() ? NativeSync::InSync : NativeSync::Absent;
}
void Material::SetNativeAuthoritative(NativeMaterial native) {
native_ = std::move(native);
sync_ = hasNative() ? NativeSync::NativeAuthoritative : NativeSync::Absent;
}
void Material::ClearNative() {
native_ = NativeMaterial{};
sync_ = NativeSync::Absent;
}
// ============================================================================
// LookTable
// ============================================================================
u32 LookTable::find(const std::string& name) const {
for (std::size_t i = 0; i < looks.size(); ++i) {
if (looks[i].name == name) {
return static_cast<u32>(i);
}
}
return kInvalidIndex;
}
u32 LookTable::add(const std::string& name, i32 weight) {
Look look;
look.name = name;
look.weight = weight;
looks.push_back(std::move(look));
return static_cast<u32>(looks.size() - 1);
}
LookTable LookTable::Single() {
LookTable table;
table.looks.resize(1);
return table;
}
} // namespace wem
} // namespace models
} // namespace whiteout