]> git.localhorst.tv Git - blank.git/blobdiff - src/io/token.cpp
treat head pitch and yaw as entity state
[blank.git] / src / io / token.cpp
index 5e734ad573b634ed4fcf101c89735f7c64dda4b2..b462df778b593ee11927d6e80da46031b530b709 100644 (file)
@@ -4,6 +4,7 @@
 #include <cctype>
 #include <istream>
 #include <stdexcept>
+#include <glm/gtc/quaternion.hpp>
 
 using namespace std;
 
@@ -32,7 +33,7 @@ void Tokenizer::ReadToken() {
 
        istream::sentry s(in);
        if (!s) {
-               // TODO: error?
+               throw runtime_error("read past the end of stream");
                return;
        }
 
@@ -47,7 +48,7 @@ void Tokenizer::ReadToken() {
                case ',': case '=':
                        current.type = Token::Type(c);
                        break;
-               case '+': case '-':
+               case '+': case '-': case '.':
                case '0': case '1': case '2': case '3': case '4':
                case '5': case '6': case '7': case '8': case '9':
                        in.putback(c);
@@ -71,7 +72,7 @@ void Tokenizer::ReadToken() {
 namespace {
 
 bool is_num_char(istream::char_type c) {
-       return isdigit(c)
+       return isxdigit(c)
                || c == '.'
                || c == '-'
                || c == '+'
@@ -173,7 +174,7 @@ void Tokenizer::ReadIdentifier() {
 
        istream::char_type c;
        while (in.get(c)) {
-               if (isalnum(c) || c == '_') {
+               if (isalnum(c) || c == '_' || c == '.') {
                        current.value += c;
                } else {
                        in.putback(c);
@@ -191,6 +192,9 @@ TokenStreamReader::TokenStreamReader(istream &in)
 
 
 bool TokenStreamReader::HasMore() {
+       if (cached) {
+               return true;
+       }
        while (in.HasMore()) {
                if (in.Next().type != Token::COMMENT) {
                        cached = true;
@@ -327,6 +331,18 @@ void TokenStreamReader::ReadVec(glm::ivec4 &v) {
        Skip(Token::BRACKET_CLOSE);
 }
 
+void TokenStreamReader::ReadQuat(glm::quat &q) {
+       Skip(Token::BRACKET_OPEN);
+       ReadNumber(q.w);
+       Skip(Token::COMMA);
+       ReadNumber(q.x);
+       Skip(Token::COMMA);
+       ReadNumber(q.y);
+       Skip(Token::COMMA);
+       ReadNumber(q.z);
+       Skip(Token::BRACKET_CLOSE);
+}
+
 
 bool TokenStreamReader::GetBool() {
        Next();