Project OrbitCam

BruceJohnJennerLawso

Dread Lord of the Idiots
Addon Developer
Joined
Apr 14, 2012
Messages
2,585
Reaction score
0
Points
36
Okay, as requested by Pipcard here:

http://www.orbiter-forum.com/showthread.php?t=32521

The current source code:

Code:
#pragma once
#include "Orbitersdk.h"
#include "UMmuSDK.h"
#include <string>

// Orbiter Cam version 1.0 //////////////////////////////////////////////////////////////////////////// 
///////////////////////////////////////////////////////////////////////////////////////////////////////


const double EXP_SIZE = 0.1; 				// 	mean radius in meters
const VECTOR3 EXP_CS = {0.03,0.03,0.01}; 	//	Cross sections in m^2
const VECTOR3 EXP_PMI = {0.01,0.01,0.001};	//	Principal Moments of Inertia, normalized, m^2
const VECTOR3 CAMPOS = {0.03,0.03,0.01}; 	//	Cross sections in m^2
const double EXP_EMPTYMASS = 1.2; 			//	mass in kg
const double P_NML = 101.4e3;


class OrbitCam :public VESSEL3
{	public:
    OrbitCam (OBJHANDLE hObj, int fmodel);
	MESHHANDLE Cam;
	OBJHANDLE Tgt;
	std::string TgtString;
	std::string Gettargetstring();
	void clbkSetClassCaps (FILEHANDLE cfg);
	void clbkLoadStateEx (FILEHANDLE scn, void *status);
	bool clbkDrawHUD (int mode, const HUDPAINTSPEC *hps, oapi::Sketchpad *skp);
	void clbkSaveState (FILEHANDLE scn);
	void clbkPostStep (double simtt, double simdt, double mjd);
	int ClassControl ();
	VECTOR3 Tgt_ofs, Tgt_vofs;
	VESSELSTATUS * VSp;
	bool Camlocked;
	void Breakcamlock();
	enum increment {forward, backward, left, right, up, ddown};
	void Inccamera(increment Input);
	void SetCameraPosition();
	void clbkPostCreation(void);	
	int  clbkConsumeBufferedKey (DWORD key, bool down, char *kstate);
	// The HUD display method variable, see PDF doc
	char cUmmuHudDisplay[255];			// UMmu hud char variable
	double dHudMessageDelay;			// UMmu hud display delay
	char *SendHudMessage(void);			// UMmu hud display function


	int OCAM;
	~OrbitCam();
};


HINSTANCE hDLL;
HFONT hFont;
HPEN hPen;
HBRUSH hBrush;

Code:
///////////////////////////////////////////////////////////////////////////////////////////////////////
// Orbiter Cam Source Code //////////////////////////////////////////////////////////////////////////// 
// by John Lawson          ////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////

#define STRICT
#define ORBITER_MODULE
#include "OCam.h"
#include "orbitersdk.h"
#include <math.h>
#include <stdio.h>
#include "OrbiterSoundSDK40.h"
#include "VesselAPI.h"
#include "CelBodyAPI.h"
#include <string>
using namespace std;

HINSTANCE g_hDLL;
VISHANDLE MainExternalMeshVisual = 0;

// ==============================================================
// Constructor
// ==============================================================

OrbitCam::OrbitCam (OBJHANDLE hObj, int fmodel): VESSEL3 (hObj, fmodel)
{	char * tc = "Earth";
	Tgt = oapiGetObjectByName(tc);
	TgtString = tc;
	Tgt_ofs.x = 8000000;
	Tgt_ofs.y = 0;
	Tgt_ofs.z = 0;
	Tgt_vofs.x = 0;
	Tgt_vofs.y = 0;
	Tgt_vofs.z = 0;
	VSp = new VESSELSTATUS;
	Camlocked = true;
}

string OrbitCam::Gettargetstring()
{	return TgtString;
}

