00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00037 #include "../Include/Globals.h"
00038 #include "../Include/FlyLegacy.h"
00039 #include "../Include/UserVehicles.h"
00040 #include "../Include/Subsystems.h"
00041 #include "../Include/Cameras.h"
00042 #include "../Include/Ui.h"
00043 #include "../Include/Utility.h"
00044
00045 using namespace std;
00046
00047
00048
00049
00050
00051
00052 CSimulatedVehicle::CSimulatedVehicle (const char* svhFilename)
00053 {
00054 SStream s;
00055 strcpy (s.filename, "World\\");
00056 strcat (s.filename, svhFilename);
00057 strcpy (s.mode, "r");
00058 if (OpenStream (&s)) {
00059 ReadFrom (this, &s);
00060 CloseStream (&s);
00061 }
00062 }
00063
00064
00065 int CSimulatedVehicle::Read (SStream *stream, Tag tag)
00066 {
00067 int rc = TAG_IGNORED;
00068
00069 switch (tag) {
00070 case 'type':
00071
00072 ReadTag (&type, stream);
00073 rc = TAG_READ;
00074 break;
00075 case 'mxdt':
00076
00077 ReadUInt (&mxdt, stream);
00078 rc = TAG_READ;
00079 break;
00080 case 'name':
00081
00082 ReadString (name, 64, stream);
00083 rc = TAG_READ;
00084 break;
00085 case 'acid':
00086
00087 ReadString (acid, 64, stream);
00088 rc = TAG_READ;
00089 break;
00090 case 'make':
00091
00092 ReadString (make, 64, stream);
00093 rc = TAG_READ;
00094 break;
00095 case 'emas':
00096
00097 ReadFloat (&emas, stream);
00098 rc = TAG_READ;
00099 break;
00100 case 'mine':
00101
00102 ReadVector (&mine, stream);
00103 rc = TAG_READ;
00104 break;
00105 case 'CofG':
00106
00107 ReadVector (&CofG, stream);
00108 rc = TAG_READ;
00109 break;
00110 case 'imbl':
00111
00112 ReadFloat (&imbl, stream);
00113 rc = TAG_READ;
00114 break;
00115 case 'iceR':
00116
00117 ReadFloat (&iceR, stream);
00118 rc = TAG_READ;
00119 break;
00120 case '000a':
00121
00122 ReadFloat (&wingarea, stream);
00123 rc = TAG_READ;
00124 break;
00125 case '001a':
00126
00127 ReadFloat (&wingspan, stream);
00128 rc = TAG_READ;
00129 break;
00130 case '002a':
00131
00132 ReadFloat (&meanchord, stream);
00133 rc = TAG_READ;
00134 break;
00135 case 'CEIL':
00136
00137 ReadFloat (&ceiling, stream);
00138 rc = TAG_READ;
00139 break;
00140 case '043a':
00141
00142 ReadFloat (&maxcruisespeed, stream);
00143 rc = TAG_READ;
00144 break;
00145 case '044a':
00146
00147 ReadFloat (&approachspeed, stream);
00148 rc = TAG_READ;
00149 break;
00150 case '045a':
00151
00152 ReadFloat (&wingarea, stream);
00153 rc = TAG_READ;
00154 break;
00155 case '048a':
00156
00157 ReadFloat (&vne, stream);
00158 rc = TAG_READ;
00159 break;
00160 case 'saoa':
00161
00162 ReadFloat (&stallaoa, stream);
00163 rc = TAG_READ;
00164 break;
00165 case 'posG':
00166
00167 ReadFloat (&posG, stream);
00168 rc = TAG_READ;
00169 break;
00170 case 'aoaL':
00171
00172 ReadFloat (&aoaL, stream);
00173 rc = TAG_READ;
00174 break;
00175 case 'negG':
00176
00177 ReadFloat (&negG, stream);
00178 rc = TAG_READ;
00179 break;
00180 case 'stal':
00181
00182 ReadFloat (&stallspeed, stream);
00183 rc = TAG_READ;
00184 break;
00185 case 'blst':
00186 ReadFloat (&blst, stream);
00187 rc = TAG_READ;
00188 break;
00189 case 'wTrb':
00190
00191 ReadFloat (&wTrbSpeed, stream);
00192 ReadFloat (&wTrbTimK, stream);
00193 ReadFloat (&wTrbCeiling, stream);
00194 ReadFloat (&wTrbDuration, stream);
00195 rc = TAG_READ;
00196 break;
00197 case 'nTrb':
00198
00199 ReadFloat (&nTrbSpeed, stream);
00200 ReadFloat (&nTrbTimK, stream);
00201 ReadFloat (&nTrbCeiling, stream);
00202 ReadFloat (&nTrbDuration, stream);
00203 rc = TAG_READ;
00204 break;
00205 case 'dieh':
00206
00208 SkipObject (stream);
00209 rc = TAG_READ;
00210 break;
00211 case 'pitd':
00212
00213 SkipObject (stream);
00214 rc = TAG_READ;
00215 break;
00216 case 'acrd':
00217
00218 SkipObject (stream);
00219 rc = TAG_READ;
00220 break;
00221 case 'sfxd':
00222
00223 ReadTag (&sfxdTag, stream);
00224 ReadString (sfxdFilename, 64, stream);
00225 rc = TAG_READ;
00226 break;
00227 case 'mAlt':
00228
00229 ReadMessage (&mAlt, stream);
00230 rc = TAG_READ;
00231 break;
00232 case 'mSpd':
00233
00234 ReadMessage (&mSpd, stream);
00235 rc = TAG_READ;
00236 break;
00237 case 'mVsi':
00238
00239 ReadMessage (&mVsi, stream);
00240 rc = TAG_READ;
00241 break;
00242 case 'mMag':
00243
00244 ReadMessage (&mMag, stream);
00245 rc = TAG_READ;
00246 break;
00247 case 'mRpm':
00248
00249 ReadMessage (&mRpm, stream);
00250 rc = TAG_READ;
00251 break;
00252 }
00253
00254 if (rc != TAG_READ) {
00255
00256 char s[16];
00257 TagToString (s, tag);
00258 globals->logWarning->Write ("CSimulatedVehicle::Read : Unrecognized tag <%s>", s);
00259 }
00260
00261 return rc;
00262 }
00263
00264 void CSimulatedVehicle::ReadFinished (void)
00265 {
00266 }
00267
00268 void CSimulatedVehicle::Write (SStream *stream)
00269 {
00270 }
00271
00272
00273
00274
00275
00276
00277 CFuelSystem::CFuelSystem (const char* gasFilename)
00278 {
00279
00280 grad = AIRPORT_FUEL_100LL;
00281
00282
00283 SStream s;
00284 strcpy (s.filename, "World\\");
00285 strcat (s.filename, gasFilename);
00286 strcpy (s.mode, "r");
00287 if (OpenStream (&s)) {
00288 ReadFrom (this, &s);
00289 CloseStream (&s);
00290 }
00291 }
00292
00293 CFuelSystem::~CFuelSystem (void)
00294 {
00295 vector<CFuelSubsystem*>::iterator i;
00296 for (i=fsub.begin(); i!=fsub.end(); i++) delete *i;
00297 }
00298
00299 int CFuelSystem::Read (SStream *stream, Tag tag)
00300 {
00301 int rc = TAG_IGNORED;
00302
00303 switch (tag) {
00304 case 'grad':
00305
00306 {
00307 char s[64];
00308 ReadString (s, 64, stream);
00309 if (stricmp (s, "AVGAS_80") == 0) {
00310 grad = AIRPORT_FUEL_80;
00311 } else if (stricmp (s, "AVGAS_100") == 0) {
00312 grad = AIRPORT_FUEL_100;
00313 } else if (stricmp (s, "AVGAS_100LL") == 0) {
00314 grad = AIRPORT_FUEL_100LL;
00315 } else if (stricmp (s, "AVGAS_115") == 0) {
00316 grad = AIRPORT_FUEL_115;
00317 } else if (stricmp (s, "JETA") == 0) {
00318 grad = AIRPORT_FUEL_JETA;
00319 } else if (stricmp (s, "JETA1") == 0) {
00320 grad = AIRPORT_FUEL_JETA1;
00321 } else if (stricmp (s, "JETA1PLUS") == 0) {
00322 grad = AIRPORT_FUEL_JETA1PLUS;
00323 } else if (stricmp (s, "JETB") == 0) {
00324 grad = AIRPORT_FUEL_JETB;
00325 } else if (stricmp (s, "AVGAS_JETBPLUS") == 0) {
00326 grad = AIRPORT_FUEL_JETBPLUS;
00327 } else if (stricmp (s, "AUTOMOTIVE") == 0) {
00328 grad = AIRPORT_FUEL_AUTOMOTIVE;
00329 } else {
00330 globals->logWarning->Write ("CFuelSystem::Read : Unknown fuel grade %s", s);
00331 }
00332 }
00333 rc = TAG_READ;
00334 break;
00335
00336 case 'fsub':
00337
00338 {
00339 char type_string[64];
00340 ReadString (type_string, 64, stream);
00341 Tag type = StringToTag (type_string);
00342
00343 CFuelSubsystem *f = NULL;
00344
00345 switch (type) {
00346 case SUBSYSTEM_FUEL_SUBSYSTEM:
00347 f = new CFuelSubsystem;
00348 break;
00349
00350 case SUBSYSTEM_FUEL_TAP:
00351 f = new CFuelTap;
00352 break;
00353
00354 case SUBSYSTEM_FUEL_CELL:
00355 f = new CFuelCell;
00356 break;
00357
00358 case SUBSYSTEM_FUEL_HEATER:
00359 f = new CFuelHeater;
00360 break;
00361
00362 case SUBSYSTEM_FUEL_MATH:
00363 f = new CFuelMath;
00364 break;
00365
00366 case SUBSYSTEM_FUEL_PUMP:
00367 f = new CFuelPump;
00368 break;
00369
00370 case SUBSYSTEM_FUEL_SOURCE:
00371 f = new CFuelSource;
00372 break;
00373
00374 case SUBSYSTEM_FUEL_TANK:
00375 f = new CFuelTank;
00376 break;
00377
00378 case SUBSYSTEM_ENGINE_FUEL_PUMP:
00379 f = new CEngineFuelPump;
00380 break;
00381
00382 case SUBSYSTEM_FUEL_MANAGEMENT:
00383 f = new CFuelManagement;
00384 break;
00385
00386 case SUBSYSTEM_APU_FUEL_SOURCE:
00387 f = new CAPUFuelSource;
00388 break;
00389 }
00390
00391 if (f != NULL) {
00392
00393 ReadFrom (f, stream);
00394 fsub.push_back (f);
00395 rc = TAG_READ;
00396 } else {
00397 globals->logWarning->Write ("CFuelSystem : Unknown fsub type = %s",
00398 type_string);
00399 }
00400 }
00401 break;
00402 }
00403
00404 if (rc != TAG_READ) {
00405
00406 char s[16];
00407 TagToString (s, tag);
00408 globals->logWarning->Write ("CFuelSystem::Read : Unrecognized tag <%s>", s);
00409 }
00410
00411 return rc;
00412 }
00413
00414 void CFuelSystem::ReadFinished (void)
00415 {
00416 }
00417
00418 void CFuelSystem::Write (SStream *stream)
00419 {
00420 }
00421
00422
00423
00424
00425
00426
00427 CAerodynamicModel::CAerodynamicModel (const char* svhFilename)
00428 {
00429
00430 dofa.x = dofa.y = dofa.z = 0.0;
00431 grnd = false;
00432 geff = 0.0f;
00433 gAGL = 0.0f;
00434 cd = 0.0f;
00435
00436
00437 SStream s;
00438 strcpy (s.filename, "World\\");
00439 strcat (s.filename, svhFilename);
00440 strcpy (s.mode, "r");
00441 if (OpenStream (&s)) {
00442 ReadFrom (this, &s);
00443 CloseStream (&s);
00444 }
00445 }
00446
00447 int CAerodynamicModel::Read (SStream *stream, Tag tag)
00448 {
00449 int rc = TAG_IGNORED;
00450
00451 switch (tag) {
00452 case 'dofa':
00453
00454 ReadVector (&dofa, stream);
00455 rc = TAG_READ;
00456 break;
00457 case 'grnd':
00458
00459 grnd = true;
00460 rc = TAG_READ;
00461 break;
00462 case 'geff':
00463
00464 ReadFloat (&geff, stream);
00465 rc = TAG_READ;
00466 break;
00467 case 'gAGL':
00468
00469 ReadFloat (&gAGL, stream);
00470 rc = TAG_READ;
00471 break;
00472 case '+cd+':
00473
00474 ReadFloat (&cd, stream);
00475 rc = TAG_READ;
00476 break;
00477 case 'foil':
00478
00479 SkipObject (stream);
00480 rc = TAG_READ;
00481 break;
00482 case 'wing':
00483
00484 SkipObject (stream);
00485 rc = TAG_READ;
00486 break;
00487 }
00488
00489 if (rc != TAG_READ) {
00490
00491 char s[16];
00492 TagToString (s, tag);
00493 globals->logWarning->Write ("CAerodynamicModel::Read : Unrecognized tag <%s>", s);
00494 }
00495
00496 return rc;
00497 }
00498
00499
00500
00501
00502
00503
00504 CElectricalSystem::CElectricalSystem (const char* ampFilename)
00505 {
00506
00507 pAileron = NULL;
00508 pElevator = NULL;
00509 pRudder = NULL;
00510 pAileronTrim = NULL;
00511 pElevatorTrim = NULL;
00512 pRudderTrim = NULL;
00513
00514
00515 SStream s;
00516 strcpy (s.filename, "World\\");
00517 strcat (s.filename, ampFilename);
00518 strcpy (s.mode, "r");
00519 if (OpenStream (&s)) {
00520 ReadFrom (this, &s);
00521 CloseStream (&s);
00522 }
00523 }
00524
00525 CElectricalSystem::~CElectricalSystem (void)
00526 {
00527 vector<CSubsystem*>::iterator i;
00528 for (i=subs.begin(); i!=subs.end(); i++) {
00529 CSubsystem *s = *i;
00530 delete s;
00531 }
00532 }
00533
00534 int CElectricalSystem::Read (SStream *stream, Tag tag)
00535 {
00536 int rc = TAG_IGNORED;
00537
00538 switch (tag) {
00539 case 'subs':
00540 {
00541 char tag_string[64];
00542 ReadString (tag_string, 64, stream);
00543 Tag type = StringToTag (tag_string);
00544
00545 CSubsystem *s = NULL;
00546
00547 switch (type) {
00548 case SUBSYSTEM_DEPENDENT:
00549 s = new CDependent;
00550 break;
00551
00552 case SUBSYSTEM_ANNOUNCEMENT:
00553 s = new CAnnouncement;
00554 break;
00555
00556 case SUBSYSTEM_GENERIC_MONITOR:
00557 s = new CGenericMonitor;
00558 break;
00559
00560 case SUBSYSTEM_GENERIC_INDICATOR:
00561 s = new CGenericIndicator;
00562 break;
00563
00564 case SUBSYSTEM_HISTORY:
00565 s = new CHistory;
00566 break;
00567
00568 case SUBSYSTEM_PNEUMATIC_PUMP:
00569 s = new CPneumaticPump;
00570 break;
00571
00572 case SUBSYSTEM_EMERGENCY_LOCATOR:
00573 s = new CEmergencyLocator;
00574 break;
00575
00576 case SUBSYSTEM_EXTERIOR_LIGHT:
00577 s = new CExteriorLight;
00578 break;
00579
00580 case SUBSYSTEM_PITOT_HEAT_SWITCH:
00581 s = new CPitotHeatSwitch;
00582 break;
00583
00584 case SUBSYSTEM_STATIC_SOURCE_SWITCH:
00585 s = new CStaticSourceSwitch;
00586 break;
00587
00588 case SUBSYSTEM_ANNUNCIATOR_LIGHT:
00589 s = new CAnnunciatorLight;
00590 break;
00591
00592 case SUBSYSTEM_STALL_WARNING:
00593 s = new CStallWarning;
00594 break;
00595
00596 case SUBSYSTEM_LIGHT_SETTING_STATE:
00597 s = new CLightSettingState;
00598 break;
00599
00600 case SUBSYSTEM_SWITCH_SET:
00601 s = new CSwitchSet;
00602 break;
00603
00604 case SUBSYSTEM_ROTARY_IGNITION_SWITCH:
00605 s = new CRotaryIgnitionSwitch;
00606 break;
00607
00608 case SUBSYSTEM_BATTERY:
00609 s = new CBattery;
00610 break;
00611
00612 case SUBSYSTEM_ALTERNATOR:
00613 s = new CAlternator;
00614 break;
00615
00616
00617
00618
00619
00620 case SUBSYSTEM_ALTIMETER:
00621 s = new CAltimeter;
00622 break;
00623
00624 case SUBSYSTEM_VERTICAL_SPEED:
00625 {
00626 char *mark1 = new char[32];
00627 strcpy (mark1, "vsi start");
00628 s = new CVerticalSpeedIndicator;
00629 char *mark2 = new char[32];
00630 strcpy (mark2, "vsi end");
00631 }
00632 break;
00633
00634 case SUBSYSTEM_AIRSPEED:
00635 s = new CAirspeedIndicator;
00636 break;
00637
00638 case SUBSYSTEM_ATTITUDE:
00639 s = new CAttitudeIndicator;
00640 break;
00641
00642 case SUBSYSTEM_DIRECTIONAL_GYRO:
00643 s = new CDirectionalGyro;
00644 break;
00645
00646 case SUBSYSTEM_VACUUM_INDICATOR:
00647 s = new CVacuumIndicator;
00648 break;
00649
00650 case SUBSYSTEM_TURN_COORDINATOR:
00651 s = new CTurnCoordinator;
00652 break;
00653
00654 case SUBSYSTEM_MAGNETIC_COMPASS:
00655 s = new CMagneticCompass;
00656 break;
00657
00658 case SUBSYSTEM_NAVIGATION:
00659 s = new CNavigation;
00660 break;
00661
00662 case SUBSYSTEM_DIGITAL_CLOCK_OAT:
00663 s = new CDigitalClockOAT;
00664 break;
00665
00666 case SUBSYSTEM_KAP140_PANEL:
00667 s = new CBKKAP140Panel;
00668 break;
00669
00670 case SUBSYSTEM_MARKER_PANEL:
00671 s = new CMarkerPanel;
00672 break;
00673
00674 case SUBSYSTEM_AMMETER:
00675 s = new CAmmeter;
00676 break;
00677
00678
00679
00680
00681
00682 case SUBSYSTEM_TACHOMETER:
00683 s = new CTachometer;
00684 break;
00685
00686 case SUBSYSTEM_OIL_TEMPERATURE:
00687 s = new COilTemperature;
00688 break;
00689
00690 case SUBSYSTEM_OIL_PRESSURE:
00691 s = new COilPressure;
00692 break;
00693
00694 case SUBSYSTEM_EXHAUST_GAS_TEMPERATURE:
00695 s = new CExhaustGasTemperature;
00696 break;
00697
00698 case SUBSYSTEM_MANIFOLD_PRESSURE:
00699 s = new CManifoldPressure;
00700 break;
00701
00702 case SUBSYSTEM_HOBBS_METER:
00703 s = new CHobbsMeter;
00704 break;
00705
00706 case SUBSYSTEM_TACHOMETER_TIMER:
00707 s = new CTachometerTimer;
00708 break;
00709
00710
00711
00712
00713
00714 case SUBSYSTEM_THROTTLE_CONTROL:
00715 s = new CThrottleControl;
00716 break;
00717
00718 case SUBSYSTEM_MIXTURE_CONTROL:
00719 s = new CMixtureControl;
00720 break;
00721
00722 case SUBSYSTEM_STEERING_CONTROL:
00723 s = new CSteeringControl;
00724 break;
00725
00726 case SUBSYSTEM_FLAP_CONTROL:
00727 s = new CFlapControl;
00728 break;
00729
00730 case SUBSYSTEM_ELEVATOR_CONTROL:
00731 s = new CElevatorControl;
00732 if (pElevator == NULL) {
00733
00734 pElevator = (CElevatorControl *)s;
00735 } else {
00736
00737 globals->logWarning->Write ("Multiple elevator subsystems defined");
00738 }
00739 break;
00740
00741 case SUBSYSTEM_AILERON_CONTROL:
00742 s = new CAileronControl;
00743 if (pAileron == NULL) {
00744
00745 pAileron = (CAileronControl *)s;
00746 } else {
00747
00748 globals->logWarning->Write ("Multiple aileron subsystems defined");
00749 }
00750 break;
00751
00752 case SUBSYSTEM_RUDDER_CONTROL:
00753 s = new CRudderControl;
00754 if (pRudder == NULL) {
00755
00756 pRudder = (CRudderControl *)s;
00757 } else {
00758
00759 globals->logWarning->Write ("Multiple rudder subsystems defined");
00760 }
00761 break;
00762
00763 case SUBSYSTEM_ELEVATOR_TRIM_CONTROL:
00764 s = new CElevatorTrimControl;
00765 if (pElevatorTrim == NULL) {
00766
00767 pElevatorTrim = (CElevatorTrimControl *) s;
00768 } else {
00769
00770 globals->logWarning->Write ("Multiple elevator trim subsystems defined");
00771 }
00772 break;
00773
00774 case SUBSYSTEM_AILERON_TRIM_CONTROL:
00775 s = new CAileronTrimControl;
00776 if (pAileronTrim == NULL) {
00777
00778 pAileronTrim = (CAileronTrimControl *) s;
00779 } else {
00780
00781 globals->logWarning->Write ("Multiple aileron trim subsystems defined");
00782 }
00783 break;
00784
00785 case SUBSYSTEM_RUDDER_TRIM_CONTROL:
00786 s = new CRudderTrimControl;
00787 if (pRudderTrim == NULL) {
00788
00789 pRudderTrim = (CRudderTrimControl *) s;
00790 } else {
00791
00792 globals->logWarning->Write ("Multiple rudder trim subsystems defined");
00793 }
00794 break;
00795
00796 case SUBSYSTEM_BRAKE_CONTROL:
00797 s = new CBrakeControl;
00798 break;
00799
00800
00801
00802
00803
00804 case SUBSYSTEM_NAV_RADIO:
00805 s = new CNavRadio;
00806 break;
00807
00808 case SUBSYSTEM_RNAV_RADIO:
00809 s = new CRnavRadio;
00810 break;
00811
00812 case SUBSYSTEM_COMM_RADIO:
00813 s = new CCommRadio;
00814 break;
00815
00816 case SUBSYSTEM_TRANSPONDER_RADIO:
00817 s = new CTransponderRadio;
00818 break;
00819
00820 case SUBSYSTEM_ADF_RADIO:
00821 s = new CADFRadio;
00822 break;
00823
00824 case SUBSYSTEM_KLN89_GPS_RADIO:
00825 s = new CBKKLN89GPSRadio;
00826 break;
00827
00828 case SUBSYSTEM_KX155_RADIO:
00829 s = new CBKKX155Radio;
00830 break;
00831
00832 case SUBSYSTEM_KT76_RADIO:
00833 s = new CBKKT76Radio;
00834 break;
00835
00836 case SUBSYSTEM_KAP140_RADIO:
00837 s = new CBKKAP140Radio;
00838 break;
00839
00840 case SUBSYSTEM_AUDIO_PANEL_RADIO:
00841 s = new CAudioPanelRadio;
00842 break;
00843
00844
00845
00846
00847
00848 case SUBSYSTEM_FUEL_MATH:
00849
00850
00851
00852 SkipObject (stream);
00853 rc = TAG_READ;
00854 break;
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
00936
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978
00979
00980
00981
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006
01007
01008
01009
01010
01011
01012
01013
01014
01015
01016
01017
01018
01019
01020
01021
01022
01023
01024
01025
01026
01027
01028
01029
01030
01031
01032
01033
01034
01035
01036
01037
01038
01039
01040
01041
01042
01043
01044
01045
01046
01047
01048
01049
01050
01051
01052
01053
01054
01055
01056
01057
01058
01059
01060
01061
01062
01063
01064
01065
01066
01067
01068
01069
01070
01071
01072
01073
01074
01075
01076
01077
01078
01079
01080
01081
01082
01083
01084
01085
01086
01087
01088
01089
01090
01091
01092
01093
01094
01095
01096
01097
01098
01099
01100
01101
01102
01103
01104
01105
01106
01107
01108
01109
01110
01111
01112
01113
01114
01115
01116
01117
01118
01119
01120
01121
01122
01123
01124
01125
01126
01127
01128
01129
01130
01131
01132
01133
01134
01135
01136
01137
01138
01139
01140
01141
01142
01143
01144
01145
01146
01147
01148
01149
01150
01151
01152
01153
01154
01155
01156
01157
01158
01159
01160
01161
01162
01163
01164
01165
01166
01167
01168
01169
01170
01171
01172
01173
01174
01175
01176
01177
01178
01179
01180
01181
01182
01183
01184
01185
01186
01187
01188
01189
01190
01191
01192
01193
01194
01195
01196
01197
01198
01199
01200
01201
01202
01203
01204
01205
01206
01207
01208
01209
01210
01211
01212
01213
01214
01215
01216
01217
01218
01219
01220
01221
01222
01223
01224
01225
01226
01227
01228
01229
01230
01231
01232
01233
01234
01235
01236
01237
01238
01239
01240
01241
01242
01243
01244
01245
01246
01247
01248
01249
01250
01251
01252
01253
01254
01255
01256
01257
01258
01259
01260
01261
01262
01263
01264
01265
01266
01267
01268
01269
01270
01271
01272
01273
01274
01275
01276
01277
01278
01279
01280
01281
01282
01283
01284
01285
01286
01287
01288
01289
01290
01291
01292
01293
01294
01295
01296
01297
01298
01299
01300
01301
01302
01303
01304
01305
01306
01307
01308
01309
01310
01311
01312
01313
01314
01315
01316
01317
01318
01319
01320
01321
01322
01323
01324
01325
01326
01327
01328
01329
01330
01331
01332
01333
01334
01335
01336
01337
01338
01339
01340
01341
01342
01343
01344
01345
01346
01347
01348
01349
01350
01351
01352
01353
01354
01355
01356
01357
01358
01359
01360
01361
01362
01363
01364
01365
01366
01367
01368
01369
01370
01371
01372
01373
01374
01375
01376
01377
01378
01379
01380
01381
01382
01383
01384
01385
01386
01387
01388
01389
01390
01391
01392
01393
01394
01395
01396
01397
01398
01399
01400
01401
01402
01403
01404
01405
01406
01407
01408
01409
01410
01411
01412
01413
01414
01415
01416
01417
01418
01419
01420
01421
01422
01423
01424
01425
01426
01427
01428
01429
01430
01431
01432
01433
01434
01435
01436
01437
01438
01439
01440
01441
01442
01443
01444
01445
01446
01447
01448
01449
01450
01451
01452
01453
01454
01455
01456
01457
01458
01459
01460
01461
01462
01463
01464
01465
01466
01467
01468
01469
01470
01471
01472
01473
01474
01475
01476
01477
01478
01479
01480
01481
01482
01483
01484
01485
01486
01487
01488
01489
01490
01491
01492
01493
01494
01495
01496
01497
01498
01499
01500
01501
01502
01503
01504
01505
01506
01507
01508
01509
01510
01511
01512
01513
01514
01515
01516
01517
01518
01519
01520
01521
01522
01523
01524
01525
01526
01527
01528
01529
01530
01531
01532
01533
01534
01535
01536
01537
01538
01539
01540
01541
01542
01543
01544
01545
01546
01547
01548
01549
01550
01551
01552
01553
01554
01555
01556
01557
01558
01559
01560
01561
01562
01563
01564
01565
01566
01567
01568
01569
01570
01571
01572
01573
01574
01575
01576
01577
01578
01579
01580
01581
01582
01583
01584
01585
01586
01587
01588
01589
01590
01591
01592
01593
01594
01595
01596
01597
01598
01599
01600
01601
01602
01603
01604
01605
01606
01607
01608
01609
01610
01611
01612
01613
01614
01615
01616
01617
01618
01619
01620
01621
01622
01623
01624
01625
01626
01627
01628
01629
01630
01631
01632
01633
01634
01635
01636
01637
01638
01639
01640
01641
01642
01643
01644
01645
01646
01647
01648
01649
01650
01651
01652
01653
01654
01655
01656
01657
01658
01659
01660
01661
01662
01663
01664
01665
01666
01667
01668
01669 default:
01670
01671 SkipObject (stream);
01672 globals->logWarning->Write ("CElectricalSystem::Read : Skipping object %s",
01673 tag_string);
01674 rc = TAG_READ;
01675
01676 }
01677
01678
01679 if (s != NULL) {
01680 ReadFrom (s, stream);
01681 subs.push_back (s);
01682
01683 rc = TAG_READ;
01684 }
01685
01686 break;
01687
01688 }
01689 }
01690
01691 if (rc != TAG_READ) {
01692
01693 char s[16];
01694 TagToString (s, tag);
01695 globals->logWarning->Write ("CElectricalSystem::Read : Unrecognized tag <%s>", s);
01696 }
01697
01698 return rc;
01699 }
01700
01701
01702 void CElectricalSystem::ReadFinished (void)
01703 {
01704
01705 }
01706
01707 void CElectricalSystem::Write (SStream *stream)
01708 {
01709 }
01710
01711
01712
01713
01714
01715
01716
01717
01718
01719
01720
01721
01722
01723
01724
01725
01726
01727
01728
01729
01730
01731
01732
01733
01734
01735
01736
01737
01738
01739
01740
01741
01742
01743
01744
01745
01746
01747
01748
01749
01750
01751
01752
01753
01754
01755
01756
01757 void CElectricalSystem::Timeslice (float dT)
01758 {
01759
01760 vector<CSubsystem*>::iterator i;
01761 for (i=subs.begin(); i!=subs.end(); i++) {
01762 CSubsystem *s = *i;
01763 if (!s->IsType (SUBSYSTEM_BASE)) {
01764 CDependent *d = (CDependent *)s;
01765 d->SetEvaluated (EVAL_UNKNOWN);
01766 }
01767 }
01768
01769
01770 for (i=subs.begin(); i!=subs.end(); i++) {
01771 CSubsystem *s = *i;
01772 s->TimeSlice (dT);
01773 }
01774 }
01775
01776
01777 void CElectricalSystem::Print (FILE *f)
01778 {
01779 fprintf (f, "Electrical System:\n\n");
01780
01781
01782 vector<CSubsystem*>::iterator i;
01783 for (i=subs.begin(); i!=subs.end(); i++) {
01784 CSubsystem *s = *i;
01785 fprintf (f, "---------------------------------------------------------------------\n");
01786 s->Print (f);
01787 fprintf (f, "\n");
01788 }
01789 }
01790
01791
01792
01793
01794
01795
01796 CPitotStaticSystem::CPitotStaticSystem (const char* pssFilename)
01797 {
01798 SStream s;
01799 strcpy (s.filename, "World\\");
01800 strcat (s.filename, pssFilename);
01801 strcpy (s.mode, "r");
01802 if (OpenStream (&s)) {
01803 ReadFrom (this, &s);
01804 CloseStream (&s);
01805 }
01806 }
01807
01808 CPitotStaticSystem::~CPitotStaticSystem (void)
01809 {
01810 vector<CPitotStaticPort*>::iterator i;
01811 for (i=ports.begin(); i!=ports.end(); i++) delete *i;
01812 }
01813
01814 int CPitotStaticSystem::Read (SStream *stream, Tag tag)
01815 {
01816 int rc = TAG_IGNORED;
01817
01818 switch (tag) {
01819 case 'iceT':
01820
01821 ReadFloat (&iceT, stream);
01822 rc = TAG_READ;
01823 break;
01824
01825 case 'port':
01826
01827 {
01828 CPitotStaticPort *port = new CPitotStaticPort;
01829 ReadFrom (port, stream);
01830 ports.push_back (port);
01831
01832 rc = TAG_READ;
01833 }
01834 break;
01835 }
01836
01837 if (rc != TAG_READ) {
01838
01839 char s[16];
01840 TagToString (s, tag);
01841 globals->logWarning->Write ("CPitotStaticSystem::Read : Unrecognized tag <%s>", s);
01842 }
01843
01844 return rc;
01845 }
01846
01847
01848 void CPitotStaticSystem::ReadFinished (void)
01849 {
01850
01851 }
01852
01853
01854 void CPitotStaticSystem::Write (SStream *stream)
01855 {
01856
01857 }
01858
01859
01860
01861
01862
01863 CGroundSuspension::CGroundSuspension (const char* whlFilename)
01864 {
01865 SStream s;
01866 strcpy (s.filename, "World\\");
01867 strcat (s.filename, whlFilename);
01868 strcpy (s.mode, "r");
01869 if (OpenStream (&s)) {
01870 ReadFrom (this, &s);
01871 CloseStream (&s);
01872 }
01873 }
01874
01875
01876 int CGroundSuspension::Read (SStream *stream, Tag tag)
01877 {
01878 int rc = TAG_IGNORED;
01879
01880 if (rc != TAG_READ) {
01881
01882 char s[16];
01883 TagToString (s, tag);
01884 globals->logWarning->Write ("CGroundSuspension::Read : Unrecognized tag <%s>", s);
01885 }
01886
01887 return rc;
01888 }
01889
01890
01891 void CGroundSuspension::ReadFinished (void)
01892 {
01893
01894 }
01895
01896
01897 void CGroundSuspension::Write (SStream *stream)
01898 {
01899
01900 }
01901
01902
01903
01904
01905
01906 CLoadoutUnit::CLoadoutUnit (void)
01907 {
01908 strcpy (name, "");
01909 bPos.x = 0; bPos.y = 0; bPos.z = 0;
01910 load = 0;
01911 hiLm = 0;
01912 strcpy (utyp, "");
01913 }
01914
01915 int CLoadoutUnit::Read (SStream *stream, Tag tag)
01916 {
01917 int rc = TAG_IGNORED;
01918
01919 switch (tag) {
01920 case 'name':
01921
01922 ReadString (name, 64, stream);
01923 rc = TAG_READ;
01924 break;
01925
01926 case 'bPos':
01927
01928 ReadVector (&bPos, stream);
01929 rc = TAG_READ;
01930 break;
01931
01932 case 'load':
01933
01934 ReadFloat (&load, stream);
01935 rc = TAG_READ;
01936 break;
01937
01938 case 'hiLm':
01939
01940 ReadFloat (&hiLm, stream);
01941 rc = TAG_READ;
01942 break;
01943
01944 case 'utyp':
01945
01946 ReadString (utyp, 64, stream);
01947 rc = TAG_READ;
01948 break;
01949 }
01950
01951 if (rc != TAG_READ) {
01952
01953 char s[16];
01954 TagToString (s, tag);
01955 globals->logWarning->Write ("CLoadoutUnit::Read : Unrecognized tag <%s>", s);
01956 }
01957
01958 return rc;
01959 }
01960
01961 void CLoadoutUnit::ReadFinished (void)
01962 {
01963
01964 }
01965
01966
01967 void CLoadoutUnit::Write (SStream *stream)
01968 {
01969
01970 }
01971
01972
01973
01974
01975
01976 CVariableLoadouts::CVariableLoadouts (const char* vldFilename)
01977 {
01978 SStream s;
01979 strcpy (s.filename, "World\\");
01980 strcat (s.filename, vldFilename);
01981 strcpy (s.mode, "r");
01982 if (OpenStream (&s)) {
01983 ReadFrom (this, &s);
01984 CloseStream (&s);
01985 }
01986 }
01987
01988 CVariableLoadouts::~CVariableLoadouts(void)
01989 {
01990 vector<CLoadoutUnit*>::iterator i;
01991 for (i=unit.begin(); i!=unit.end(); i++) delete *i;
01992 }
01993
01994 int CVariableLoadouts::Read (SStream *stream, Tag tag)
01995 {
01996 int rc = TAG_IGNORED;
01997
01998 switch (tag) {
01999 case 'unit':
02000 {
02001
02002 CLoadoutUnit *newUnit = new CLoadoutUnit;
02003 ReadFrom (newUnit, stream);
02004 unit.push_back (newUnit);
02005
02006 }
02007 rc = TAG_READ;
02008 break;
02009 }
02010
02011 if (rc != TAG_READ) {
02012
02013 char s[16];
02014 TagToString (s, tag);
02015 globals->logWarning->Write ("CVariableLoadouts::Read : Unrecognized tag <%s>", s);
02016 }
02017
02018 return rc;
02019 }
02020
02021 void CVariableLoadouts::ReadFinished (void)
02022 {
02023
02024 }
02025
02026
02027 void CVariableLoadouts::Write (SStream *stream)
02028 {
02029
02030 }
02031
02032
02033
02034
02035
02036 CCockpitManager::CCockpitManager (const char* pitFilename)
02037 {
02038
02039 pPanel = NULL;
02040
02041
02042 SStream s;
02043 strcpy (s.filename, "World\\");
02044 strcat (s.filename, pitFilename);
02045 strcpy (s.mode, "r");
02046 if (OpenStream (&s)) {
02047 ReadFrom (this, &s);
02048 CloseStream (&s);
02049 }
02050 }
02051
02052 CCockpitManager::~CCockpitManager (void)
02053 {
02054 map<Tag,CPanel*>::iterator i;
02055 for (i=ckpt.begin(); i!=ckpt.end(); i++) {
02056 delete i->second;
02057 }
02058 }
02059
02060 int CCockpitManager::Read (SStream *stream, Tag tag)
02061 {
02062 int rc = TAG_IGNORED;
02063
02064 switch (tag) {
02065 case 'ckmg':
02066
02067 rc = TAG_READ;
02068 break;
02069
02070 case 'bgno':
02071 case 'endo':
02072
02073 rc = TAG_READ;
02074 break;
02075
02076 case 'ckpt':
02077 {
02078
02079 Tag panelId;
02080 ReadTag (&panelId, stream);
02081 char filename[64];
02082 ReadString (filename, 64, stream);
02083
02084
02085 map<Tag,CPanel*>::iterator i = ckpt.find(panelId);
02086 if (i==ckpt.end()) {
02087
02088 char *mark3 = new char[32];
02089 strcpy (mark3, "panel start");
02090 CPanel* panel = new CPanel (panelId, filename);
02091 char *mark4 = new char[32];
02092 strcpy (mark4, "panel end");
02093 ckpt[panelId] = panel;
02094 } else {
02095
02096 gtfo ("CCockpitManager : Duplicate panel tag : 0x%08X", panelId);
02097 }
02098 }
02099 rc = TAG_READ;
02100 break;
02101 }
02102
02103 if (rc != TAG_READ) {
02104
02105 char s[16];
02106 TagToString (s, tag);
02107 globals->logWarning->Write ("CCockpitManager::Read : Unrecognized tag <%s>", s);
02108 }
02109
02110 return rc;
02111 }
02112
02113
02114 void CCockpitManager::ReadFinished ()
02115 {
02116 }
02117
02118
02119 CPanel* CCockpitManager::GetCurrentPanel (void)
02120 {
02121 return pPanel;
02122 }
02123
02124
02125 void CCockpitManager::SetPanel (Tag tag)
02126 {
02127
02128 if (pPanel != NULL) {
02129 pPanel->Deactivate ();
02130 }
02131
02132
02133 map<Tag,CPanel*>::iterator i = ckpt.find(tag);
02134 if (i!=ckpt.end()) pPanel = i->second;
02135
02136
02137 if (pPanel != NULL) {
02138 pPanel->Activate ();
02139 }
02140 }
02141
02142
02143 Tag CCockpitManager::GetPanel (void)
02144 {
02145 Tag rc = 0;
02146
02147 if (pPanel != NULL) {
02148 rc = pPanel->GetId ();
02149 }
02150
02151 return rc;
02152 }
02153
02154
02155 void CCockpitManager::Draw (void)
02156 {
02157 if (pPanel != NULL) {
02158
02159 pPanel->Draw ();
02160 }
02161 }
02162
02163
02164
02165
02166
02167 CCameraManager::CCameraManager (const char* camFilename)
02168 {
02169
02170 defaultCamera = CAMERA_SPOT;
02171
02172 SStream s;
02173 strcpy (s.filename, "World\\");
02174 strcat (s.filename, camFilename);
02175 strcpy (s.mode, "r");
02176 if (OpenStream (&s)) {
02177 ReadFrom (this, &s);
02178 CloseStream (&s);
02179 } else {
02180 globals->logWarning->Write ("CCameraManager : Cannot open .CAM file %s", camFilename);
02181 }
02182 }
02183
02184 CCameraManager::~CCameraManager (void)
02185 {
02186 vector<CCamera*>::iterator i;
02187 for (i=came.begin(); i!=came.end(); i++) delete *i;
02188 }
02189
02190 int CCameraManager::Read (SStream *stream, Tag tag)
02191 {
02192 int rc = TAG_IGNORED;
02193
02194 switch (tag) {
02195 case 'came':
02196
02197 {
02198 Tag type;
02199 ReadTag (&type, stream);
02200 switch (type) {
02201 case CAMERA_COCKPIT:
02202
02203 {
02204 CCameraCockpit *cock = new CCameraCockpit;
02205 ReadFrom (cock, stream);
02206 came.push_back(cock);
02207
02208
02209 defaultCamera = CAMERA_COCKPIT;
02210 }
02211 break;
02212
02213 default:
02214 char s[16];
02215 TagToString (s, type);
02216 globals->logWarning->Write ("CCameraManager::Read : Unknown camera type %s", s);
02217 }
02218 }
02219 rc = TAG_READ;
02220 break;
02221 }
02222
02223 if (rc != TAG_READ) {
02224
02225 char s[16];
02226 TagToString (s, tag);
02227 globals->logWarning->Write ("CCameraManager::Read : Unrecognized tag <%s>", s);
02228 }
02229
02230 return rc;
02231 }
02232
02233 void CCameraManager::ReadFinished (void)
02234 {
02235
02236 CCameraSpot *spot = new CCameraSpot;
02237 came.push_back (spot);
02238
02239 CCameraFlyby *flyby = new CCameraFlyby;
02240 came.push_back (flyby);
02241
02242 CCameraObserver *observer = new CCameraObserver;
02243 came.push_back (observer);
02244
02245 CCameraTower *tower = new CCameraTower;
02246 came.push_back (tower);
02247
02248 CCameraOverhead *over = new CCameraOverhead;
02249 came.push_back (over);
02250
02251
02252 SelectCamera (defaultCamera);
02253 }
02254
02255 void CCameraManager::UpdateCamera (SPosition *targetPosition, SVector *targetOrientation,
02256 SPosition *eyePosition, SVector *eyeOrientation,
02257 const float dT)
02258 {
02259
02260 CCamera *cam = *iActive;
02261 cam->UpdateCamera (targetPosition, targetOrientation,
02262 eyePosition, eyeOrientation, dT);
02263
02264
02265 tgtPos = *targetPosition;
02266 tgtOrient = *targetOrientation;
02267 eyePos = *eyePosition;
02268 eyeOrient = *eyeOrientation;
02269 }
02270
02271 inline CCamera* CCameraManager::GetActiveCamera (void)
02272 {
02273 return *iActive;
02274 }
02275
02276 void CCameraManager::ActivateCamera (void)
02277 {
02278 if (*iActive != NULL) {
02279
02280 char name[64];
02281 (*iActive)->GetCameraName (name, 64);
02282 DrawNoticeToUser (name, 5);
02283 } else {
02284 gtfo ("CCameraManager::ActivateCamera : No valid active camera");
02285 }
02286 }
02287
02288
02289 void CCameraManager::SelectCamera (Tag id)
02290 {
02291
02292 int count = 0;
02293 vector<CCamera*>::iterator i;
02294 for (i=came.begin(); i!=came.end(); i++, count++) {
02295 if ((*i)->GetCameraType() == id) {
02296 iActive = i;
02297 ActivateCamera ();
02298 }
02299 }
02300 }
02301
02302 void CCameraManager::NextCamera (void)
02303 {
02304 if (iActive == came.begin()) {
02305
02306 iActive = came.end();
02307 }
02308 iActive--;
02309
02310 ActivateCamera ();
02311 }
02312
02313 void CCameraManager::PrevCamera (void)
02314 {
02315 iActive++;
02316 if (iActive == came.end()) {
02317
02318 iActive = came.begin();
02319 }
02320
02321 ActivateCamera ();
02322 }
02323
02324 void CCameraManager::Print (FILE *f)
02325 {
02326 char debug[256];
02327
02328 fprintf (f, "Camera Manager:\n\n");
02329
02330
02331 CCamera* camera = GetActiveCamera();
02332 Tag tag = camera->GetCameraType ();
02333 char sTag[8];
02334 TagToString (sTag, tag);
02335 char name[80];
02336 camera->GetCameraName (name, 80);
02337 SVector offset;
02338 camera->GetCameraOffset (&offset);
02339
02340 fprintf (f, "Current Camera : '%4s' %s\n", sTag, name);
02341 fprintf (f, " Offset : x=%6.3f y=%6.3f z=%6.3f\n",
02342 offset.x, offset.y, offset.z);
02343 fprintf (f, "\n");
02344
02345
02346 fprintf (f, "Eye:\n");
02347 FormatPosition (eyePos, debug);
02348 fprintf (f, " Pos %-40s\n", debug);
02349 SVector v = PosToScaledFlatCartesianQgt (eyePos);
02350
02351
02352
02353 fprintf (f, " x = %12.6f y = %12.6f z = %12.6f\n", v.x, v.y, v.z);
02354 fprintf (f, "\n");
02355
02356
02357 fprintf (f, "Orientation :\n");
02358 fprintf (f, " Heading Pitch Roll\n");
02359 fprintf (f, " Rad %6.3f %6.3f %6.3f\n",
02360 eyeOrient.h, eyeOrient.p, eyeOrient.r);
02361 fprintf (f, " Deg %6.3f %6.3f %6.3f\n",
02362 RadToDeg (eyeOrient.h), RadToDeg (eyeOrient.p), RadToDeg (eyeOrient.r));
02363 fprintf (f, "\n");
02364
02365
02366 fprintf (f, "Target:\n");
02367 FormatPosition (tgtPos, debug);
02368 fprintf (f, " Pos %-40s\n", debug);
02369 v = PosToScaledFlatCartesianQgt (tgtPos);
02370
02371
02372
02373 fprintf (f, " x = %12.6f y = %12.6f z = %12.6f\n", v.x, v.y, v.z);
02374 fprintf (f, "\n");
02375
02376
02377 fprintf (f, "Orientation :\n");
02378 fprintf (f, " Heading Pitch Roll\n");
02379 fprintf (f, " Rad %6.3f %6.3f %6.3f\n",
02380 tgtOrient.h, tgtOrient.p, tgtOrient.r);
02381 fprintf (f, " Deg %6.3f %6.3f %6.3f\n",
02382 RadToDeg (tgtOrient.h), RadToDeg (tgtOrient.p), RadToDeg (tgtOrient.r));
02383 fprintf (f, "\n");
02384 }
02385
02386
02387
02388
02389
02390
02391 CLevelOfDetail::CLevelOfDetail (const char* lodFilename)
02392 {
02393 daynight = new ssgSelector (2);
02394 daynight->setName ("day_night");
02395
02396 day = new ssgSelector ();
02397 day->setName ("day");
02398
02399 night = new ssgSelector ();
02400 night->setName ("night");
02401
02402 daynight->addKid (day);
02403 daynight->addKid (night);
02404
02405 shadowAcm = NULL;
02406
02407 SStream s;
02408 strcpy (s.filename, "World\\");
02409 strcat (s.filename, lodFilename);
02410 strcpy (s.mode, "r");
02411 if (OpenStream (&s)) {
02412 ReadFrom (this, &s);
02413 CloseStream (&s);
02414 }
02415 }
02416
02417 CLevelOfDetail::~CLevelOfDetail (void)
02418 {
02419
02420
02421 vector<CModelACM*>::iterator i;
02422 for (i=modelAcm.begin(); i!=modelAcm.end(); i++) delete *i;
02423
02424 if (shadowAcm != NULL) delete shadowAcm;
02425 }
02426
02427 int CLevelOfDetail::Read (SStream *stream, Tag tag)
02428 {
02429 int rc = TAG_IGNORED;
02430
02431 static bool dayTag = false;
02432 static bool nightTag = false;
02433 static bool dayModels = false;
02434 static bool nightModels = false;
02435
02436 switch (tag) {
02437 case 'dlod':
02438
02439
02440 dayTag = true;
02441 rc = TAG_READ;
02442 break;
02443
02444 case 'nlod':
02445
02446
02447 nightTag = true;
02448 rc = TAG_READ;
02449 break;
02450
02451 case 'bgno':
02452 if (dayTag) {
02453
02454 dayTag = false;
02455 dayModels = true;
02456 rc = TAG_READ;
02457 } else if (nightTag) {
02458
02459 nightTag = false;
02460 nightModels = true;
02461 rc = TAG_READ;
02462 }
02463 break;
02464
02465 case 'endo':
02466
02467 if (dayModels) {
02468
02469 dayModels = false;
02470 rc = TAG_READ;
02471 } else if (nightModels) {
02472
02473 nightModels = false;
02474 rc = TAG_READ;
02475 } else {
02476
02477
02478 globals->logWarning->Write ("CLevelOfDetail::Read : Premature <endo>");
02479 }
02480 break;
02481
02482 case 'mod2':
02483 {
02484
02485 char type[64];
02486 ReadString (type, 64, stream);
02487 Tag typeTag = StringToTag (type);
02488
02489 char filename[64];
02490 ReadString (filename, 64, stream);
02491 char fullname[64];
02492 strcpy (fullname, "Models\\");
02493 strcat (fullname, filename);
02494
02495
02496
02497 switch (typeTag) {
02498 case 'comp':
02499 {
02501 CModelACM *tempAcm = new CModelACM (fullname);
02502 modelAcm.push_back (tempAcm);
02503 day->addKid (tempAcm->GetSSGEntity());
02504 }
02505 break;
02506 }
02507
02508
02509 unsigned int lod;
02510 ReadUInt (&lod, stream);
02511
02512 rc = TAG_READ;
02513 }
02514 break;
02515
02516 case 'shad':
02517 {
02518
02519 char type[64];
02520 ReadString (type, 64, stream);
02521 Tag typeTag = StringToTag (type);
02522
02523 char filename[64];
02524 ReadString (filename, 64, stream);
02525
02526
02527
02528 switch (typeTag) {
02529 case 'comp':
02530 shadowAcm = new CModelACM (filename);
02531 day->addKid (shadowAcm->GetSSGEntity());
02532 break;
02533 }
02534
02535 rc = TAG_READ;
02536 }
02537 break;
02538 }
02539
02540 if (rc != TAG_READ) {
02541
02542 char s[16];
02543 TagToString (s, tag);
02544 globals->logWarning->Write ("CLevelOfDetail::Read : Unrecognized tag <%s>", s);
02545 }
02546
02547 return rc;
02548 }
02549
02550
02551 ssgEntity *CLevelOfDetail::GetSSGEntity (void)
02552 {
02553 return daynight;
02554 }
02555
02556
02557
02558
02559
02560
02561 CRadioManager::CRadioManager (const char* rdoFilename)
02562 {
02563 SStream s;
02564 strcpy (s.filename, "World\\");
02565 strcat (s.filename, rdoFilename);
02566 strcpy (s.mode, "r");
02567 if (OpenStream (&s)) {
02568 ReadFrom (this, &s);
02569 CloseStream (&s);
02570 }
02571 }
02572
02573
02574
02575
02576
02577
02578
02579
02580 int CRadioManager::Read (SStream *stream, Tag tag)
02581 {
02582 int rc = TAG_IGNORED;
02583
02584 switch (tag) {
02585 case 'rdio':
02586 {
02587 char type_string[64];
02588 ReadString (type_string, 64, stream);
02589 Tag type = StringToTag (type_string);
02590
02591
02592 switch (type) {
02593
02594 case SUBSYSTEM_NAV_RADIO:
02595
02596 break;
02597
02598 case SUBSYSTEM_RNAV_RADIO:
02599
02600 break;
02601
02602 case SUBSYSTEM_COMM_RADIO:
02603
02604 break;
02605
02606 case SUBSYSTEM_TRANSPONDER_RADIO:
02607
02608 break;
02609
02610 case SUBSYSTEM_ADF_RADIO:
02611
02612 break;
02613
02614 case SUBSYSTEM_KLN89_GPS_RADIO:
02615
02616 break;
02617
02618 case SUBSYSTEM_KX155_RADIO:
02619
02620 break;
02621
02622 case SUBSYSTEM_KT76_RADIO:
02623
02624 break;
02625
02626 case SUBSYSTEM_KAP140_RADIO:
02627
02628 break;
02629
02630 case SUBSYSTEM_AUDIO_PANEL_RADIO:
02631
02632 break;
02633
02634 default:
02635 globals->logWarning->Write ("CRadioManager : Unknown radio type %s",
02636 type_string);
02637 }
02638
02639 unsigned int group;
02640 ReadUInt (&group, stream);
02641 rc = TAG_READ;
02642
02643
02644
02645
02646 }
02647 }
02648
02649 if (rc != TAG_READ) {
02650
02651 char s[16];
02652 TagToString (s, tag);
02653 globals->logWarning->Write ("CRadioManager::Read : Unrecognized tag <%s>", s);
02654 }
02655
02656 return rc;
02657 }
02658
02659
02660
02661
02662
02663
02664
02665 CExternalLights::CExternalLights (const char* eltFilename)
02666 {
02667 SStream s;
02668 strcpy (s.filename, "World\\");
02669 strcat (s.filename, eltFilename);
02670 strcpy (s.mode, "r");
02671 if (OpenStream (&s)) {
02672 ReadFrom (this, &s);
02673 CloseStream (&s);
02674 }
02675 }
02676
02677
02678 int CExternalLights::Read (SStream *stream, Tag tag)
02679 {
02680 int rc = TAG_IGNORED;
02681
02682
02683 if (rc != TAG_READ) {
02684
02685 char s[16];
02686 TagToString (s, tag);
02687 globals->logWarning->Write ("CExternalLights::Read : Unrecognized tag <%s>", s);
02688 }
02689
02690 return rc;
02691 }
02692
02693
02694 void CExternalLights::ReadFinished (void)
02695 {
02696
02697 }
02698
02699
02700 void CExternalLights::Write (SStream *stream)
02701 {
02702
02703 }
02704
02705
02706
02707
02708
02709
02710 CEngineManager::CEngineManager (const char* ngnFilename)
02711 {
02712 SStream s;
02713 strcpy (s.filename, "World\\");
02714 strcat (s.filename, ngnFilename);
02715 strcpy (s.mode, "r");
02716 if (OpenStream (&s)) {
02717 ReadFrom (this, &s);
02718 CloseStream (&s);
02719 }
02720 }
02721
02722
02723 int CEngineManager::Read (SStream *stream, Tag tag)
02724 {
02725 int rc = TAG_IGNORED;
02726
02727
02728 if (rc != TAG_READ) {
02729
02730 char s[16];
02731 TagToString (s, tag);
02732 globals->logWarning->Write ("CEngineManager::Read : Unrecognized tag <%s>", s);
02733 }
02734
02735 return rc;
02736 }
02737
02738
02739 void CEngineManager::ReadFinished (void)
02740 {
02741
02742 }
02743
02744
02745 void CEngineManager::Write (SStream *stream)
02746 {
02747
02748 }
02749
02750
02751
02752
02753
02754
02755 CControlMixer::CControlMixer (const char* mixFilename)
02756 {
02757 SStream s;
02758 strcpy (s.filename, "World\\");
02759 strcat (s.filename, mixFilename);
02760 strcpy (s.mode, "r");
02761 if (OpenStream (&s)) {
02762 ReadFrom (this, &s);
02763 CloseStream (&s);
02764 }
02765 }
02766
02767
02768 int CControlMixer::Read (SStream *stream, Tag tag)
02769 {
02770 int rc = TAG_IGNORED;
02771
02772
02773 if (rc != TAG_READ) {
02774
02775 char s[16];
02776 TagToString (s, tag);
02777 globals->logWarning->Write ("CControlMixer::Read : Unrecognized tag <%s>", s);
02778 }
02779
02780 return rc;
02781 }
02782
02783
02784 void CControlMixer::ReadFinished (void)
02785 {
02786
02787 }
02788
02789
02790 void CControlMixer::Write (SStream *stream)
02791 {
02792
02793 }
02794
02795
02796
02797
02798
02799
02800 CChecklists::CChecklists (const char* cklFilename)
02801 {
02802 SStream s;
02803 strcpy (s.filename, "World\\");
02804 strcat (s.filename, cklFilename);
02805 strcpy (s.mode, "r");
02806 if (OpenStream (&s)) {
02807 ReadFrom (this, &s);
02808 CloseStream (&s);
02809 }
02810 }
02811
02812
02813 int CChecklists::Read (SStream *stream, Tag tag)
02814 {
02815 int rc = TAG_IGNORED;
02816
02817
02818 if (rc != TAG_READ) {
02819
02820 char s[16];
02821 TagToString (s, tag);
02822 globals->logWarning->Write ("CChecklists::Read : Unrecognized tag <%s>", s);
02823 }
02824
02825 return rc;
02826 }
02827
02828
02829 void CChecklists::ReadFinished (void)
02830 {
02831
02832 }
02833
02834
02835 void CChecklists::Write (SStream *stream)
02836 {
02837
02838 }
02839
02840
02841
02842
02843
02844
02845 CFlightControlSystem::CFlightControlSystem (const char* fcsFilename)
02846 {
02847 SStream s;
02848 strcpy (s.filename, "World\\");
02849 strcat (s.filename, fcsFilename);
02850 strcpy (s.mode, "r");
02851 if (OpenStream (&s)) {
02852 ReadFrom (this, &s);
02853 CloseStream (&s);
02854 }
02855 }
02856
02857
02858 int CFlightControlSystem::Read (SStream *stream, Tag tag)
02859 {
02860 int rc = TAG_IGNORED;
02861
02862
02863 if (rc != TAG_READ) {
02864
02865 char s[16];
02866 TagToString (s, tag);
02867 globals->logWarning->Write ("CFlightControlSystem::Read : Unrecognized tag <%s>", s);
02868 }
02869
02870 return rc;
02871 }
02872
02873
02874 void CFlightControlSystem::ReadFinished (void)
02875 {
02876
02877 }
02878
02879
02880 void CFlightControlSystem::Write (SStream *stream)
02881 {
02882
02883 }
02884
02885
02886
02887
02888
02889 CSlopeWindData::CSlopeWindData (const char* swdFilename)
02890 {
02891
02892 }
02893
02894 int CSlopeWindData::Read (SStream *stream, Tag tag)
02895 {
02896 int rc = TAG_IGNORED;
02897
02898 if (rc != TAG_READ) {
02899
02900 char s[16];
02901 TagToString (s, tag);
02902 globals->logWarning->Write ("CSlopeWindData::Read : Unrecognized tag <%s>", s);
02903 }
02904
02905 return rc;
02906 }
02907
02908 void CSlopeWindData::ReadFinished (void)
02909 {
02910
02911 }
02912
02913
02914 void CSlopeWindData::Write (SStream *stream)
02915 {
02916
02917 }