Files
FsTrack/Source/ViewFormat.hpp
T
jens f471a98b52 - added ViewFormat for parsing GE queries for Camera and stuff
- 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
2015-01-13 23:12:57 +00:00

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