// Set SRB class specs void Atlantis_SRB::clbkSetClassCaps (FILEHANDLE cfg) { extern PARTICLESTREAMSPEC srb_contrail, srb_exhaust; PARTICLESTREAMSPEC srb_bolt = { 0, 8.0, 20, 0.0, 0.1, 0.3, 16, 3.0, PARTICLESTREAMSPEC::EMISSIVE, PARTICLESTREAMSPEC::LVL_LIN, 0, 1, PARTICLESTREAMSPEC::ATM_FLAT, 1, 1 }; SetEnableFocus (false); // SRB cannot receive input focus // *********************** physical parameters ********************************* SetSize (23.0); SetEmptyMass (SRB_EMPTY_MASS); SetCW (0.1, 0.3, 1.4, 1.4); SetCrossSections (_V(162.1,162.1,26.6)); SetRotDrag (_V(0.7,0.7,0.1)); SetPMI (_V(154.3,154.3,1.83)); //SetGravityGradientDamping (10.0); SetTouchdownPoints (tdvtx, ntdvtx); SetLiftCoeffFunc (0); // ************************* docking port ************************************** CreateDock (_V(1.95,0,5),_V(1,0,0),_V(0,0,1)); // ET attachment // ************************* propellant specs ********************************** ph_main = CreatePropellantResource (SRB_MAX_PROPELLANT_MASS); // *********************** thruster definitions ******************************** // main engine th_main = CreateThruster (_V(0,0,-21), THRUSTGIMBAL_LAUNCH, SRB_THRUST_MAX, ph_main, SRB_ISP0, SRB_ISP1); SURFHANDLE tex = oapiRegisterExhaustTexture ("Exhaust2"); srb_exhaust.tex = oapiRegisterParticleTexture ("Contrail2"); AddExhaust (th_main, 16.0, 2.0, tex); AddExhaustStream (th_main, _V(0,0,-30), &srb_contrail); AddExhaustStream (th_main, _V(0,0,-25), &srb_exhaust); // separation bolts th_bolt = CreateThruster (_V(0,0,3.0), _V(-1,0,0), 3e6, ph_main, 1e7); // for simplicity, the separation bolts directly use SRB propellant. We give // them an insanely high ISP to avoid significant propellant drainage AddExhaust (th_bolt, 0.7, 0.1, _V(2.1,0,-8), _V(-1,0,0)); AddExhaust (th_bolt, 0.7, 0.1, _V(2.1,0,11), _V(-1,0,0)); AddExhaustStream (th_bolt, _V(2.1,0,0), &srb_bolt); // ************************ visual parameters ********************************** AddMesh (hSRBMesh); bMainEngine = false; bSeparationEngine = false; bGimbalCmd = false; srbpos = SRB_UNDEFINED; }
// Set vessel class parameters void Dragonfly::SetClassCaps (FILEHANDLE cfg) { int i; SetSize (4.0); SetEmptyMass (EMPTY_MASS); SetCrossSections (_V(23.7,22.5,17.3)); SetPMI (_V(5.4,5.4,2.5)); SetCameraOffset (_V(0,1.5,0)); // ************************* propellant specs ********************************** ph_main = CreatePropellantResource (MAX_MAIN_FUEL); // *********************** thruster definitions ******************************** // thrusters in left pod th_lp[0] = CreateThruster (_V(-3.5,0,0), _V(1,0,0), 2*MAX_RCS_THRUST, ph_main, ISP); th_lp[1] = CreateThruster (_V(-2.98,0,-0.8), _V(0,0,1), MAX_RCS_THRUST, ph_main, ISP); th_lp[2] = CreateThruster (_V(-2.98,0,0.8), _V(0,0,-1), MAX_RCS_THRUST, ph_main, ISP); th_lp[3] = CreateThruster (_V(-2.98,-0.8,0), _V(0,1,0), MAX_RCS_THRUST, ph_main, ISP); th_lp[4] = CreateThruster (_V(-2.98,0.8,0), _V(0,-1,0), MAX_RCS_THRUST, ph_main, ISP); // thrusters in right pod th_rp[0] = CreateThruster (_V(3.5,0,0), _V(-1,0,0), 2*MAX_RCS_THRUST, ph_main, ISP); th_rp[1] = CreateThruster (_V(2.98,0,-0.8), _V(0,0,1), MAX_RCS_THRUST, ph_main, ISP); th_rp[2] = CreateThruster (_V(2.98,0,0.8), _V(0,0,-1), MAX_RCS_THRUST, ph_main, ISP); th_rp[3] = CreateThruster (_V(2.98,-0.8,0), _V(0,1,0), MAX_RCS_THRUST, ph_main, ISP); th_rp[4] = CreateThruster (_V(2.98,0.8,0), _V(0,-1,0), MAX_RCS_THRUST, ph_main, ISP); // thrusters in aft pod (rotational RCS) th_ap[0] = CreateThruster (_V(-0.8,0,-11.1), _V(1,0,0), MAX_RCS_THRUST, ph_main, ISP); th_ap[1] = CreateThruster (_V(0.8,0,-11.1), _V(-1,0,0), MAX_RCS_THRUST, ph_main, ISP); th_ap[2] = CreateThruster (_V(0,-0.8,-11.1), _V(0,1,0), MAX_RCS_THRUST, ph_main, ISP); th_ap[3] = CreateThruster (_V(0,0.8,-11.1), _V(0,-1,0), MAX_RCS_THRUST, ph_main, ISP); // exhaust definitions for left pod AddExhaust (th_lp[0], 1, 0.15, _V(-3.5,0.18,-0.18), _V(-1,0,0)); AddExhaust (th_lp[0], 1, 0.15, _V(-3.5,-0.18,0.18), _V(-1,0,0)); for (i = 1; i < 5; i++) AddExhaust (th_lp[i], 1, 0.15); // exhaust definitions for right pod AddExhaust (th_rp[0], 1, 0.15, _V(3.5,-0.18,-0.18), _V(1,0,0)); AddExhaust (th_rp[0], 1, 0.15, _V(3.5,0.18,0.18), _V(1,0,0)); for (i = 1; i < 5; i++) AddExhaust (th_rp[i], 1, 0.15); // exhaust definitions for aft pod for (i = 0; i < 4; i++) AddExhaust (th_ap[i], 1, 0.15); //thruster definitions. Both manual and "automatic" RCS SetManualRCS(); SetNormalRCS();// // *************************** docking port ************************************ SetDockParams (_V(0,0,3.2), _V(0,0,1), _V(0,1,0)); // ******************************** mesh *************************************** AddMesh (oapiLoadMeshGlobal ("Dragonfly")); };
// -------------------------------------------------------------- // Set the capabilities of the vessel class // -------------------------------------------------------------- void ShuttlePB::clbkSetClassCaps (FILEHANDLE cfg) { THRUSTER_HANDLE th_main, th_hover, th_rcs[14], th_group[4]; // physical vessel parameters SetSize (PB_SIZE); SetEmptyMass (PB_EMPTYMASS); SetPMI (PB_PMI); SetCrossSections (PB_CS); SetRotDrag (PB_RD); SetTouchdownPoints (PB_TDP[0], PB_TDP[1], PB_TDP[2]); // docking port definitions SetDockParams (PB_DOCK_POS, PB_DOCK_DIR, PB_DOCK_ROT); // airfoil definitions CreateAirfoil3 (LIFT_VERTICAL, PB_COP, vlift, NULL, PB_VLIFT_C, PB_VLIFT_S, PB_VLIFT_A); CreateAirfoil3 (LIFT_HORIZONTAL, PB_COP, hlift, NULL, PB_HLIFT_C, PB_HLIFT_S, PB_HLIFT_A); // control surface animations UINT anim_Laileron = CreateAnimation (0.5); UINT anim_Raileron = CreateAnimation (0.5); UINT anim_elevator = CreateAnimation (0.5); AddAnimationComponent (anim_Laileron, 0, 1, &trans_Laileron); AddAnimationComponent (anim_Raileron, 0, 1, &trans_Raileron); AddAnimationComponent (anim_elevator, 0, 1, &trans_Lelevator); AddAnimationComponent (anim_elevator, 0, 1, &trans_Relevator); // aerodynamic control surface defintions CreateControlSurface (AIRCTRL_ELEVATOR, 1.5, 0.7, _V( 0,0,-2.5), AIRCTRL_AXIS_XPOS, anim_elevator); CreateControlSurface (AIRCTRL_AILERON, 1.5, 0.25, _V( 1,0,-2.5), AIRCTRL_AXIS_XPOS, anim_Laileron); CreateControlSurface (AIRCTRL_AILERON, 1.5, 0.25, _V(-1,0,-2.5), AIRCTRL_AXIS_XNEG, anim_Raileron); // propellant resources PROPELLANT_HANDLE hpr = CreatePropellantResource (PB_FUELMASS); // main engine th_main = CreateThruster (_V(0,0,-4.35), _V(0,0,1), PB_MAXMAINTH, hpr, PB_ISP); CreateThrusterGroup (&th_main, 1, THGROUP_MAIN); AddExhaust (th_main, 8, 1, _V(0,0.3,-4.35), _V(0,0,-1)); PARTICLESTREAMSPEC contrail_main = { 0, 5.0, 16, 200, 0.15, 1.0, 5, 3.0, PARTICLESTREAMSPEC::DIFFUSE, PARTICLESTREAMSPEC::LVL_PSQRT, 0, 2, PARTICLESTREAMSPEC::ATM_PLOG, 1e-4, 1 }; PARTICLESTREAMSPEC exhaust_main = { 0, 2.0, 20, 200, 0.05, 0.1, 8, 1.0, PARTICLESTREAMSPEC::EMISSIVE, PARTICLESTREAMSPEC::LVL_SQRT, 0, 1, PARTICLESTREAMSPEC::ATM_PLOG, 1e-5, 0.1 }; AddExhaustStream (th_main, _V(0,0.3,-10), &contrail_main); AddExhaustStream (th_main, _V(0,0.3,-5), &exhaust_main); // hover engine th_hover = CreateThruster (_V(0,-1.5,0), _V(0,1,0), PB_MAXHOVERTH, hpr, PB_ISP); CreateThrusterGroup (&th_hover, 1, THGROUP_HOVER); AddExhaust (th_hover, 8, 1, _V(0,-1.5,1), _V(0,-1,0)); AddExhaust (th_hover, 8, 1, _V(0,-1.5,-1), _V(0,-1,0)); PARTICLESTREAMSPEC contrail_hover = { 0, 5.0, 8, 200, 0.15, 1.0, 5, 3.0, PARTICLESTREAMSPEC::DIFFUSE, PARTICLESTREAMSPEC::LVL_PSQRT, 0, 2, PARTICLESTREAMSPEC::ATM_PLOG, 1e-4, 1 }; PARTICLESTREAMSPEC exhaust_hover = { 0, 2.0, 10, 200, 0.05, 0.05, 8, 1.0, PARTICLESTREAMSPEC::EMISSIVE, PARTICLESTREAMSPEC::LVL_SQRT, 0, 1, PARTICLESTREAMSPEC::ATM_PLOG, 1e-5, 0.1 }; AddExhaustStream (th_hover, _V(0,-3, 1), &contrail_hover); AddExhaustStream (th_hover, _V(0,-3,-1), &contrail_hover); AddExhaustStream (th_hover, _V(0,-2, 1), &exhaust_hover); AddExhaustStream (th_hover, _V(0,-2,-1), &exhaust_hover); // RCS engines th_rcs[ 0] = CreateThruster (_V( 1,0, 3), _V(0, 1,0), PB_MAXRCSTH, hpr, PB_ISP); th_rcs[ 1] = CreateThruster (_V( 1,0, 3), _V(0,-1,0), PB_MAXRCSTH, hpr, PB_ISP); th_rcs[ 2] = CreateThruster (_V(-1,0, 3), _V(0, 1,0), PB_MAXRCSTH, hpr, PB_ISP); th_rcs[ 3] = CreateThruster (_V(-1,0, 3), _V(0,-1,0), PB_MAXRCSTH, hpr, PB_ISP); th_rcs[ 4] = CreateThruster (_V( 1,0,-3), _V(0, 1,0), PB_MAXRCSTH, hpr, PB_ISP); th_rcs[ 5] = CreateThruster (_V( 1,0,-3), _V(0,-1,0), PB_MAXRCSTH, hpr, PB_ISP); th_rcs[ 6] = CreateThruster (_V(-1,0,-3), _V(0, 1,0), PB_MAXRCSTH, hpr, PB_ISP); th_rcs[ 7] = CreateThruster (_V(-1,0,-3), _V(0,-1,0), PB_MAXRCSTH, hpr, PB_ISP); th_rcs[ 8] = CreateThruster (_V( 1,0, 3), _V(-1,0,0), PB_MAXRCSTH, hpr, PB_ISP); th_rcs[ 9] = CreateThruster (_V(-1,0, 3), _V( 1,0,0), PB_MAXRCSTH, hpr, PB_ISP); th_rcs[10] = CreateThruster (_V( 1,0,-3), _V(-1,0,0), PB_MAXRCSTH, hpr, PB_ISP); th_rcs[11] = CreateThruster (_V(-1,0,-3), _V( 1,0,0), PB_MAXRCSTH, hpr, PB_ISP); th_rcs[12] = CreateThruster (_V( 0,0,-3), _V(0,0, 1), PB_MAXRCSTH, hpr, PB_ISP); th_rcs[13] = CreateThruster (_V( 0,0, 3), _V(0,0,-1), PB_MAXRCSTH, hpr, PB_ISP); th_group[0] = th_rcs[0]; th_group[1] = th_rcs[2]; th_group[2] = th_rcs[5]; th_group[3] = th_rcs[7]; CreateThrusterGroup (th_group, 4, THGROUP_ATT_PITCHUP); th_group[0] = th_rcs[1]; th_group[1] = th_rcs[3]; th_group[2] = th_rcs[4]; th_group[3] = th_rcs[6]; CreateThrusterGroup (th_group, 4, THGROUP_ATT_PITCHDOWN); th_group[0] = th_rcs[0]; th_group[1] = th_rcs[4]; th_group[2] = th_rcs[3]; th_group[3] = th_rcs[7]; CreateThrusterGroup (th_group, 4, THGROUP_ATT_BANKLEFT); th_group[0] = th_rcs[1]; th_group[1] = th_rcs[5]; th_group[2] = th_rcs[2]; th_group[3] = th_rcs[6]; CreateThrusterGroup (th_group, 4, THGROUP_ATT_BANKRIGHT); th_group[0] = th_rcs[0]; th_group[1] = th_rcs[4]; th_group[2] = th_rcs[2]; th_group[3] = th_rcs[6]; CreateThrusterGroup (th_group, 4, THGROUP_ATT_UP); th_group[0] = th_rcs[1]; th_group[1] = th_rcs[5]; th_group[2] = th_rcs[3]; th_group[3] = th_rcs[7]; CreateThrusterGroup (th_group, 4, THGROUP_ATT_DOWN); th_group[0] = th_rcs[8]; th_group[1] = th_rcs[11]; CreateThrusterGroup (th_group, 2, THGROUP_ATT_YAWLEFT); th_group[0] = th_rcs[9]; th_group[1] = th_rcs[10]; CreateThrusterGroup (th_group, 2, THGROUP_ATT_YAWRIGHT); th_group[0] = th_rcs[8]; th_group[1] = th_rcs[10]; CreateThrusterGroup (th_group, 2, THGROUP_ATT_LEFT); th_group[0] = th_rcs[9]; th_group[1] = th_rcs[11]; CreateThrusterGroup (th_group, 2, THGROUP_ATT_RIGHT); CreateThrusterGroup (th_rcs+12, 1, THGROUP_ATT_FORWARD); CreateThrusterGroup (th_rcs+13, 1, THGROUP_ATT_BACK); // camera parameters SetCameraOffset (_V(0,0.8,0)); // associate a mesh for the visual AddMesh ("ShuttlePB"); }
rig_t *RigSpawner::SpawnRig() { InitializeRig(); // Vehicle name m_rig->realtruckname = m_file->name; // Flags in root module m_rig->forwardcommands = m_file->forward_commands; m_rig->importcommands = m_file->import_commands; m_rig->wheel_contact_requested = m_file->rollon; m_rig->rescuer = m_file->rescuer; m_rig->disable_default_sounds = m_file->disable_default_sounds; m_rig->hideInChooser = m_file->hide_in_chooser; m_rig->slideNodesConnectInstantly = m_file->slide_nodes_connect_instantly; // Section 'authors' in root module ProcessAuthors(); // Section 'fileinfo' in root module ProcessFileInfo(); // Section 'guid' in root module if (! m_file->guid.empty()) { strncpy(m_rig->guid, m_file->guid.c_str(), 128); } // Section 'minimass' in root module if (m_file->_minimum_mass_set) { m_rig->minimass = m_file->minimum_mass; } // Section 'description' m_rig->description.assign(m_file->description.begin(), m_file->description.end()); // Section 'fileformatversion' in root module m_rig->fileformatversion = m_file->file_format_version; // Section 'managedmaterials' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_MANAGEDMATERIALS, managed_materials, ProcessManagedMaterial); // Section 'gobals' in any module PROCESS_SECTION_IN_ANY_MODULE(RigDef::File::KEYWORD_GLOBALS, globals, ProcessGlobals); // Section 'help' in any module. // NOTE: Must be done before "guisettings" (rig_t::helpmat override) ProcessHelp(); // Section 'engine' in any module PROCESS_SECTION_IN_ANY_MODULE(RigDef::File::KEYWORD_ENGINE, engine, ProcessEngine); // Section 'engoption' in any module PROCESS_SECTION_IN_ANY_MODULE(RigDef::File::KEYWORD_ENGOPTION, engoption, ProcessEngoption); /* Section 'engturbo' in any module */ PROCESS_SECTION_IN_ANY_MODULE(RigDef::File::KEYWORD_ENGTURBO, engturbo, ProcessEngturbo); // Section 'torquecurve' in any module. PROCESS_SECTION_IN_ANY_MODULE(RigDef::File::KEYWORD_TORQUECURVE, torque_curve, ProcessTorqueCurve); // Section 'brakes' in any module PROCESS_SECTION_IN_ANY_MODULE(RigDef::File::KEYWORD_BRAKES, brakes, ProcessBrakes); // Section 'guisettings' in any module PROCESS_SECTION_IN_ANY_MODULE(RigDef::File::KEYWORD_GUISETTINGS, gui_settings, ProcessGuiSettings); // ---------------------------- User-defined nodes ---------------------------- // Sections 'nodes' & 'nodes2' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_NODES, nodes, ProcessNode); // Old-format exhaust (defined by flags 'x/y' in section 'nodes', one per vehicle) if (m_rig->smokeId != 0 && m_rig->smokeRef != 0) { AddExhaust(m_rig->smokeId, m_rig->smokeRef, true, nullptr); } // ---------------------------- Node generating sections ---------------------------- // Section 'cinecam' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_CINECAM, cinecam, ProcessCinecam); // ---------------------------- Wheels (also generate nodes) ---------------------------- // Section 'wheels' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_WHEELS, wheels, ProcessWheel); // Section 'wheels2' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_WHEELS2, wheels_2, ProcessWheel2); // Section 'meshwheels' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_MESHWHEELS, mesh_wheels, ProcessMeshWheel); // Section 'meshwheels2' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_MESHWHEELS2, mesh_wheels_2, ProcessMeshWheel2); // Section 'flexbodywheels' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_FLEXBODYWHEELS, flex_body_wheels, ProcessFlexBodyWheel); // ---------------------------- User-defined beams ---------------------------- // (may reference any generated/user-defined node) // Section 'beams' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_BEAMS, beams, ProcessBeam); // Section 'shocks' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_SHOCKS, shocks, ProcessShock); // Section 'shocks2' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_SHOCKS2, shocks_2, ProcessShock2); // Section 'commands' and 'commands2' (Use generated nodes) PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_COMMANDS2, commands_2, ProcessCommand); // Section 'hydros' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_HYDROS, hydros, ProcessHydro); // Section 'triggers' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_TRIGGERS, triggers, ProcessTrigger); // Section 'ropes' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_ROPES, ropes, ProcessRope); // ---------------------------- Other ---------------------------- // Section 'AntiLockBrakes' in any module. PROCESS_SECTION_IN_ANY_MODULE(RigDef::File::KEYWORD_ANTI_LOCK_BRAKES, anti_lock_brakes, ProcessAntiLockBrakes); // Section 'SlopeBrake' in any module. PROCESS_SECTION_IN_ANY_MODULE(RigDef::File::KEYWORD_SLOPE_BRAKE, slope_brake, ProcessSlopeBrake); // Sections 'flares' and 'flares2' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_FLARES2, flares_2, ProcessFlare2); // Section 'axles' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_AXLES, axles, ProcessAxle); // Section 'submeshes' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_SUBMESH, submeshes, ProcessSubmesh); // Inline-section 'submesh_groundmodel' in any module ProcessSubmeshGroundmodel(); // Section 'contacters' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_CONTACTERS, contacters, ProcessContacter); // Section 'cameras' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_CAMERAS, cameras, ProcessCamera); // Section 'hooks' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_HOOKS, hooks, ProcessHook); // Section 'ties' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_TIES, ties, ProcessTie); // Section 'ropables' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_ROPABLES, ropables, ProcessRopable); // Section 'wings' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_WINGS, wings, ProcessWing); // Section 'animators' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_ANIMATORS, animators, ProcessAnimator); // Section 'materialflarebindings' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_MATERIALFLAREBINDINGS, material_flare_bindings, ProcessMaterialFlareBinding); // Section 'airbrakes' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_AIRBRAKES, airbrakes, ProcessAirbrake); // Section 'fusedrag' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_FUSEDRAG, fusedrag, ProcessFusedrag); // Section 'turbojets' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_TURBOJETS, turbojets, ProcessTurbojet); // Section 'videocamera' // !!! MUST be processed before "props", otherwise they won't work PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_VIDEOCAMERA, videocameras, ProcessVideoCamera); // Section 'props' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_PROPS, props, ProcessProp); // Section 'TractionControl' in any module. PROCESS_SECTION_IN_ANY_MODULE(RigDef::File::KEYWORD_TRACTION_CONTROL, traction_control, ProcessTractionControl); // Section 'rotators' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_ROTATORS, rotators, ProcessRotator); // Section 'rotators_2' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_ROTATORS2, rotators_2, ProcessRotator2); // Section 'lockgroups' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_LOCKGROUPS, lockgroups, ProcessLockgroup); // Section 'railgroups' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_RAILGROUPS, railgroups, ProcessRailGroup); // Section 'slidenodes' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_SLIDENODES, slidenodes, ProcessSlidenode); // Section 'particles' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_PARTICLES, particles, ProcessParticle); // Section 'cruisecontrol' in any module. PROCESS_SECTION_IN_ANY_MODULE(RigDef::File::KEYWORD_CRUISECONTROL, cruise_control, ProcessCruiseControl); // Section 'speedlimiter' in any module. PROCESS_SECTION_IN_ANY_MODULE(RigDef::File::KEYWORD_SPEEDLIMITER, speed_limiter, ProcessSpeedLimiter); // Section 'collisionboxes' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_COLLISIONBOXES, collision_boxes, ProcessCollisionBox); // Section 'exhausts' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_EXHAUSTS, exhausts, ProcessExhaust); // Section 'extcamera' PROCESS_SECTION_IN_ANY_MODULE(RigDef::File::KEYWORD_EXTCAMERA, ext_camera, ProcessExtCamera); // Section 'camerarail' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_CAMERARAIL, camera_rails, ProcessCameraRail); // Section 'pistonprops' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_PISTONPROPS, pistonprops, ProcessPistonprop); // Sections 'turboprops' and 'turboprops2' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_TURBOPROPS2, turboprops_2, ProcessTurboprop2); // Section 'screwprops' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_SCREWPROPS, screwprops, ProcessScrewprop); // Section 'flexbodies' (Uses generated nodes) PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_FLEXBODIES, flexbodies, ProcessFlexbody); // Section 'fixes' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_FIXES, fixes, ProcessFixedNode); #ifdef USE_OPENAL // Section 'soundsources' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_SOUNDSOURCES, soundsources, ProcessSoundSource); // Section 'soundsources2' PROCESS_SECTION_IN_ALL_MODULES(RigDef::File::KEYWORD_SOUNDSOURCES2, soundsources2, ProcessSoundSource2); #endif // USE_OPENAL m_rig->loading_finished = true; // POST-PROCESSING FinalizeRig(); // Pass ownership rig_t *rig = m_rig; m_rig = nullptr; return rig; }
void LEM::SetLmAscentHoverStage() { ClearThrusterDefinitions(); agc.SetVesselStats(APS_ISP, APS_THRUST, true); ShiftCentreOfMass(_V(0.0,3.0,0.0)); SetSize (5); SetCOG_elev (5); SetEmptyMass (1920.0); SetPMI(_V(2.8, 2.29, 2.37)); SetCrossSections (_V(21,23,17)); SetCW (0.1, 0.3, 1.4, 1.4); SetRotDrag (_V(0.7,0.7,0.7)); SetPitchMomentScale (0); SetBankMomentScale (0); SetLiftCoeffFunc (0); ClearMeshes(); ClearExhaustRefs(); ClearAttExhaustRefs(); double tdph = -5.8; SetTouchdownPoints (_V(0, tdph, 5), _V(-5, tdph, -5), _V(5, tdph, -5)); VSSetTouchdownPoints(GetHandle(), _V(0, tdph, 5), _V(-5, tdph, -5), _V(5, tdph, -5)); VECTOR3 mesh_dir=_V(-0.191,-0.02,+0.383); UINT meshidx = AddMesh (hLMAscent, &mesh_dir); SetMeshVisibilityMode (meshidx, MESHVIS_VCEXTERNAL); if (!ph_Asc) ph_Asc = CreatePropellantResource(AscentFuelMassKg); // 2nd stage Propellant SetDefaultPropellantResource (ph_Asc); // Display 2nd stage propellant level in generic HUD // orbiter main thrusters th_hover[0] = CreateThruster (_V( 0.0, -2.5, 0.0), _V( 0,1,0), APS_THRUST, ph_Asc, APS_ISP); th_hover[1] = CreateThruster (_V( 0.01, -2.0, 0.0), _V( 0,1,0), 0, ph_Asc, 0); // this is a "virtual engine",no thrust and no fuel // needed for visual gimbaling for corrected engine flames DelThrusterGroup(THGROUP_HOVER,true); thg_hover = CreateThrusterGroup (th_hover, 2, THGROUP_HOVER); AddExhaust (th_hover[1], 6.0, 0.8, exhaustTex); SetCameraOffset (_V(-1,1.0,0.0)); status = 2; stage = 2; SetEngineLevel(ENGINE_HOVER,0); AddRCS_LMH2(-1.86); bModeHover=true; if(ph_Dsc){ DelPropellantResource(ph_Dsc); ph_Dsc = 0; } VECTOR3 dockpos = {0.0 ,0.58, 0.0}; VECTOR3 dockdir = {0,1,0}; VECTOR3 dockrot = { -0.8660254, 0, 0.5 }; SetDockParams(dockpos, dockdir, dockrot); hattDROGUE = CreateAttachment(true, dockpos, dockdir, dockrot, "PADROGUE"); InitNavRadios (4); LDGswitch=false; AFEED1switch=true; AFEED2switch=true; AFEED3switch=true; AFEED4switch=true; // Descent stage detached. agc.SetInputChannelBit(030, DescendStageAttached, false); CheckRCS(); }
void LEM::SetLmVesselHoverStage() { ClearThrusterDefinitions(); agc.SetVesselStats(DPS_ISP, DPS_THRUST, true); SetEmptyMass(AscentFuelMassKg + 4374.0); SetSize (7); SetPMI (_V(3.26,2.22,3.26)); SetCrossSections (_V(24.53,21.92,24.40)); // SetPMI (_V(2.8,2.29,2.37)); // SetCrossSections (_V(21,23,17)); SetCW (0.1, 0.3, 1.4, 1.4); SetRotDrag (_V(0.7,0.7,0.7)); SetPitchMomentScale (0); SetBankMomentScale (0); SetLiftCoeffFunc (0); ClearMeshes(); ClearExhaustRefs(); ClearAttExhaustRefs(); SetTouchdownPoints (_V(0, -3.86, 5), _V(-5, -3.86, -5), _V(5, -3.86, -5)); VSSetTouchdownPoints(GetHandle(), _V(0, -3.86, 5), _V(-5, -3.86, -5), _V(5, -3.86, -5)); VECTOR3 mesh_dir=_V(-0.003,-0.03,0.004); UINT meshidx; if (Landed) { meshidx = AddMesh (hLMLanded, &mesh_dir); }else{ UINT probeidx; meshidx = AddMesh (hLMLanded, &mesh_dir); probeidx = AddMesh (hLemProbes, &mesh_dir); SetMeshVisibilityMode (probeidx, MESHVIS_VCEXTERNAL); } SetMeshVisibilityMode (meshidx, MESHVIS_VCEXTERNAL); if (!ph_Dsc){ ph_Dsc = CreatePropellantResource(DescentFuelMassKg); //2nd stage Propellant } SetDefaultPropellantResource (ph_Dsc); // display 2nd stage propellant level in generic HUD if (!ph_RCSA){ ph_RCSA = CreatePropellantResource(133.084001); } if (!ph_RCSB){ ph_RCSB = CreatePropellantResource(133.084001); } // orbiter main thrusters th_hover[0] = CreateThruster (_V(0.0 , -2.0, 0.0), _V(0,1,0), 46706.3, ph_Dsc, 3107); th_hover[1] = CreateThruster (_V(0.013, -2.8, -0.034), _V(0,1,0), 0, ph_Dsc, 0); //this is a "virtual engine",no thrust and no fuel //needed for visual gimbaling for corrected engine flames DelThrusterGroup(THGROUP_HOVER,true); thg_hover = CreateThrusterGroup(th_hover, 2, THGROUP_HOVER); AddExhaust (th_hover[1], 10.0, 1.5, exhaustTex); SetCameraOffset (_V(-1,1.0,0.0)); status = 1; stage = 1; SetEngineLevel(ENGINE_HOVER,0); AddRCS_LMH(-1.85); bModeHover=true; VECTOR3 dockpos = {0.0 ,2.6, 0.0}; VECTOR3 dockdir = {0,1,0}; VECTOR3 dockrot = { -0.8660254, 0, 0.5 }; SetDockParams(dockpos, dockdir, dockrot); hattDROGUE = CreateAttachment(true, dockpos, dockdir, dockrot, "PADROGUE"); InitNavRadios (4); LDGswitch=true; ATT2switch=true; ATT3switch=true; ATT1switch=true; AFEED1switch=false; AFEED2switch=false; AFEED3switch=false; AFEED4switch=false; // Descent stage attached. agc.SetInputChannelBit(030, DescendStageAttached, true); CheckRCS(); }
void LEM::SetLmVesselDockStage() { double fuelmass; int mnumber; ClearThrusterDefinitions(); agc.SetVesselStats(DPS_ISP, DPS_THRUST, true); // // Changed to reflect mission-specific empty and fuel mass // // From "Apollo by the Numbers" // mnumber=agc.GetApolloNo(); if(mnumber < 15) { SetEmptyMass(6565); fuelmass=8375.; } else { SetEmptyMass(7334); fuelmass=8891.; } SetSize (6); // SetPMI (_V(2.8,2.29,2.37)); SetPMI(_V(2.5428, 2.2871, 2.7566)); // SetCrossSections (_V(21,23,17)); //SetPMI(_V(3.26, 2.22, 3.26)); SetCrossSections (_V(24.53,21.92,24.40)); SetCW (0.1, 0.3, 1.4, 1.4); SetRotDrag (_V(0.7,0.7,0.7)); SetPitchMomentScale (0); SetBankMomentScale (0); SetLiftCoeffFunc (0); ClearMeshes(); ClearExhaustRefs(); ClearAttExhaustRefs(); SetTouchdownPoints (_V(0,0,10), _V(-1,0,-10), _V(1,0,-10)); VECTOR3 mesh_dir=_V(0.0,-0.2,0.03); UINT meshidx = AddMesh (hLMPKD, &mesh_dir); SetMeshVisibilityMode (meshidx, MESHVIS_VCEXTERNAL); if (!ph_Dsc) ph_Dsc = CreatePropellantResource(fuelmass); //2nd stage Propellant SetDefaultPropellantResource (ph_Dsc); // display 2nd stage propellant level in generic HUD // 133.084001 kg is 293.4 pounds, which is the fuel + oxidizer capacity of one RCS tank. if (!ph_RCSA) { ph_RCSA = CreatePropellantResource(133.084001); } if (!ph_RCSB) { ph_RCSB = CreatePropellantResource(133.084001); } // orbiter main thrusters th_hover[0] = CreateThruster (_V(0.0 , -3.3, 0.0), _V(0,1,0), 46706.3, ph_Dsc, 3107); th_hover[1] = CreateThruster (_V(0.013, -3.0, -0.03), _V(0,1,0), 0, ph_Dsc, 0); //this is a "virtual engine",no thrust and no fuel //needed for visual gimbaling for corrected engine flames DelThrusterGroup(THGROUP_HOVER,true); thg_hover = CreateThrusterGroup(th_hover, 2, THGROUP_HOVER); AddExhaust(th_hover[1], 10.0, 1.2, exhaustTex); SetCameraOffset (_V(-1,1.0,0.0)); SetEngineLevel(ENGINE_HOVER,0); AddRCS_LMH(-1.85); status = 0; stage = 0; bModeDocked=true; VECTOR3 dockpos = {0.0 ,2.6, 0.0}; VECTOR3 dockdir = {0,1,0}; VECTOR3 dockrot = { -0.8660254, 0, 0.5 }; SetDockParams(dockpos, dockdir, dockrot); hattDROGUE = CreateAttachment(true, dockpos, dockdir, dockrot, "PADROGUE"); InitNavRadios (4); LDGswitch=false; ATT2switch=true; ATT3switch=true; ATT1switch=true; AFEED1switch=false; AFEED2switch=false; AFEED3switch=false; AFEED4switch=false; // Descent stage attached. agc.SetInputChannelBit(030, DescendStageAttached, true); CheckRCS(); }