- 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
This commit is contained in:
@@ -0,0 +1,158 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user