package vec3 import ( "strconv" "github.com/francoispqt/gojay" ) type Vec3 struct { X float32 `json:"x"` Y float32 `json:"y"` Z float32 `json:"z"` } func (v *Vec3) MarshalJSONObject(enc *gojay.Encoder) { enc.FloatKey("x", float64(v.X)) enc.FloatKey("y", float64(v.Y)) enc.FloatKey("z", float64(v.Z)) } func (v *Vec3) IsNil() bool { return v == nil } func HandRolled(vs []Vec3) ([]byte, error) { buf := []byte("[") for i, v := range vs { if i > 0 { buf = append(buf, []byte(`,{"x":`)...) } else { buf = append(buf, []byte(`{"x":`)...) } buf = strconv.AppendFloat(buf, float64(v.X), 'f', -1, 32) buf = append(buf, []byte(`,"y":`)...) buf = strconv.AppendFloat(buf, float64(v.Y), 'f', -1, 32) buf = append(buf, []byte(`,"z":`)...) buf = strconv.AppendFloat(buf, float64(v.Z), 'f', -1, 32) buf = append(buf, []byte("}")...) } buf = append(buf, ']') return buf, nil } type Vec3Slice []*Vec3 func (vs *Vec3Slice) MarshalJSONArray(enc *gojay.Encoder) { for _, e := range *vs { enc.AddObject(e) } } func (vs Vec3Slice) IsNil() bool { return vs == nil }