From d3e5b9c485b82e1b83b8be7e495c49aa488679f1 Mon Sep 17 00:00:00 2001 From: Gent S Date: Wed, 16 Dec 2020 20:15:21 -0500 Subject: [PATCH] Potentially fix slider collisions - Lerp circuit once instead of on a per-slider basis to avoid FPE differences - Spawn sliders every k points instead of once per stop --- src/TableData.cpp | 76 +++++++++++++++++++++++------------------------ src/TableData.hpp | 1 - 2 files changed, 38 insertions(+), 39 deletions(-) diff --git a/src/TableData.cpp b/src/TableData.cpp index 7ebdd28..f26aa4b 100644 --- a/src/TableData.cpp +++ b/src/TableData.cpp @@ -336,22 +336,49 @@ void TableData::loadPaths(int* nextId) { std::cout << "[INFO] Loaded " << TransportManager::SkywayPaths.size() << " skyway paths" << std::endl; // slider circuit - int stops = 0; - int pos = 0; nlohmann::json pathDataSlider = pathData["slider"]; - for (nlohmann::json::iterator _sliderPoint = pathDataSlider.begin(); _sliderPoint != pathDataSlider.end(); _sliderPoint++) { - auto sliderPoint = _sliderPoint.value(); - if (sliderPoint["stop"]) { // check if this point in the circuit is a stop + // lerp between keyframes + std::queue route; + // initial point + nlohmann::json::iterator _point = pathDataSlider.begin(); // iterator + auto point = _point.value(); + WarpLocation from = { point["iX"] , point["iY"] , point["iZ"] }; // point A coords + int stopTime = point["stop"] ? SLIDER_STOP_TICKS : 0; // arbitrary stop length + // remaining points + for (_point++; _point != pathDataSlider.end(); _point++) { // loop through all point Bs + point = _point.value(); + for (int i = 0; i < stopTime + 1; i++) { // repeat point if it's a stop + route.push(from); // add point A to the queue + } + WarpLocation to = { point["iX"] , point["iY"] , point["iZ"] }; // point B coords + // we may need to change this later; right now, the speed is cut before and after stops (no accel) + float curve = 1; + if (stopTime > 0) { // point A is a stop + curve = 0.375f;//2.0f; + } else if (point["stop"]) { // point B is a stop + curve = 0.375f;//0.35f; + } + int preLerp = route.size(); + TransportManager::lerp(&route, from, to, SLIDER_SPEED * curve, 1); // lerp from A to B (arbitrary speed) + int postLerp = route.size() - preLerp; + from = to; // update point A + stopTime = point["stop"] ? SLIDER_STOP_TICKS : 0; // set stop ticks for next point A + } + // + int l = route.size(); + int numSlidersApprox = 16; // maybe add a config option for this? + for (int pos = 0; pos < l; pos++) { + WarpLocation point = route.front(); + if (pos % (l / numSlidersApprox) == 0) { // space them out uniformaly // spawn a slider - BaseNPC* slider = new BaseNPC(sliderPoint["iX"], sliderPoint["iY"], sliderPoint["iZ"], 0, INSTANCE_OVERWORLD, 1, (*nextId)++, NPC_BUS); + BaseNPC* slider = new BaseNPC(point.x, point.y, point.z, 0, INSTANCE_OVERWORLD, 1, (*nextId)++, NPC_BUS); NPCManager::NPCs[slider->appearanceData.iNPC_ID] = slider; NPCManager::updateNPCPosition(slider->appearanceData.iNPC_ID, slider->appearanceData.iX, slider->appearanceData.iY, slider->appearanceData.iZ, INSTANCE_OVERWORLD, 0); - // set slider path to a rotation of the circuit - constructPathSlider(pathDataSlider, pos, slider->appearanceData.iNPC_ID); - - stops++; + TransportManager::NPCQueues[slider->appearanceData.iNPC_ID] = route; } - pos++; + // rotate + route.pop(); + route.push(point); } // npc paths @@ -565,33 +592,6 @@ void TableData::constructPathSkyway(nlohmann::json::iterator _pathData) { TransportManager::SkywayPaths[pathData["iRouteID"]] = points; } -void TableData::constructPathSlider(nlohmann::json points, int rotations, int sliderID) { - std::queue route; - std::rotate(points.begin(), points.begin() + rotations, points.end()); // rotate points - nlohmann::json::iterator _point = points.begin(); // iterator - auto point = _point.value(); - WarpLocation from = { point["iX"] , point["iY"] , point["iZ"] }; // point A coords - int stopTime = point["stop"] ? SLIDER_STOP_TICKS : 0; // arbitrary stop length - for (_point++; _point != points.end(); _point++) { // loop through all point Bs - point = _point.value(); - for (int i = 0; i < stopTime + 1; i++) // repeat point if it's a stop - route.push(from); // add point A to the queue - WarpLocation to = { point["iX"] , point["iY"] , point["iZ"] }; // point B coords - // we may need to change this later; right now, the speed is cut before and after stops (no accel) - float curve = 1; - if (stopTime > 0) { // point A is a stop - curve = 0.375f;//2.0f; - } else if (point["stop"]) { // point B is a stop - curve = 0.375f;//0.35f; - } - TransportManager::lerp(&route, from, to, SLIDER_SPEED * curve, 1); // lerp from A to B (arbitrary speed) - from = to; // update point A - stopTime = point["stop"] ? SLIDER_STOP_TICKS : 0; - } - std::rotate(points.rbegin(), points.rbegin() + rotations, points.rend()); // undo rotation - TransportManager::NPCQueues[sliderID] = route; -} - void TableData::constructPathNPC(nlohmann::json::iterator _pathData, int32_t id) { auto pathData = _pathData.value(); // Interpolate diff --git a/src/TableData.hpp b/src/TableData.hpp index 5f73284..876f72a 100644 --- a/src/TableData.hpp +++ b/src/TableData.hpp @@ -21,6 +21,5 @@ namespace TableData { void loadDrops(); void loadEggs(int32_t* nextId); void constructPathSkyway(nlohmann::json::iterator); - void constructPathSlider(nlohmann::json, int, int); void constructPathNPC(nlohmann::json::iterator, int id=0); }