mirror of
https://github.com/MaSzyna-EU07/maszyna.git
synced 2026-11-08 21:00:03 +01:00
Sieć trakcyjna: kotwienia, kotwienie środkowe, parasole i wysięgniki rozstawione, konsole 4890/4690
Sam kod exe z gałęzi siec-trakcyjna od poprzedniego commita (bez testów, notatek i danych z tests/catenary). Dane (data/traction_*.txt) leżą poza repozytorium. - kotwienia ciężarowe i stałe (0404/0405, przewody zakotwione osobno, sieci bez własnych danych: network <symbol> as <kod>) - kotwienie środkowe 0406/0408/0418/0416: lina, V i zaciski na linie nośnej liczonej jak przęsło, obejma 4160 na teownikach - parasole i wysięgniki rozstawione na konsolach 4890, wysięgi pomocnicze 0167 na belkach 4690, trzeci wysięgnik w osi słupa, lina nośna z innego wysięgnika (messenger_from) - przęsła w nietypowych sytuacjach nie przechodzą na stary wygląd (bez Y, bez wieszaków, lina nad przewodem) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01GfTogWDsfCE8RGFGvm2eyp
This commit is contained in:
@@ -10,6 +10,8 @@ http://mozilla.org/MPL/2.0/.
|
||||
#include "stdafx.h"
|
||||
#include "world/catenary_span.h"
|
||||
|
||||
#include <memory>
|
||||
|
||||
#include "world/Traction.h"
|
||||
#include "world/catenary_network.h"
|
||||
#include "utilities/Globals.h"
|
||||
@@ -31,6 +33,10 @@ struct catenary_span {
|
||||
gfx::geometrybank_handle solidbank; // osobny bank na bryły tego przęsła
|
||||
catenary_solid solid; // bryły do oglądania z bliska
|
||||
bool solidloaded { false };
|
||||
std::vector<catenary::solid_vertex> attached; // bryła dołączona (lina kotwienia), układ scenerii
|
||||
std::shared_ptr<catenary::network_definition> own; // kopia typu z naciągiem z dopisku "tension"
|
||||
bool rope2set[ 2 ] { false, false }; // końce drugiej liny nośnej z dopisku "rope2"
|
||||
catenary::vec3 rope2[ 2 ];
|
||||
};
|
||||
|
||||
namespace {
|
||||
@@ -43,11 +49,19 @@ definition( TTraction const &Traction ) {
|
||||
|
||||
catenary::span_points
|
||||
points( TTraction const &Traction ) {
|
||||
return {
|
||||
catenary::span_points result {
|
||||
{ Traction.pPoint1.x, Traction.pPoint1.y, Traction.pPoint1.z },
|
||||
{ Traction.pPoint2.x, Traction.pPoint2.y, Traction.pPoint2.z },
|
||||
{ Traction.pPoint3.x, Traction.pPoint3.y, Traction.pPoint3.z },
|
||||
{ Traction.pPoint4.x, Traction.pPoint4.y, Traction.pPoint4.z } };
|
||||
if( Traction.m_catenaryspan ) {
|
||||
auto const &span { *Traction.m_catenaryspan };
|
||||
result.messenger2_start_set = span.rope2set[ 0 ];
|
||||
result.messenger2_end_set = span.rope2set[ 1 ];
|
||||
result.messenger2_start = span.rope2[ 0 ];
|
||||
result.messenger2_end = span.rope2[ 1 ];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
// długość podwieszenia Y, jaką typ sieci przewiduje dla tego przęsła; 0 gdy brak
|
||||
@@ -249,13 +263,17 @@ catenary_span_metal( TTraction const &Traction, bool const Fitting ) {
|
||||
|
||||
// przypisuje przęsłu typ sieci z dopisku "type" i dobiera rozstaw wieszaków
|
||||
void
|
||||
catenary_span_assign( TTraction &Traction, std::string const &Symbol ) {
|
||||
catenary_span_assign( TTraction &Traction, std::string const &Symbol, double const Messenger, double const Contact, glm::dvec3 const *Rope2, bool const *Rope2set ) {
|
||||
|
||||
Traction.m_catenaryspan.reset();
|
||||
if( Symbol.empty() ) { return; }
|
||||
|
||||
auto span { std::make_shared<catenary_span>() };
|
||||
span->symbol = Symbol;
|
||||
for( int end = 0; end < 2 && Rope2 != nullptr && Rope2set != nullptr; ++end ) {
|
||||
span->rope2set[ end ] = Rope2set[ end ];
|
||||
span->rope2[ end ] = catenary::vec3 { Rope2[ end ].x, Rope2[ end ].y, Rope2[ end ].z };
|
||||
}
|
||||
Traction.m_catenaryspan = span;
|
||||
if( false == Global.CatenaryProcedural ) { return; }
|
||||
|
||||
@@ -265,6 +283,13 @@ catenary_span_assign( TTraction &Traction, std::string const &Symbol ) {
|
||||
}
|
||||
span->definition = registry.find( Symbol );
|
||||
if( span->definition == nullptr ) { return; } // brak typu został już zgłoszony, przęsło rysuje się po staremu
|
||||
// naciąg z dopisku "tension" (daN): przęsło liczone z kopią typu
|
||||
if( Messenger > 0.0 || Contact > 0.0 ) {
|
||||
span->own = std::make_shared<catenary::network_definition>( *span->definition );
|
||||
if( Messenger > 0.0 ) { span->own->type.messenger_tension = 10.0 * Messenger; }
|
||||
if( Contact > 0.0 && span->own->type.contact_tension > 0.0 ) { span->own->type.contact_tension = 10.0 * Contact; }
|
||||
span->definition = span->own.get();
|
||||
}
|
||||
// odstęp wieszaków 0 w scenerii oznacza odcinek bez wieszaków (do kotwienia albo urządzenia naprężającego):
|
||||
// rysowane są same liny i przewody w liczbie wg typu, a rozstaw wieszaków zostaje pusty
|
||||
if( Traction.iNumSections == 0 ) { return; }
|
||||
@@ -274,6 +299,13 @@ catenary_span_assign( TTraction &Traction, std::string const &Symbol ) {
|
||||
std::hypot( Traction.pPoint2.x - Traction.pPoint1.x, Traction.pPoint2.z - Traction.pPoint1.z ) );
|
||||
}
|
||||
|
||||
// wygląd liny stalowej (ocynk, lekko zmatowiały)
|
||||
catenary_metal const &
|
||||
catenary_rope_metal() {
|
||||
static catenary_metal const steel { { 0.56f, 0.57f, 0.58f }, 0.8f, 0.30f, 0.20f };
|
||||
return steel;
|
||||
}
|
||||
|
||||
// symbol typu sieci przypisany przęsłu; pusty gdy brak
|
||||
std::string
|
||||
catenary_span_symbol( TTraction const &Traction ) {
|
||||
@@ -318,6 +350,7 @@ catenary_span_solid( TTraction &Traction, glm::dvec3 const &Camera ) {
|
||||
// kamera daleko: zwolnienie pamięci, linie wystarczą
|
||||
release( span.solid.wires );
|
||||
release( span.solid.fittings );
|
||||
release( span.solid.rope );
|
||||
span.solid = {};
|
||||
span.solidloaded = false;
|
||||
return {};
|
||||
@@ -344,6 +377,10 @@ catenary_span_solid( TTraction &Traction, glm::dvec3 const &Camera ) {
|
||||
auto data { vertices( Traction, fittings ) };
|
||||
span.solid.fittings = GfxRenderer->Insert( data, userdata, span.solidbank, GL_TRIANGLES );
|
||||
}
|
||||
if( false == span.attached.empty() ) {
|
||||
auto data { vertices( Traction, span.attached ) };
|
||||
span.solid.rope = GfxRenderer->Insert( data, userdata, span.solidbank, GL_TRIANGLES );
|
||||
}
|
||||
span.solidloaded = ( span.solid.wires != null_handle );
|
||||
return ( span.solidloaded ? span.solid : catenary_solid() );
|
||||
}
|
||||
@@ -358,6 +395,7 @@ drop_solid( TTraction &Traction ) {
|
||||
if( false == span.solidloaded ) { return; }
|
||||
release( span.solid.wires );
|
||||
release( span.solid.fittings );
|
||||
release( span.solid.rope );
|
||||
span.solid = {};
|
||||
span.solidloaded = false;
|
||||
}
|
||||
@@ -383,3 +421,12 @@ catenary_span_release( TTraction &Traction ) {
|
||||
drop_solid( Traction );
|
||||
release( Traction.m_geometry );
|
||||
}
|
||||
|
||||
// bryła spoza przęsła rysowana razem z nim (lina kotwienia); zrobi się przy następnym podejściu kamery
|
||||
bool
|
||||
catenary_span_attach( TTraction &Traction, std::vector<catenary::solid_vertex> const &Triangles ) {
|
||||
if( false == static_cast<bool>( Traction.m_catenaryspan ) ) { return false; }
|
||||
drop_solid( Traction );
|
||||
Traction.m_catenaryspan->attached = Triangles;
|
||||
return ( Traction.m_catenaryspan->definition != nullptr );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user