//=========================================================
// ClassControl
//=========================================================
int OrbitCam::ClassControl ()
{	if (Tgt != NULL)
	{	GetStatus (*VSp);
		VSp->rpos = (VSp->rpos+(Tgt_ofs));
		VSp->rpos = (VSp->rpos+(Tgt_ofs));
		DefSetState (VSp);
	}
	else 
	{ return -1;
	}
return 0;
}

void OrbitCam::Breakcamlock()
{	Tgt = NULL;
	Camlocked = false;
}


//=========================================================
// Vessel Capabilities
//=========================================================

void OrbitCam::clbkSetClassCaps (FILEHANDLE cfg)
{	strcpy(SendHudMessage(),"OrbitCam");
	ClassControl();
	SetMeshVisibilityMode (AddMesh (Cam = oapiLoadMeshGlobal ("Camera")), MESHVIS_EXTERNAL);
	SetCameraOffset (CAMPOS);
	SetSize (EXP_SIZE);
	SetPMI (EXP_PMI);
	SetCrossSections (EXP_CS);
	EnableTransponder (false);
	InitNavRadios (1);
}

//=========================================================
// clbkDrawHUD
//=========================================================

bool OrbitCam::clbkDrawHUD(int mode, const HUDPAINTSPEC *hps, oapi::Sketchpad *skp)
{	VESSEL3::clbkDrawHUD (mode, hps, skp);
	if(dHudMessageDelay>0)
	{	skp->Text(5,hps->H/60*25,cUmmuHudDisplay,strlen(cUmmuHudDisplay));
		dHudMessageDelay-=oapiGetSimStep();
		if(dHudMessageDelay<0)
		dHudMessageDelay=0;
	}
	return true; 
}

char *OrbitCam::SendHudMessage() //<---- Change the class name here
{	dHudMessageDelay=15;
	return cUmmuHudDisplay;
}

//=========================================================
// clbkLoadStateEx
//=========================================================

void OrbitCam::clbkLoadStateEx (FILEHANDLE scn, void *status)
{	char *line;
	while (oapiReadScenario_nextline (scn, line)) 
	{	if (!_strnicmp (line, "TgtString", 9)) 
		{	sscanf (line+9, "%s", &TgtString);
		}
		ParseScenarioLineEx (line, status);
	}
	char * tc = (char*)TgtString.c_str();
	Tgt = oapiGetObjectByName(tc);
	Camlocked = true;
}

//=========================================================
// clbkSaveState
//=========================================================

void OrbitCam::clbkSaveState (FILEHANDLE scn)
{	char cbuf[256];
	VESSEL3::clbkSaveState (scn);
	sprintf (cbuf, "%s", TgtString);
	oapiWriteScenario_string (scn, "TgtString", cbuf);
}


//=========================================================
// clbkPostStep
//=========================================================

void OrbitCam::clbkPostStep(double simt, double simdt, double mjd)
{	if(GroundContact()==TRUE)
	{	Breakcamlock();
	}
	if (simt < 1)
	{	ClassControl ();
	}
}

void OrbitCam::Inccamera(increment Input)
{	switch(Input)
	{	case forward:
		Tgt_ofs.z += 1; 
		case backward:
		Tgt_ofs.z -= 1; 
		case left:
		Tgt_ofs.x += 1; 
		case right:
		Tgt_ofs.x -= 1; 
		case up:
		Tgt_ofs.y += 1; 
		case ddown:
		Tgt_ofs.y -= 1; 
	}
}

//=========================================================
// clbkConsumeBufferedKey
// Another important function, this particular section is used to execute functions whenever the Orbiter application detects a given keystroke by a user.
// Really not very complicated (usually), very similar to clbkVCMouseEvent. The ony complicated part is getting the structure right, as calls specific
// to a ctrl-keypress or shift-keypress have to be grouped under a separate heading. Best example of that will be under the Hubble Space Telescope sample
// also in the OrbiterSDK directory.
//=========================================================

