diff options
Diffstat (limited to 'src/blu_cat/com/binary_writer.cpp')
-rw-r--r-- | src/blu_cat/com/binary_writer.cpp | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/src/blu_cat/com/binary_writer.cpp b/src/blu_cat/com/binary_writer.cpp new file mode 100644 index 0000000..0c4cace --- /dev/null +++ b/src/blu_cat/com/binary_writer.cpp @@ -0,0 +1,164 @@ +/* + * Copyright 2022-2025 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_writer.hpp" + +#include <iostream> + +namespace +{ + +union IntAndFloat32bit{ + UI32 i; + F32 f; +}; + +union IntAndFloat64bit{ + UI64 i; + F64 f; +}; + +} + +BinaryWriter::BinaryWriter(const char *file_path): + output{file_path, std::ios::binary} +{ +} + +BinaryWriter::BinaryWriter(const std::string &file_path): + BinaryWriter{file_path.c_str()} +{ +} + +void +BinaryWriter::write_ui8(UI8 var) +{ + this->output.put(var); +} + +void +BinaryWriter::write_ui32(UI32 var) +{ + using namespace std; + + UI8 b1 = var >> 24; + UI8 b2 = var >> 16; + UI8 b3 = var >> 8; + UI8 b4 = var; + + this->output.put(b1); + this->output.put(b2); + this->output.put(b3); + this->output.put(b4); +} + +void +BinaryWriter::write_ui64(UI64 var) +{ + using namespace std; + + UI8 b1 = var >> 56; + UI8 b2 = var >> 48; + UI8 b3 = var >> 40; + UI8 b4 = var >> 32; + UI8 b5 = var >> 24; + UI8 b6 = var >> 16; + UI8 b7 = var >> 8; + UI8 b8 = var; + + this->output.put(b1); + this->output.put(b2); + this->output.put(b3); + this->output.put(b4); + this->output.put(b5); + this->output.put(b6); + this->output.put(b7); + this->output.put(b8); +} + +void +BinaryWriter::write_f32(F32 var) +{ + IntAndFloat32bit num; + num.f = var; + write_ui32(num.i); +} + +void +BinaryWriter::write_f64(F64 var) +{ + IntAndFloat64bit num; + num.f = var; + write_ui64(num.i); +} + +void +BinaryWriter::write_vec2(glm::vec2 var) +{ + IntAndFloat32bit x, y; + x.f = var.x; + y.f = var.y; + + this->write_ui32(x.i); + this->write_ui32(y.i); +} + +void +BinaryWriter::write_vec3(glm::vec3 var) +{ + IntAndFloat32bit x, y, z; + x.f = var.x; + y.f = var.y; + z.f = var.z; + + this->write_ui32(x.i); + this->write_ui32(y.i); + this->write_ui32(z.i); +} + +void +BinaryWriter::write_quat(glm::quat var) +{ + IntAndFloat32bit w, x, y, z; + w.f = var.w; + x.f = var.x; + y.f = var.y; + z.f = var.z; + + this->write_ui32(w.i); + this->write_ui32(x.i); + this->write_ui32(y.i); + this->write_ui32(z.i); +} + +void +BinaryWriter::write_mat4(glm::mat4 var) +{ + float *offset_matrix_data{glm::value_ptr(var)}; + IntAndFloat32bit num; + + for(int i{0}; i < 16; i++) + { + num.f = offset_matrix_data[i]; + this->write_ui32(num.i); + } +} + +void +BinaryWriter::write_chars(const char *str, int size) +{ + for(int i{0}; i < size; i++) this->write_ui8((UI8)str[i]); +} |