- 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:
The code compiles fine, but I get this error when running the vessel in Orbiter:
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.
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.