int OrbitCam::clbkConsumeBufferedKey (DWORD key, bool down, char *kstate)
{	if (!down) return 0;
	if(key==OAPI_KEY_NUMPAD6&&!KEYMOD_SHIFT(kstate)&&!KEYMOD_CONTROL (kstate))
	{	Inccamera(forward);
		return TRUE;
	}
	if(key==OAPI_KEY_NUMPAD9&&!KEYMOD_SHIFT(kstate)&&!KEYMOD_CONTROL (kstate))
	{	Inccamera(backward);
		return TRUE;
	}
	if(key==OAPI_KEY_NUMPAD1&&!KEYMOD_SHIFT(kstate)&&!KEYMOD_CONTROL (kstate))
	{	Inccamera(left);
		return TRUE;
	}
	if(key==OAPI_KEY_NUMPAD3&&!KEYMOD_SHIFT(kstate)&&!KEYMOD_CONTROL (kstate))
	{	Inccamera(right);
		return TRUE;
	}
	if(key==OAPI_KEY_NUMPAD8&&!KEYMOD_SHIFT(kstate)&&!KEYMOD_CONTROL (kstate))
	{	Inccamera(up);
		return TRUE;
	}
	if(key==OAPI_KEY_NUMPAD2&&!KEYMOD_SHIFT(kstate)&&!KEYMOD_CONTROL (kstate))
	{	Inccamera(ddown);
		return TRUE;
	}
return 0;
}



//=========================================================
// Load and Delete Module Stuff
// Apparenty used to load & delete special classes in the module. If theyre not deleted properly in ExitModule, they cause what I believe is called a
// memory leak, not good. So always remember to clean up after yourself!
//=========================================================
DLLCLBK void InitModule (HINSTANCE hModule)
{
	g_hDLL = hModule;
	hFont = CreateFont (-20, 3, 0, 0, 150, 0, 0, 0, 0, 0, 0, 0, 0, "Haettenschweiler");
	hPen = CreatePen (PS_SOLID, 3, RGB (120,220,120));
	hBrush = CreateSolidBrush (RGB(0,128,0));

	// perform global module initialisation here
}
DLLCLBK void ExitModule (HINSTANCE hModule)
{
	// perform module cleanup here
	DeleteObject (hFont);
	DeleteObject (hPen);
	DeleteObject (hBrush);

}

//=========================================================
// Load and Delete Vessel Stuff
// Appears similar to the part above, only I think its involved when creating or deleting vessels via the scenario editor.
//=========================================================
DLLCLBK VESSEL *ovcInit (OBJHANDLE hvessel, int flightmodel)
{
	return new OrbitCam (hvessel, flightmodel);
}

DLLCLBK void ovcExit (VESSEL *vessel)
{
	if (vessel)
		delete (OrbitCam*)vessel;
}

//=========================================================
// clbkPostCreation
//=========================================================

void OrbitCam::clbkPostCreation (void)
{	OCAM=ConnectToOrbiterSoundDLL(GetHandle());
	SetMyDefaultWaveDirectory("Sound\\_CustomVesselsSounds\\OCAM\\");
	ReplaceStockSound(OCAM,"aircond.wav",		REPLACE_AIR_CONDITIONNING);
	SoundOptionOnOff(OCAM,PLAYRADIOATC,FALSE);
}

//=========================================================
// Destructor
//=========================================================

OrbitCam::~OrbitCam() 
{	delete VSp;

}

The code compiles fine, but I get this error when running the vessel in Orbiter:

Code:
The procedure entry point
??1critical_section@Concurrency@@QAE@XZ could not be located in
the dynamic link library MSVCR100.dll

I thought that shouldn't be a problem if I already have MSVC++ 2010 installed, but I'll see if I can find it and copy it to my Orbiter folder.

---------- Post added at 01:11 ---------- Previous post was at 01:05 ----------

Okay, tried copying the MSVCR100.dll into the Orbiter folder, it appeared to fix the entry problem, but the scenario editor wont let me create a OrbitCam vessel.
 
Top