summaryrefslogtreecommitdiff
path: root/src/binary_reader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/binary_reader.cpp')
-rw-r--r--src/binary_reader.cpp90
1 files changed, 90 insertions, 0 deletions
diff --git a/src/binary_reader.cpp b/src/binary_reader.cpp
new file mode 100644
index 0000000..5847328
--- /dev/null
+++ b/src/binary_reader.cpp
@@ -0,0 +1,90 @@
+/*
+ * Copyright 2022-2023 Frederico de Oliveira Linhares
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "binary_reader.hpp"
+
+#include <fstream>
+
+namespace
+{
+
+union IntAndFloat32bit{
+ uint32_t i;
+ float f;
+};
+
+}
+
+BinaryReader::BinaryReader(std::string file_path):
+ _pointer{0}
+{
+ std::ifstream file(file_path, std::ios::binary | std::ios::ate);
+ if(!file.is_open()) throw std::runtime_error{"failed to open file"};
+
+ this->_size = file.tellg();
+ file.seekg(0);
+ this->data = new uint8_t[this->_size];
+ file.read((char*)data, this->_size);
+}
+
+BinaryReader::BinaryReader(const char *file_path):
+ BinaryReader{std::string(file_path)}
+{
+}
+
+BinaryReader::~BinaryReader()
+{
+ delete[] this->data;
+}
+
+uint8_t
+BinaryReader::read_ui8()
+{
+ return this->data[this->_pointer++];
+}
+
+uint32_t
+BinaryReader::read_ui32()
+{
+ uint8_t b1{this->data[_pointer++]}, b2{this->data[_pointer++]},
+ b3{this->data[_pointer++]}, b4{this->data[_pointer++]};
+
+ return b1 << 24 | b2 << 16 | b3 << 8 | b4;
+}
+
+glm::vec2
+BinaryReader::read_vec2()
+{
+ IntAndFloat32bit x{read_ui32()}, y{read_ui32()};
+
+ return glm::vec2{x.f, y.f};
+}
+
+glm::vec3
+BinaryReader::read_vec3()
+{
+ IntAndFloat32bit x{read_ui32()}, y{read_ui32()}, z{read_ui32()};
+
+ return glm::vec3{x.f, y.f, z.f};
+}
+
+void
+BinaryReader::read_chars(char *str, int size)
+{
+ for(int i{0}; i < size; i++)
+ str[i] = (char)data[this->_pointer++];
+}
+