// ==============================================================
// ORBITER MODULE: TESTVC
// Copyright (C) 2015 John Gattis
// All rights reserved
//
// TESTVC.cpp
// Control module for TESTVC vessel class
//
// Notes:
// ==============================================================
#include <stdio.h>
#include <fstream>
#include "resource.h"
#include "orbitersdk.h"
#include "meshres_endurance22vc.h"
#include "TESTVC.h"
//#include "TARSMESH.h"
#define LOADBMP(id) (LoadBitmap (g_Param.hDLL, MAKEINTRESOURCE (id)))
// ==============================================================
// Global parameters
// ==============================================================
TESTVC::TESTVC(OBJHANDLE hObj, int fmodel)
: VESSEL2(hObj, fmodel)
{
DefineAnimations();
}
// --------------------------------------------------------------
// Destructor
// --------------------------------------------------------------
TESTVC::~TESTVC() {
//delete viewController;
//delete mfdController;
}
void TESTVC::clbkPostCreation(void)
{
}
void TESTVC::clbkSetClassCaps(FILEHANDLE cfg)
{
// physical specs
SetSize(5);
SetEmptyMass(455.7);
SetCW(0.3, 0.3, 0.6, 0.9);
SetWingAspect(1.7);
SetWingEffectiveness(14.1);
SetCrossSections(_V(444.48,430.21,788.72));
SetRotDrag(_V(3.5, 3.5, 3.5));
if (GetFlightModel() >= 1) {
SetPitchMomentScale(1e-4);
SetBankMomentScale(1e-4);
}
SetPMI(_V(200.48, 205.14, 378.46));
SetTrimScale(0.08);
SetCameraOffset(_V(0, -16.29, 6.5));
SetTouchdownPoints(_V(0, -24.5, 5.7), _V(-3.448, -24.5, -5.0), _V(3.448, -24.5, -5.0));;
// visual specs
SetMeshVisibilityMode(meshi_Vessel = AddMesh(meshhg_Vessel = oapiLoadMeshGlobal("INTERSTELLAR\\VESSEL\\ENDURANCE\\endurance12" )), MESHVIS_ALWAYS | MESHVIS_EXTPASS);
//SetMeshVisibilityMode(meshi_VC1 = AddMesh(meshhg_Vessel), MESHVIS_VC);
SetMeshVisibilityMode(meshi_VC = AddMesh(meshhg_VC = oapiLoadMeshGlobal("INTERSTELLAR\\VESSEL\\ENDURANCE\\endurance22vc")), MESHVIS_VC);
//LAPTOPTerminalScreen->HandleLoadMesh(meshhg_VC, TEX_TESTVC19VC_SCREEN);
// HABLAPTOPTerminalScreen->HandleLoadMesh(meshhg_VC, TEX_TESTVC19VC_SCREEN);
//mfdController->HandleLoadMesh(meshi_VC, meshhg_VC);
//viewController->Commit(); // Commits all changes, so the internal structures can be build.
// It would too expensive to rebuid them on every change!
// The Commit can be issued ONLY when ALL meshes has been loaded and all Components and Widgets has beeen Registered.
// Theorically, you can issue more than one commit, but this doesn't makes sense unless you do Load on Demand on meshes.
//CreateControlSurfaces();
// propellant resources
tank = CreatePropellantResource(FUELMASS);
th_main[0] = CreateThruster(_V(0, 0, 0), _V(0, 0, 1), MAXMAINTH, tank, ISP);
thg_main = CreateThrusterGroup(th_main, 1, THGROUP_MAIN);
}
void TESTVC::clbkPostStep(double simt, double simdt, double mjd)
{
if (GetNavmodeState(1) == true){
SetAnimation(anim_killrot, 1);
}
else{
SetAnimation(anim_killrot, 0);
}
if (GetNavmodeState(2) == true){
SetAnimation(anim_horlevel, 1);
}
else{
SetAnimation(anim_horlevel, 0);
}
if (GetNavmodeState(3) == true){
SetAnimation(anim_prograde, 1);
}
else{
SetAnimation(anim_prograde, 0);
}
if (GetNavmodeState(4) == true){
SetAnimation(anim_retrograde, 1);
}
else{
SetAnimation(anim_retrograde, 0);
}
if (GetNavmodeState(5) == true){
SetAnimation(anim_NMLplus, 1);
}
else{
SetAnimation(anim_NMLplus, 0);
}
if (GetNavmodeState(6) == true){
SetAnimation(anim_nmlminus, 1);
}
else{
SetAnimation(anim_nmlminus, 0);
}
if (GetNavmodeState(7) == true){
SetAnimation(anim_althold, 1);
}
else{
SetAnimation(anim_althold, 0);
}
if (GetAttitudeMode()==0){
SetAnimation(anim_rcsoff, 1);
}
else{
SetAnimation(anim_rcsoff, 0);
}
if (GetAttitudeMode() == 1){
SetAnimation(anim_rcsrot, 1);
}
else{
SetAnimation(anim_rcsrot, 0);
}
if (GetAttitudeMode() == 2){
SetAnimation(anim_rcslin, 1);
}
else{
SetAnimation(anim_rcslin, 0);
}
}
void TESTVC::RedrawPanel_Fuelstatus(SURFHANDLE surf, int part)
{
//SURFHANDLE const tex3 = oapiGetTextureHandle(meshhg_VC,5 );
char cbuf[20];
HDC hDC = oapiGetDC(surf);
double level = GetThrusterLevel(th_main[0]);
double m = GetPropellantMass(tank);
SelectObject(hDC, g_Param.hBrush[5]);//green box
//Rectangle(hDC, 114, 34, (int)((114 - m / FUELMASS)*3.2), 75);
//Rectangle(hDC, 110, 110, (110 + level * (346 - 114)), 160);
oapiReleaseDC(surf, hDC);
}
// --------------------------------------------------------------
// Keyboard interface handler (buffered key events)
// --------------------------------------------------------------
int TESTVC::clbkConsumeBufferedKey(DWORD key, bool down, char *kstate)
{
// only process keydown events
// if (!down)
// return 0;
return 0;
}
// ====================================================================
// clbkVisualCreated used to display UMMU initialisation message
// because oapiDebugString() doesn't work in clbkSetClassCap
// ====================================================================
void TESTVC::clbkVisualCreated(VISHANDLE vis, int refcount)
{
}
// ==============================================================
// Visual destroyed
// ==============================================================
void TESTVC::clbkVisualDestroyed(VISHANDLE vis, int refcount)
{
}
void TESTVC::clbkDrawHUD(int mode, const HUDPAINTSPEC *hps, HDC hDC)
{
// draw the default HUD
VESSEL2::clbkDrawHUD(mode, hps, hDC);
}
void TESTVC::clbkSaveState(FILEHANDLE scn)
{
char cbuf[256];
// ORBITER, default vessel parameters
SaveDefaultState(scn);
// UMmu, this will save all our members of crew in scenario
// as airlock state depend of your ship (you may have a real animated airlock)
// it's your responsabilites to save and reload UMmu's airlock state.
}
void TESTVC::clbkLoadStateEx(FILEHANDLE scn, void *status)
{
char *line;
while (oapiReadScenario_nextline(scn, line))
{
// UMMU, Load all saved member from scenario.
// Return TRUE when a "UMMUCREW" line is encountered
// FALSE when it must pass this line to you or default parser
// ORBITER, unrecognised option - pass to Orbiter's generic parser
ParseScenarioLineEx(line, status);
}
// as airlock state depend of your ship (you may have a real animated airlock)
// it's your responsabilites to save and reload UMmu airlock state and set it accordingly
// to your airlock. IE: call here "SetAirlockDoorState" TRUE of FALSE depend
// of your animated airlock
}
bool TESTVC::clbkLoadGenericCockpit() {
//viewController->HandleLoadGC();
return true;
}
bool TESTVC::clbkLoadVC(int id) { // ID is the Preset Camera Position
SURFHANDLE const tex3 = oapiGetTextureHandle(meshhg_VC, 3);
//mfdController->HandleLoadVC(id);
oapiVCRegisterArea(AID_FUELSTATUS, _R(0, 0, 486, 302), PANEL_REDRAW_ALWAYS, PANEL_MOUSE_IGNORE, PANEL_MAP_BACKGROUND, tex3);
return HandleLoadVC(id);
}
bool TESTVC::HandleLoadVC(UINT const id)
{
return true;
}
bool TESTVC::clbkVCMouseEvent(int id, int event, VECTOR3 &p)
{
bool result = false;
//result = result || mfdController->HandleMouseEvent(id, event, p);
result = result || VCMouseEvent(id, event, p);
return result;
}
bool TESTVC::VCMouseEvent(int const id, int const event, VECTOR3& const p)
{
return false; // We must return false, as we didn't processed the event!
}
bool TESTVC::clbkVCRedrawEvent(int id, int event, SURFHANDLE surf) {
bool result = false;
// result = result || mfdController->HandleRedrawEvent(id, event, surf);
result = result || VCRedrawEvent(id, event, surf);
{
switch (id) {
case AID_FUELSTATUS:
RedrawPanel_Fuelstatus(surf, id - AID_FUELSTATUS);
return true;
}
// return false;
}
return result;
}
bool TESTVC::VCRedrawEvent(int const id, int const event, SURFHANDLE const surf) {
return false;
}
void TESTVC::clbkMFDMode (int mfd, int mode)
{
//mfdController->HandleMFDMode(mfd, mode);
}
void TESTVC::DefineAnimations()
{
static UINT NAVMODE_01 = 29;
static MGROUP_TRANSLATE killrot(1, &NAVMODE_01, 1, _V(0, 0.0, -.001));
anim_killrot = CreateAnimation(0);
AddAnimationComponent(anim_killrot, 0.0f, 1.0f, &killrot);
static UINT NAVMODE_02 = 28;
static MGROUP_TRANSLATE H_level(1, &NAVMODE_02, 1, _V(0, 0.0, -.002));
anim_horlevel = CreateAnimation(0);
AddAnimationComponent(anim_horlevel, 0.0f, 1.0f, &H_level);
static UINT NAVMODE_03 = 27;
static MGROUP_TRANSLATE prograde(1, &NAVMODE_03, 1, _V(0, 0.0, -.001));
anim_prograde = CreateAnimation(0);
AddAnimationComponent(anim_prograde, 0.0f, 1.0f, &prograde);
static UINT NAVMODE_04 = 26;
static MGROUP_TRANSLATE retrograde(1, &NAVMODE_04, 1, _V(0, 0.0, -.001));
anim_retrograde = CreateAnimation(0);
AddAnimationComponent(anim_retrograde, 0.0f, 1.0f, &retrograde);
static UINT NAVMODE_05 = 25;
static MGROUP_TRANSLATE NMLPLUS(1, &NAVMODE_05, 1, _V(0, 0.0, -.001));
anim_NMLplus = CreateAnimation(0);
AddAnimationComponent(anim_NMLplus, 0.0f, 1.0f, &NMLPLUS);
static UINT NAVMODE_06 = 24;
static MGROUP_TRANSLATE NMLMINUS(1, &NAVMODE_06, 1, _V(0, 0.0, -.002));
anim_nmlminus = CreateAnimation(0);
AddAnimationComponent(anim_nmlminus, 0.0f, 1.0f, &NMLMINUS);
static UINT NAVMODE_07 = 30;
static MGROUP_TRANSLATE ALTHOLD(1, &NAVMODE_07, 1, _V(0, 0.0, -.002));
anim_althold = CreateAnimation(0);
AddAnimationComponent(anim_althold, 0.0f, 1.0f, &ALTHOLD);
static UINT RCS_OFF = 36;
static MGROUP_TRANSLATE RCS_off(1, &RCS_OFF, 1, _V(0, 0.0, -.002));
anim_rcsoff = CreateAnimation(0);
AddAnimationComponent(anim_rcsoff, 0.0f, 1.0f, &RCS_off);
static UINT RCS_ROT1 = 35;
static MGROUP_TRANSLATE RCS_rot(1, &RCS_ROT1, 1, _V(0, 0.0, -.002));
anim_rcsrot = CreateAnimation(0);
AddAnimationComponent(anim_rcsrot, 0.0f, 1.0f, &RCS_rot);
static UINT RCS_LIN1 = 34;
static MGROUP_TRANSLATE RCS_lin(1, &RCS_LIN1, 1, _V(0, 0.0, -.002));
anim_rcslin = CreateAnimation(0);
AddAnimationComponent(anim_rcslin, 0.0f, 1.0f, &RCS_lin);
}