AABB AABB::FromString(const char *str, const char **outEndStr) { assume(str); if (!str) return AABB(vec::nan, vec::nan); AABB a; MATH_SKIP_WORD(str, "AABB("); MATH_SKIP_WORD(str, "Min:("); a.minPoint = PointVecFromString(str, &str); MATH_SKIP_WORD(str, " Max:("); a.maxPoint = PointVecFromString(str, &str); if (outEndStr) *outEndStr = str; return a; }
Sphere Sphere::FromString(const char *str, const char **outEndStr) { assume(str); if (!str) return Sphere(vec::nan, FLOAT_NAN); Sphere s; MATH_SKIP_WORD(str, "Sphere("); MATH_SKIP_WORD(str, "pos:("); s.pos = PointVecFromString(str, &str); MATH_SKIP_WORD(str, " r:"); s.r = DeserializeFloat(str, &str); if (outEndStr) *outEndStr = str; return s; }
Ray Ray::FromString(const char *str, const char **outEndStr) { assume(str); if (!str) return Ray(vec::nan, vec::nan); Ray r; MATH_SKIP_WORD(str, "Ray("); MATH_SKIP_WORD(str, "Pos:("); r.pos = PointVecFromString(str, &str); MATH_SKIP_WORD(str, " Dir:("); r.dir = DirVecFromString(str, &str); if (outEndStr) *outEndStr = str; return r; }
Line Line::FromString(const char *str, const char **outEndStr) { assume(str); if (!str) return Line(vec::nan, vec::nan); Line l; MATH_SKIP_WORD(str, "Line("); MATH_SKIP_WORD(str, "Pos:("); l.pos = PointVecFromString(str, &str); MATH_SKIP_WORD(str, " Dir:("); l.dir = DirVecFromString(str, &str); if (outEndStr) *outEndStr = str; return l; }
Plane Plane::FromString(const char *str, const char **outEndStr) { assume(str); if (!str) return Plane(vec::nan, FLOAT_NAN); Plane p; MATH_SKIP_WORD(str, "Plane("); MATH_SKIP_WORD(str, "Normal:("); p.normal = DirVecFromString(str, &str); MATH_SKIP_WORD(str, " d:"); p.d = DeserializeFloat(str, &str); if (outEndStr) *outEndStr = str; return p; }
Polygon Polygon::FromString(const char *str, const char **outEndStr) { MATH_SKIP_WORD(str, "Polygon"); MATH_SKIP_WORD(str, "("); Polygon p; while(*str == '(' || *str == ',') { MATH_SKIP_WORD(str, ","); float3 pt = float3::FromString(str, &str); p.p.push_back(POINT_VEC(pt)); } MATH_SKIP_WORD(str, ")"); if (outEndStr) *outEndStr = str; return p; }
Color Color::FromString(const char *str) { assume(str); if (!str) return Color(); MATH_SKIP_WORD(str, "Color"); MATH_SKIP_WORD(str, "("); Color c; // Use DeserializeFloat() instead of duplicating its code but comply // with the old strtod behavior where 0 is used on conversion failure. c.r = DeserializeFloat(str, &str); if (IsNan(c.r)) c.r = 0.f; c.g = DeserializeFloat(str, &str); if (IsNan(c.g)) c.g = 0.f; c.b = DeserializeFloat(str, &str); if (IsNan(c.b)) c.b = 0.f; if (str && *str != '\0') // alpha optional { c.a = DeserializeFloat(str, &str); if (IsNan(c.a)) c.a = 01.f; } return c; }
Quat MUST_USE_RESULT Quat::FromString(const char *str, const char **outEndStr) { assert(IsNeutralCLocale()); assume(str); if (!str) return Quat::nan; MATH_SKIP_WORD(str, "Quat"); MATH_SKIP_WORD(str, "("); Quat f; f.x = DeserializeFloat(str, &str); f.y = DeserializeFloat(str, &str); f.z = DeserializeFloat(str, &str); f.w = DeserializeFloat(str, &str); if (*str == ')') ++str; if (*str == ',') ++str; if (outEndStr) *outEndStr = str; return f; }
OBB OBB::FromString(const char *str, const char **outEndStr) { assume(str); if (!str) return OBB(vec::nan, vec::nan, vec::nan, vec::nan, vec::nan); OBB o; MATH_SKIP_WORD(str, "OBB("); MATH_SKIP_WORD(str, "Pos:("); o.pos = PointVecFromString(str, &str); MATH_SKIP_WORD(str, " Halfsize:("); o.r = DirVecFromString(str, &str); MATH_SKIP_WORD(str, " X:("); o.axis[0] = DirVecFromString(str, &str); MATH_SKIP_WORD(str, " Y:("); o.axis[1] = DirVecFromString(str, &str); MATH_SKIP_WORD(str, " Z:("); o.axis[2] = DirVecFromString(str, &str); if (outEndStr) *outEndStr = str; return o; }