Fix single-curve sections and random broken tangents
This commit is contained in:
1 parent
69cc44498a
commit
c04b55a632
1 file changed
+76
-73
@@ -382,81 +382,84 @@ function drawTracks(bezierData){
|
|||||||
// Add Signage
|
// Add Signage
|
||||||
let trackZoneData = {};
|
let trackZoneData = {};
|
||||||
for(let i=0; i+1<bezierData.points.length; i++){
|
for(let i=0; i+1<bezierData.points.length; i++){
|
||||||
for(let zI=0; zI < ((i == bezierData.points.length-2) ? 2 : 1); zI++){
|
let resetTzdGrade = () => {
|
||||||
let resetTzdGrade = () => {
|
trackZoneData.gradeClass = bezierData.points[i].gradeClass;
|
||||||
trackZoneData.gradeClass = bezierData.points[i].gradeClass;
|
trackZoneData.gradeDirection = Math.sign(bezierData.points[i].grade);
|
||||||
trackZoneData.gradeDirection = Math.sign(bezierData.points[i].grade);
|
trackZoneData.gradeCount = 0;
|
||||||
trackZoneData.gradeCount = 0;
|
trackZoneData.gradeSectionLength = bezierData.points[i].bezLength;
|
||||||
trackZoneData.gradeSectionLength = bezierData.points[i].bezLength;
|
};
|
||||||
};
|
let resetTzdSpeed = () => {
|
||||||
let resetTzdSpeed = () => {
|
trackZoneData.prevSpeed = trackZoneData.speed;
|
||||||
trackZoneData.prevSpeed = trackZoneData.speed;
|
trackZoneData.speed = bezierData.points[i].postedSpeed;
|
||||||
trackZoneData.speed = bezierData.points[i].postedSpeed;
|
trackZoneData.speedCount = 0;
|
||||||
trackZoneData.speedCount = 0;
|
trackZoneData.speedSectionLength = bezierData.points[i].bezLength;
|
||||||
trackZoneData.speedSectionLength = bezierData.points[i].bezLength;
|
}
|
||||||
|
if(i <= 0){
|
||||||
|
resetTzdGrade();
|
||||||
|
resetTzdSpeed();
|
||||||
|
}
|
||||||
|
//Grade Signs
|
||||||
|
if(trackZoneData.gradeClass != bezierData.points[i].gradeClass || trackZoneData.gradeDirection != Math.sign(bezierData.points[i].grade) || trackZoneData.gradeSectionLength > maxSectionLength || i == bezierData.points.length-2){
|
||||||
|
if(trackZoneData.gradeClass != 'flat'){
|
||||||
|
let offset = Math.floor((trackZoneData.gradeCount+1)/2);
|
||||||
|
let center = trackZoneData.gradeCount % 2 ? 1 : 0.55;
|
||||||
|
let b1 = bezierData.points[(i)-offset].position;
|
||||||
|
let b2 = bezierData.points[(i)-offset].h2;
|
||||||
|
let b3 = bezierData.points[(i)+1-offset].h1;
|
||||||
|
let b4 = bezierData.points[(i)+1-offset].position;
|
||||||
|
markers.push({
|
||||||
|
type: 'grade',
|
||||||
|
value: bezierData.points[(i)-offset].grade,
|
||||||
|
gradeClass: trackZoneData.gradeClass,
|
||||||
|
position: Bezier.evaluatePoint(b1, b2, b3, b4, center),
|
||||||
|
sectionLength: trackZoneData.gradeSectionLength,
|
||||||
|
cullLevel: Math.round(scaleCullThresholds.length-1-trackZoneData.gradeSectionLength/scaleCullBaseSectionLength),
|
||||||
|
tangent: bezierData.points[(i)].grade > 0
|
||||||
|
? Bezier.evaluateVelocity(b1, b2, b3, b4, center)
|
||||||
|
: Bezier.evaluateVelocity(b4, b3, b2, b1, center)
|
||||||
|
});
|
||||||
}
|
}
|
||||||
if(i <= 0){
|
resetTzdGrade();
|
||||||
resetTzdGrade();
|
}else{
|
||||||
resetTzdSpeed();
|
trackZoneData.gradeCount++;
|
||||||
}else{
|
trackZoneData.gradeSectionLength += bezierData.points[i].bezLength;
|
||||||
//Grade Signs
|
}
|
||||||
if(trackZoneData.gradeClass != bezierData.points[i].gradeClass || trackZoneData.gradeDirection != Math.sign(bezierData.points[i].grade) || trackZoneData.gradeSectionLength > maxSectionLength || zI > 0){
|
//Speed Signs
|
||||||
if(trackZoneData.gradeClass != 'flat'){
|
if(trackZoneData.speed != bezierData.points[i].postedSpeed || trackZoneData.speedSectionLength > maxSectionLength || i == bezierData.points.length-2){
|
||||||
let offset = Math.floor((trackZoneData.gradeCount+1)/2)+1;
|
let offset = Math.floor((trackZoneData.speedCount+1)/2);
|
||||||
let center = trackZoneData.gradeCount % 2 ? 1 : 0.5;
|
let center = trackZoneData.speedCount % 2 ? 0.85 : 0.45;
|
||||||
let b1 = bezierData.points[(i+zI)-offset].position;
|
let b1 = bezierData.points[(i)-offset].position;
|
||||||
let b2 = bezierData.points[(i+zI)-offset].h2;
|
let b2 = bezierData.points[(i)-offset].h2;
|
||||||
let b3 = bezierData.points[(i+zI)+1-offset].h1;
|
let b3 = bezierData.points[(i)+1-offset].h1;
|
||||||
let b4 = bezierData.points[(i+zI)+1-offset].position;
|
let b4 = bezierData.points[(i)+1-offset].position;
|
||||||
markers.push({
|
let cullLevel = Math.round(scaleCullThresholds.length-1-trackZoneData.gradeSectionLength/scaleCullBaseSectionLengthSpeedboard);
|
||||||
type: 'grade',
|
let speedDelta = Math.max(0,
|
||||||
value: bezierData.points[(i+zI)-offset].grade,
|
(bezierData.points[i].postedSpeed != null && bezierData.points[i].postedSpeed < 100) ? bezierData.points[i].postedSpeed-trackZoneData.speed : 0,
|
||||||
gradeClass: trackZoneData.gradeClass,
|
(trackZoneData.prevSpeed != null && trackZoneData.prevSpeed < 100) ? trackZoneData.prevSpeed-trackZoneData.speed : 0
|
||||||
position: Bezier.evaluatePoint(b1, b2, b3, b4, center),
|
);
|
||||||
sectionLength: trackZoneData.gradeSectionLength,
|
if(bezierData.points.length == 2 && trackZoneData.speed > 30){
|
||||||
cullLevel: Math.round(scaleCullThresholds.length-1-trackZoneData.gradeSectionLength/scaleCullBaseSectionLength),
|
cullLevel = 6;
|
||||||
tangent: bezierData.points[(i+zI)].grade > 0
|
}else if(speedDelta >= 10 && trackZoneData.speed <= 30){
|
||||||
? Bezier.evaluateVelocity(b1, b2, b3, b4, center)
|
cullLevel = 0;
|
||||||
: Bezier.evaluateVelocity(b4, b3, b2, b1, center)
|
}else if(speedDelta >= 20){
|
||||||
});
|
cullLevel = 1;
|
||||||
}
|
|
||||||
resetTzdGrade();
|
|
||||||
}else{
|
|
||||||
trackZoneData.gradeCount++;
|
|
||||||
trackZoneData.gradeSectionLength += bezierData.points[i].bezLength;
|
|
||||||
}
|
|
||||||
//Speed Signs
|
|
||||||
if(trackZoneData.speed != bezierData.points[i].postedSpeed || trackZoneData.speedSectionLength > maxSectionLength || zI > 0){
|
|
||||||
let offset = Math.floor((trackZoneData.speedCount+1)/2)+1;
|
|
||||||
let center = trackZoneData.speedCount % 2 ? 0.75 : 0.25;
|
|
||||||
let b1 = bezierData.points[(i+zI)-offset].position;
|
|
||||||
let b2 = bezierData.points[(i+zI)-offset].h2;
|
|
||||||
let b3 = bezierData.points[(i+zI)+1-offset].h1;
|
|
||||||
let b4 = bezierData.points[(i+zI)+1-offset].position;
|
|
||||||
let cullLevel = Math.round(scaleCullThresholds.length-1-trackZoneData.gradeSectionLength/scaleCullBaseSectionLengthSpeedboard);
|
|
||||||
let speedDelta = Math.max(0,
|
|
||||||
(bezierData.points[i].postedSpeed != null && bezierData.points[i].postedSpeed < 100) ? bezierData.points[i].postedSpeed-trackZoneData.speed : 0,
|
|
||||||
(trackZoneData.prevSpeed != null && trackZoneData.prevSpeed < 100) ? trackZoneData.prevSpeed-trackZoneData.speed : 0
|
|
||||||
);
|
|
||||||
if(speedDelta >= 10 && trackZoneData.speed <= 30){
|
|
||||||
cullLevel = 0;
|
|
||||||
}else if(speedDelta >= 20){
|
|
||||||
cullLevel = 1;
|
|
||||||
}
|
|
||||||
markers.push({
|
|
||||||
type: 'speed',
|
|
||||||
value: trackZoneData.speed,
|
|
||||||
position: Bezier.evaluatePoint(b1, b2, b3, b4, center),
|
|
||||||
sectionLength: trackZoneData.speedSectionLength,
|
|
||||||
cullLevel: cullLevel == 1 ? 2 : cullLevel,
|
|
||||||
tangent: Bezier.evaluateVelocity(b1, b2, b3, b4, center)
|
|
||||||
});
|
|
||||||
resetTzdSpeed();
|
|
||||||
}else{
|
|
||||||
trackZoneData.speedCount++;
|
|
||||||
trackZoneData.speedSectionLength += bezierData.points[i].bezLength;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if(bezierData.isYard || bezierData.isTurntable){
|
||||||
|
cullLevel = Math.min(cullLevel+1, scaleCullThresholds.length-1);
|
||||||
|
}
|
||||||
|
markers.push({
|
||||||
|
type: 'speed',
|
||||||
|
value: trackZoneData.speed,
|
||||||
|
position: Bezier.evaluatePoint(b1, b2, b3, b4, center),
|
||||||
|
sectionLength: trackZoneData.speedSectionLength,
|
||||||
|
cullLevel: cullLevel,
|
||||||
|
tangent: Bezier.evaluateVelocity(b1, b2, b3, b4, center),
|
||||||
|
debug: offset+', '+center
|
||||||
|
});
|
||||||
|
resetTzdSpeed();
|
||||||
|
}else{
|
||||||
|
trackZoneData.speedCount++;
|
||||||
|
trackZoneData.speedSectionLength += bezierData.points[i].bezLength;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in new issue
Block a user