Implement ObjectParser
This commit is contained in:
parent
2a6f72f511
commit
6ff108f360
3 changed files with 155 additions and 0 deletions
|
@ -7,6 +7,7 @@ Import('env')
|
|||
|
||||
files = [
|
||||
'parsers.cc',
|
||||
'object_parser.cc',
|
||||
'scene_parser.cc',
|
||||
]
|
||||
|
||||
|
|
|
@ -0,0 +1,112 @@
|
|||
/* object_parser.cc
|
||||
* vim: set tw=80:
|
||||
* Eryn Wells <eryn@erynwells.me>
|
||||
*/
|
||||
/**
|
||||
* Implementation of ObjectParser.
|
||||
*/
|
||||
|
||||
#include <cassert>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
#include "yaml/object_parser.hh"
|
||||
|
||||
#include "object_sphere.h"
|
||||
#include "yaml/vector_parser.hh"
|
||||
|
||||
|
||||
namespace yaml {
|
||||
|
||||
ObjectParser::ObjectParser(Scene& scene,
|
||||
ParserStack& parsers)
|
||||
: Parser(scene, parsers)
|
||||
{ }
|
||||
|
||||
|
||||
void
|
||||
ObjectParser::HandleEvent(yaml_event_t& event)
|
||||
{
|
||||
switch (mSection) {
|
||||
case NoSection:
|
||||
HandleTopLevelEvent(event);
|
||||
break;
|
||||
case OriginSection:
|
||||
break;
|
||||
case RadiusSection:
|
||||
break;
|
||||
default:
|
||||
assert(false);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ObjectParser::HandleTopLevelEvent(yaml_event_t& event)
|
||||
{
|
||||
static const std::string ORIGIN = "origin";
|
||||
static const std::string RADIUS = "radius";
|
||||
|
||||
if (event.type == YAML_MAPPING_END_EVENT) {
|
||||
SetDone(true);
|
||||
return;
|
||||
}
|
||||
|
||||
if (event.type != YAML_SCALAR_EVENT) {
|
||||
/* TODO: Clean this up. */
|
||||
assert(false);
|
||||
}
|
||||
|
||||
std::string value = (char *)event.data.scalar.value;
|
||||
if (value == ORIGIN) {
|
||||
mSection = OriginSection;
|
||||
}
|
||||
else if (value == RADIUS) {
|
||||
mSection = RadiusSection;
|
||||
}
|
||||
else {
|
||||
/* TODO: Clean this up. */
|
||||
assert(false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ObjectParser::HandleOriginEvent(yaml_event_t& event)
|
||||
{
|
||||
if (event.type != YAML_SEQUENCE_START_EVENT) {
|
||||
/* TODO: Clean this up. */
|
||||
assert(false);
|
||||
}
|
||||
|
||||
auto onDone = [this](std::vector<double> origin) {
|
||||
if (origin.size() < 3) {
|
||||
assert(origin.size() < 3);
|
||||
}
|
||||
mObject->set_origin(Vector3(origin[0], origin[1], origin[2]));
|
||||
mSection = NoSection;
|
||||
};
|
||||
|
||||
GetParsers().push(new VectorParser<double>(GetScene(), GetParsers(), onDone));
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
ObjectParser::HandleRadiusEvent(yaml_event_t& event)
|
||||
{
|
||||
if (event.type != YAML_SCALAR_EVENT) {
|
||||
/* TODO: Clean this up. */
|
||||
assert(false);
|
||||
}
|
||||
|
||||
double radius;
|
||||
if (!ParseScalar<double>((char *)event.data.scalar.value, radius)) {
|
||||
/* TODO: Clean this up. */
|
||||
assert(false);
|
||||
}
|
||||
mObject->set_radius(radius);
|
||||
mSection = NoSection;
|
||||
}
|
||||
|
||||
} /* namespace yaml */
|
|
@ -0,0 +1,42 @@
|
|||
/* object_parser.hh
|
||||
* vim: set tw=80:
|
||||
* Eryn Wells <eryn@erynwells.me>
|
||||
*/
|
||||
/**
|
||||
* An ObjectParser parses objects of various sorts.
|
||||
*/
|
||||
|
||||
#ifndef __YAML_OBJECTPARSER_HH__
|
||||
#define __YAML_OBJECTPARSER_HH__
|
||||
|
||||
#include "yaml/parsers.hh"
|
||||
|
||||
|
||||
class Sphere;
|
||||
|
||||
|
||||
namespace yaml {
|
||||
|
||||
struct ObjectParser
|
||||
: public Parser
|
||||
{
|
||||
ObjectParser(Scene& scene, ParserStack& parsers);
|
||||
|
||||
void HandleEvent(yaml_event_t& event);
|
||||
void HandleTopLevelEvent(yaml_event_t& event);
|
||||
void HandleOriginEvent(yaml_event_t& event);
|
||||
void HandleRadiusEvent(yaml_event_t& event);
|
||||
|
||||
private:
|
||||
Sphere* mObject;
|
||||
|
||||
enum {
|
||||
NoSection,
|
||||
OriginSection,
|
||||
RadiusSection
|
||||
} mSection;
|
||||
};
|
||||
|
||||
} /* namespace yaml */
|
||||
|
||||
#endif /* __YAML_OBJECTPARSER_HH__ */
|
Loading…
Add table
Add a link
Reference in a new issue