read.odin 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. package encoding_hxa
  2. import "core:fmt"
  3. import "core:os"
  4. import "core:mem"
  5. Read_Error :: enum {
  6. None,
  7. Short_Read,
  8. Invalid_Data,
  9. Unable_To_Read_File,
  10. }
  11. read_from_file :: proc(filename: string, print_error := false, allocator := context.allocator) -> (file: File, err: Read_Error) {
  12. context.allocator = allocator;
  13. data, ok := os.read_entire_file(filename);
  14. if !ok {
  15. err = .Unable_To_Read_File;
  16. return;
  17. }
  18. defer if !ok {
  19. delete(data);
  20. } else {
  21. file.backing = data;
  22. }
  23. file, err = read(data, filename, print_error, allocator);
  24. return;
  25. }
  26. read :: proc(data: []byte, filename := "<input>", print_error := false, allocator := context.allocator) -> (file: File, err: Read_Error) {
  27. Reader :: struct {
  28. filename: string,
  29. data: []byte,
  30. offset: int,
  31. print_error: bool,
  32. };
  33. read_value :: proc(r: ^Reader, $T: typeid) -> (value: T, err: Read_Error) {
  34. remaining := len(r.data) - r.offset;
  35. if remaining < size_of(T) {
  36. err = .Short_Read;
  37. return;
  38. }
  39. ptr := raw_data(r.data[r.offset:]);
  40. value = (^T)(ptr)^;
  41. r.offset += size_of(T);
  42. return;
  43. }
  44. read_array :: proc(r: ^Reader, $T: typeid, count: int) -> (value: []T, err: Read_Error) {
  45. remaining := len(r.data) - r.offset;
  46. if remaining < size_of(T)*count {
  47. err = .Short_Read;
  48. return;
  49. }
  50. ptr := raw_data(r.data[r.offset:]);
  51. value = mem.slice_ptr((^T)(ptr), count);
  52. r.offset += size_of(T)*count;
  53. return;
  54. }
  55. read_string :: proc(r: ^Reader, count: int) -> (string, Read_Error) {
  56. buf, err := read_array(r, byte, count);
  57. return string(buf), err;
  58. }
  59. read_name :: proc(r: ^Reader) -> (value: string, err: Read_Error) {
  60. len := read_value(r, u8) or_return;
  61. data := read_array(r, byte, int(len)) or_return;
  62. return string(data[:len]), nil;
  63. }
  64. read_meta :: proc(r: ^Reader, capacity: u32le) -> (meta_data: []Meta, err: Read_Error) {
  65. meta_data = make([]Meta, int(capacity));
  66. count := 0;
  67. defer meta_data = meta_data[:count];
  68. for m in &meta_data {
  69. m.name = read_name(r) or_return;
  70. type := read_value(r, Meta_Value_Type) or_return;
  71. if type > max(Meta_Value_Type) {
  72. if r.print_error {
  73. fmt.eprintf("HxA Error: file '%s' has meta value type %d. Maximum value is ", r.filename, u8(type), u8(max(Meta_Value_Type)));
  74. }
  75. err = .Invalid_Data;
  76. return;
  77. }
  78. array_length := read_value(r, u32le) or_return;
  79. switch type {
  80. case .Int64: m.value = read_array(r, i64le, int(array_length)) or_return;
  81. case .Double: m.value = read_array(r, f64le, int(array_length)) or_return;
  82. case .Node: m.value = read_array(r, Node_Index, int(array_length)) or_return;
  83. case .Text: m.value = read_string(r, int(array_length)) or_return;
  84. case .Binary: m.value = read_array(r, byte, int(array_length)) or_return;
  85. case .Meta: m.value = read_meta(r, array_length) or_return;
  86. }
  87. count += 1;
  88. }
  89. return;
  90. }
  91. read_layer_stack :: proc(r: ^Reader, capacity: u32le) -> (layers: Layer_Stack, err: Read_Error) {
  92. stack_count := read_value(r, u32le) or_return;
  93. layer_count := 0;
  94. layers = make(Layer_Stack, stack_count);
  95. defer layers = layers[:layer_count];
  96. for layer in &layers {
  97. layer.name = read_name(r) or_return;
  98. layer.components = read_value(r, u8) or_return;
  99. type := read_value(r, Layer_Data_Type) or_return;
  100. if type > max(type) {
  101. if r.print_error {
  102. fmt.eprintf("HxA Error: file '%s' has layer data type %d. Maximum value is ", r.filename, u8(type), u8(max(Layer_Data_Type)));
  103. }
  104. err = .Invalid_Data;
  105. return;
  106. }
  107. data_len := int(layer.components) * int(capacity);
  108. switch type {
  109. case .Uint8: layer.data = read_array(r, u8, data_len) or_return;
  110. case .Int32: layer.data = read_array(r, i32le, data_len) or_return;
  111. case .Float: layer.data = read_array(r, f32le, data_len) or_return;
  112. case .Double: layer.data = read_array(r, f64le, data_len) or_return;
  113. }
  114. layer_count += 1;
  115. }
  116. return;
  117. }
  118. if len(data) < size_of(Header) {
  119. return;
  120. }
  121. context.allocator = allocator;
  122. header := cast(^Header)raw_data(data);
  123. assert(header.magic_number == MAGIC_NUMBER);
  124. r := &Reader{
  125. filename = filename,
  126. data = data[:],
  127. offset = size_of(Header),
  128. print_error = print_error,
  129. };
  130. node_count := 0;
  131. file.nodes = make([]Node, header.internal_node_count);
  132. defer if err != nil {
  133. nodes_destroy(file.nodes);
  134. file.nodes = nil;
  135. }
  136. defer file.nodes = file.nodes[:node_count];
  137. for node_idx in 0..<header.internal_node_count {
  138. node := &file.nodes[node_count];
  139. type := read_value(r, Node_Type) or_return;
  140. if type > max(Node_Type) {
  141. if r.print_error {
  142. fmt.eprintf("HxA Error: file '%s' has node type %d. Maximum value is ", r.filename, u8(type), u8(max(Node_Type)));
  143. }
  144. err = .Invalid_Data;
  145. return;
  146. }
  147. node_count += 1;
  148. node.meta_data = read_meta(r, read_value(r, u32le) or_return) or_return;
  149. switch type {
  150. case .Meta_Only:
  151. // Okay
  152. case .Geometry:
  153. g: Node_Geometry;
  154. g.vertex_count = read_value(r, u32le) or_return;
  155. g.vertex_stack = read_layer_stack(r, g.vertex_count) or_return;
  156. g.edge_corner_count = read_value(r, u32le) or_return;
  157. g.corner_stack = read_layer_stack(r, g.edge_corner_count) or_return;
  158. if header.version > 2 {
  159. g.edge_stack = read_layer_stack(r, g.edge_corner_count) or_return;
  160. }
  161. g.face_count = read_value(r, u32le) or_return;
  162. g.face_stack = read_layer_stack(r, g.face_count) or_return;
  163. node.content = g;
  164. case .Image:
  165. img: Node_Image;
  166. img.type = read_value(r, Image_Type) or_return;
  167. dimensions := int(img.type);
  168. if img.type == .Image_Cube {
  169. dimensions = 2;
  170. }
  171. img.resolution = {1, 1, 1};
  172. for d in 0..<dimensions {
  173. img.resolution[d] = read_value(r, u32le) or_return;
  174. }
  175. size := img.resolution[0]*img.resolution[1]*img.resolution[2];
  176. if img.type == .Image_Cube {
  177. size *= 6;
  178. }
  179. img.image_stack = read_layer_stack(r, size) or_return;
  180. node.content = img;
  181. }
  182. }
  183. return;
  184. }