- Camera now controlled with adjustable alt, tilt, auto roll based on aircraft banking and auto heading based on aircraft heading git-svn-id: http://moon:8086/svn/software/trunk/projects/FsTrack@129 b431acfa-c32f-4a4a-93f1-934dc6c82436
159 lines
3.4 KiB
C++
159 lines
3.4 KiB
C++
#ifndef VIEWFORMAT_HPP
|
|
#define VIEWFORMAT_HPP
|
|
|
|
#include "../JuceLibraryCode/JuceHeader.h"
|
|
|
|
class AParser
|
|
{
|
|
public:
|
|
virtual void parse(char **ppStream)
|
|
{
|
|
printf("%s\n", extractField(ppStream));
|
|
}
|
|
|
|
protected:
|
|
AParser() {}
|
|
~AParser() {}
|
|
|
|
struct Field
|
|
{
|
|
Field(const char *_name, AParser &_member, bool &hasTag)
|
|
: name(_name)
|
|
, member(_member)
|
|
, m_hasTag(hasTag)
|
|
{
|
|
m_hasTag = false;
|
|
}
|
|
const char *name;
|
|
AParser &member;
|
|
bool &m_hasTag;
|
|
};
|
|
|
|
char *extractField(char **ppStream)
|
|
{
|
|
static char field[256];
|
|
char *pStream = *ppStream;
|
|
char *pField = field;
|
|
|
|
skip(&pStream);
|
|
|
|
for (size_t i=0; i < sizeof(field); i++)
|
|
{
|
|
if (*pStream == ',')
|
|
break;
|
|
|
|
if (*pStream == ';')
|
|
break;
|
|
|
|
if (*pStream == '=')
|
|
break;
|
|
|
|
*(pField++) = *(pStream++);
|
|
}
|
|
*pField = 0;
|
|
*ppStream = pStream;
|
|
|
|
return field;
|
|
}
|
|
|
|
private:
|
|
void skip(char **ppStream)
|
|
{
|
|
while ((**ppStream == '\\') || (**ppStream == '?') || (**ppStream == ',') || (**ppStream == ';') || (**ppStream == '=') || (**ppStream <= 0x20))
|
|
{
|
|
(*ppStream)++;
|
|
};
|
|
|
|
}
|
|
};
|
|
|
|
// ?BBOX=1.0, 2.0, 3.0, 4.0?CAMERA/Pos=1.0, 2.0, 3.0
|
|
class ViewFormat : private AParser
|
|
{
|
|
private:
|
|
struct Bbox : public AParser
|
|
{
|
|
float n, e, s, w;
|
|
|
|
void parse(char **ppStream)
|
|
{
|
|
n = String(extractField(ppStream)).getFloatValue();
|
|
e = String(extractField(ppStream)).getFloatValue();
|
|
s = String(extractField(ppStream)).getFloatValue();
|
|
w = String(extractField(ppStream)).getFloatValue();
|
|
}
|
|
};
|
|
|
|
struct Camera : public AParser
|
|
{
|
|
float lookatLon, lookatLat, lookatRange, lookatTilt, lookatHeading;
|
|
|
|
void parse(char **ppStream)
|
|
{
|
|
lookatLon = String(extractField(ppStream)).getFloatValue();
|
|
lookatLat = String(extractField(ppStream)).getFloatValue();
|
|
lookatRange = String(extractField(ppStream)).getFloatValue();
|
|
lookatTilt = String(extractField(ppStream)).getFloatValue();
|
|
lookatHeading = String(extractField(ppStream)).getFloatValue();
|
|
}
|
|
};
|
|
|
|
struct View : public AParser
|
|
{
|
|
float horizFov, vertFov, horizPixels, vertPixels, terrainEnabled;
|
|
|
|
void parse(char **ppStream)
|
|
{
|
|
horizFov = String(extractField(ppStream)).getFloatValue();
|
|
vertFov = String(extractField(ppStream)).getFloatValue();
|
|
horizPixels = String(extractField(ppStream)).getFloatValue();
|
|
vertPixels = String(extractField(ppStream)).getFloatValue();
|
|
terrainEnabled = String(extractField(ppStream)).getFloatValue();
|
|
}
|
|
};
|
|
|
|
AParser::Field fieldBbox;
|
|
AParser::Field fieldCamera;
|
|
AParser::Field fieldView;
|
|
AParser::Field *fields[3];
|
|
|
|
public:
|
|
bool has_bbox;
|
|
Bbox bbox;
|
|
|
|
bool has_camera;
|
|
Camera camera;
|
|
|
|
bool has_view;
|
|
View view;
|
|
|
|
ViewFormat()
|
|
: fieldBbox(AParser::Field("BBox", bbox, has_bbox))
|
|
, fieldCamera(AParser::Field("Camera", camera, has_camera))
|
|
, fieldView(AParser::Field("View", view, has_view))
|
|
{
|
|
fields[0] = &fieldBbox;
|
|
fields[1] = &fieldCamera;
|
|
fields[2] = &fieldView;
|
|
}
|
|
~ViewFormat() {}
|
|
|
|
void parse(const char *pStream)
|
|
{
|
|
char *pSubStream = (char*)pStream;
|
|
|
|
for (unsigned i=0; i < sizeof(fields)/sizeof(*fields); i++)
|
|
{
|
|
char *pField = extractField(&pSubStream);
|
|
if (!stricmp(pField, fields[i]->name))
|
|
{
|
|
fields[i]->member.parse(&pSubStream);
|
|
fields[i]->m_hasTag = true;
|
|
}
|
|
}
|
|
}
|
|
|
|
};
|
|
|
|
#endif // VIEWFORMAT_HPP
|