Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/base/StarAnimatedPartSet.cpp29
-rw-r--r--source/game/StarNetworkedAnimator.cpp39
2 files changed, 18 insertions, 50 deletions
diff --git a/source/base/StarAnimatedPartSet.cpp b/source/base/StarAnimatedPartSet.cpp
index 9e5f816..fb6e6ac 100644
--- a/source/base/StarAnimatedPartSet.cpp
+++ b/source/base/StarAnimatedPartSet.cpp
@@ -344,34 +344,17 @@ void AnimatedPartSet::freshenActivePart(Part& part) {
if (version() > 0) {
auto processTransforms = [](Mat3F mat, JsonArray transforms, JsonObject properties) -> Mat3F {
for (auto const& v : transforms) {
- auto actionData = v.toArray();
- auto action = actionData[0].toString();
+ auto action = v.getString(0);
if (action == "reset") {
mat = Mat3F::identity();
} else if (action == "translate") {
- mat.translate(jsonToVec2F(actionData[1]));
+ mat.translate(jsonToVec2F(v.getArray(1)));
} else if (action == "rotate") {
- if (auto center = actionData[2]) {
- mat.rotate(actionData[1].toFloat(), jsonToVec2F(center));
- } else if (auto center = properties.ptr("rotationCenter")) {
- mat.rotate(actionData[1].toFloat(), jsonToVec2F(center));
- } else if (auto center = properties.ptr("center")) {
- mat.rotate(actionData[1].toFloat(), jsonToVec2F(center));
- } else {
- mat.rotate(actionData[1].toFloat());
- }
+ mat.rotate(v.getFloat(1), jsonToVec2F(v.getArray(2, properties.maybe("rotationCenter").value(JsonArray({0,0})).toArray())));
} else if (action == "scale") {
- if (auto center = actionData[2]) {
- mat.scale(actionData[1].toFloat(), jsonToVec2F(center));
- } else if (auto center = properties.ptr("scaleCenter")) {
- mat.scale(actionData[1].toFloat(), jsonToVec2F(center));
- } else if (auto center = properties.ptr("center")) {
- mat.scale(actionData[1].toFloat(), jsonToVec2F(center));
- } else {
- mat.scale(actionData[1].toFloat());
- }
+ mat.scale(jsonToVec2F(v.getArray(1)), jsonToVec2F(v.getArray(2, properties.maybe("scalingCenter").value(JsonArray({0,0})).toArray())));
} else if (action == "transform") {
- mat = Mat3F(actionData[1].toFloat(), actionData[2].toFloat(), actionData[3].toFloat(), actionData[4].toFloat(), actionData[5].toFloat(), actionData[6].toFloat(), 0, 0, 1) * mat;
+ mat = Mat3F(v.getFloat(1), v.getFloat(2), v.getFloat(3), v.getFloat(4), v.getFloat(5), v.getFloat(6), 0, 0, 1) * mat;
}
}
return mat;
@@ -380,7 +363,7 @@ void AnimatedPartSet::freshenActivePart(Part& part) {
if (auto transforms = activePart.properties.ptr("transforms")) {
auto mat = processTransforms(activePart.animationAffineTransform(), transforms->toArray(), activePart.properties);
- if (activePart.properties.value("interpolated").optBool().value(false)) {
+ if (activePart.properties.maybe("interpolated").value(false)) {
if (auto nextTransforms = activePart.nextProperties.ptr("transforms")) {
auto nextMat = processTransforms(activePart.animationAffineTransform(), nextTransforms->toArray(), activePart.nextProperties);
activePart.setAnimationAffineTransform(mat, nextMat, stateType.activeState.frameProgress);
diff --git a/source/game/StarNetworkedAnimator.cpp b/source/game/StarNetworkedAnimator.cpp
index 396738c..3319daf 100644
--- a/source/game/StarNetworkedAnimator.cpp
+++ b/source/game/StarNetworkedAnimator.cpp
@@ -90,8 +90,8 @@ NetworkedAnimator::NetworkedAnimator(Json config, String relativePath) : Network
m_animatorVersion = config.getUInt("version", 0);
if (version() > 0) {
- if (auto v = config.get("includes"))
- config = mergeIncludes(config, v, relativePath);
+ if (config.contains("includes"))
+ config = mergeIncludes(config, config.get("includes"), relativePath);
}
m_animatedParts = AnimatedPartSet(config.get("animatedParts", JsonObject()), version());
@@ -362,7 +362,7 @@ Mat3F NetworkedAnimator::globalTransformation() const {
Mat3F NetworkedAnimator::groupTransformation(StringList const& transformationGroups) const {
auto mat = Mat3F::identity();
for (auto const& tg : transformationGroups)
- mat = m_transformationGroups.get(tg).affineTransform() * m_transformationGroups.get(tg).localAffineTransform() * mat;
+ mat = m_transformationGroups.get(tg).affineTransform() * m_transformationGroups.get(tg).localAffineTransform() * m_transformationGroups.get(tg).animationAffineTransform() * mat;
return mat;
}
@@ -373,6 +373,8 @@ Mat3F NetworkedAnimator::partTransformation(String const& partName) const {
if (auto offset = part.properties.value("offset").opt().apply(jsonToVec2F))
transformation = Mat3F::translation(*offset) * transformation;
+ transformation = part.animationAffineTransform() * transformation;
+
auto transformationGroups = jsonToStringList(part.properties.value("transformationGroups", JsonArray()));
transformation = groupTransformation(transformationGroups) * transformation;
@@ -956,34 +958,17 @@ void NetworkedAnimator::update(float dt, DynamicTarget* dynamicTarget) {
if (version() > 0){
auto processTransforms = [](Mat3F mat, JsonArray transforms, JsonObject properties) -> Mat3F {
for (auto const& v : transforms) {
- auto actionData = v.toArray();
- auto action = actionData[0].toString();
+ auto action = v.getString(0);
if (action == "reset") {
mat = Mat3F::identity();
} else if (action == "translate") {
- mat.translate(jsonToVec2F(actionData[1]));
+ mat.translate(jsonToVec2F(v.getArray(1)));
} else if (action == "rotate") {
- if (auto center = actionData[2]) {
- mat.rotate(actionData[1].toFloat(), jsonToVec2F(center));
- } else if (auto center = properties.ptr("rotationCenter")) {
- mat.rotate(actionData[1].toFloat(), jsonToVec2F(center));
- } else if (auto center = properties.ptr("center")) {
- mat.rotate(actionData[1].toFloat(), jsonToVec2F(center));
- } else {
- mat.rotate(actionData[1].toFloat());
- }
+ mat.rotate(v.getFloat(1), jsonToVec2F(v.getArray(2, properties.maybe("rotationCenter").value(JsonArray({0,0})).toArray())));
} else if (action == "scale") {
- if (auto center = actionData[2]) {
- mat.scale(actionData[1].toFloat(), jsonToVec2F(center));
- } else if (auto center = properties.ptr("scaleCenter")) {
- mat.scale(actionData[1].toFloat(), jsonToVec2F(center));
- } else if (auto center = properties.ptr("center")) {
- mat.scale(actionData[1].toFloat(), jsonToVec2F(center));
- } else {
- mat.scale(actionData[1].toFloat());
- }
+ mat.scale(jsonToVec2F(v.getArray(1)), jsonToVec2F(v.getArray(2, properties.maybe("scalingCenter").value(JsonArray({0,0})).toArray())));
} else if (action == "transform") {
- mat = Mat3F(actionData[1].toFloat(), actionData[2].toFloat(), actionData[3].toFloat(), actionData[4].toFloat(), actionData[5].toFloat(), actionData[6].toFloat(), 0, 0, 1) * mat;
+ mat = Mat3F(v.getFloat(1), v.getFloat(2), v.getFloat(3), v.getFloat(4), v.getFloat(5), v.getFloat(6), 0, 0, 1) * mat;
}
}
return mat;
@@ -1330,8 +1315,8 @@ uint8_t NetworkedAnimator::version() const {
Json NetworkedAnimator::mergeIncludes(Json config, Json includes, String relativePath){
for (Json const& path : includes.iterateArray()) {
auto includeConfig = Root::singleton().assets()->json(AssetPath::relativeTo(relativePath, path.toString()));
- if (auto v = includeConfig.get("includes"))
- includeConfig = mergeIncludes(includeConfig, v, relativePath);
+ if (includeConfig.contains("includes"))
+ includeConfig = mergeIncludes(includeConfig, includeConfig.get("includes"), relativePath);
config = jsonMerge(includeConfig, config);
}
return config;