test_s3daw.c (7638B)
1 /* Copyright (C) 2015, 2016, 2020, 2021, 2023 |Méso|Star> (contact@meso-star.com) 2 * 3 * This program is free software: you can redistribute it and/or modify 4 * it under the terms of the GNU General Public License as published by 5 * the Free Software Foundation, either version 3 of the License, or 6 * (at your option) any later version. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 * GNU General Public License for more details. 12 * 13 * You should have received a copy of the GNU General Public License 14 * along with this program. If not, see <http://www.gnu.org/licenses/>. */ 15 16 #include "s3daw.h" 17 18 #include <rsys/logger.h> 19 #include <rsys/mem_allocator.h> 20 #include <star/s3d.h> 21 22 static void 23 test_cbox(struct s3daw* s3daw) 24 { 25 const char* cbox_obj = 26 "mtllib cbox.mtl cbox2.mtl\n" 27 "v -1.01 0 0.99\n" 28 "v 1 0 0.99\n" 29 "v 1 0 -1.04\n" 30 "v -0.99 0 -1.04\n" 31 "g floor\n" 32 "usemtl floor\n" 33 "f -4 -3 -2 -1\n" 34 35 "v -1.02 1.99 0.99\n" 36 "v -1.02 1.99 -1.04\n" 37 "v 1 1.99 -1.04\n" 38 "v 1 1.99 0.99\n" 39 "g ceiling\n" 40 "usemtl ceiling\n" 41 "f -4 -3 -2 -1\n" 42 43 "v -0.99 0 -1.04\n" 44 "v 1 0 -1.04\n" 45 "v 1 1.99 -1.04\n" 46 "v -1.02 1.99 -1.04\n" 47 "g back\n" 48 "usemtl back\n" 49 "f -4 -3 -2 -1\n" 50 51 "v 1 0 -1.04\n" 52 "v 1 0 0.99\n" 53 "v 1 1.99 0.99\n" 54 "v 1 1.99 -1.04\n" 55 "g right\n" 56 "usemtl right\n" 57 "f -4 -3 -2 -1\n" 58 59 "v -1.01 0 0.99\n" 60 "v -0.99 0 -1.04\n" 61 "v -1.02 1.99 -1.04\n" 62 "v -1.02 1.99 0.99\n" 63 "g left\n" 64 "usemtl left\n" 65 "f -4 -3 -2 -1\n"; 66 67 const char* cbox_mtl = 68 "newmtl left\n" 69 "Ns 10\n" 70 "Ni 1.5\n" 71 "illum 2\n" 72 "Ka 0.63 0.065 0.05\n" 73 "Kd 0.63 0.065 0.05\n" 74 "Ks 0 0 0\n" 75 "Ke 0 0 0\n" 76 77 "newmtl right\n" 78 "Ns 10\n" 79 "Ni 1.5\n" 80 "illum 2\n" 81 "Ka 0.14 0.45 0.091\n" 82 "Kd 0.14 0.45 0.091\n" 83 "Ks 0 0 0\n" 84 "Ke 0 0 0\n" 85 86 "newmtl floor\n" 87 "Ns 10\n" 88 "Ni 1\n" 89 "illum 2\n" 90 "Ka 0.725 0.71 0.68\n" 91 "Kd 0.725 0.71 0.68\n" 92 "Ks 0 0 0\n" 93 "Ke 0 0 0\n" 94 95 "newmtl ceiling\n" 96 "Ns 10\n" 97 "Ni 1\n" 98 "illum 2\n" 99 "Ka 0.725 0.71 0.68\n" 100 "Kd 0.725 0.71 0.68\n" 101 "Ks 0 0 0\n" 102 "Ke 0 0 0\n"; 103 104 const char* cbox2_mtl = 105 "newmtl back\n" 106 "Ns 10\n" 107 "Ni 1\n" 108 "illum 2\n" 109 "Ka 0.725 0.71 0.68\n" 110 "Kd 0.725 0.71 0.68\n" 111 "Ks 0 0 0\n" 112 "Ke 0 0 0\n"; 113 114 FILE* file; 115 struct s3d_device* s3d; 116 struct s3d_shape* shape; 117 struct s3d_scene* scene = NULL; 118 size_t ishape, nshapes; 119 120 ASSERT(s3daw); 121 122 file = fopen("cbox.obj", "w"); 123 124 CHK(file != NULL); 125 fwrite(cbox_obj, sizeof(char), strlen(cbox_obj), file); 126 fclose(file); 127 128 file = fopen("cbox.mtl", "w"); 129 CHK(file != NULL); 130 fwrite(cbox_mtl, sizeof(char), strlen(cbox_mtl), file); 131 fclose(file); 132 133 remove("cbox2.mtl"); 134 135 CHK(s3daw_load(NULL, NULL) == RES_BAD_ARG); 136 CHK(s3daw_load(s3daw, NULL) == RES_BAD_ARG); 137 CHK(s3daw_load(NULL, "cbox.obj") == RES_BAD_ARG); 138 CHK(s3daw_load(s3daw, "cbox.obj__") == RES_IO_ERR); 139 CHK(s3daw_load(s3daw, "cbox.obj") == RES_OK); 140 141 file = fopen("cbox2.mtl", "w"); 142 CHK(file != NULL); 143 fwrite(cbox2_mtl, sizeof(char), strlen(cbox2_mtl), file); 144 fclose(file); 145 146 CHK(s3daw_load(s3daw, "cbox.obj") == RES_OK); 147 148 CHK(s3daw_get_shapes_count(NULL, NULL) == RES_BAD_ARG); 149 CHK(s3daw_get_shapes_count(s3daw, NULL) == RES_BAD_ARG); 150 CHK(s3daw_get_shapes_count(NULL, &nshapes) == RES_BAD_ARG); 151 CHK(s3daw_get_shapes_count(s3daw, &nshapes) == RES_OK); 152 CHK(nshapes == 5); 153 154 CHK(s3daw_get_shape(NULL, 0, NULL) == RES_BAD_ARG); 155 CHK(s3daw_get_shape(s3daw, 0, NULL) == RES_BAD_ARG); 156 CHK(s3daw_get_shape(NULL, 0, &shape) == RES_BAD_ARG); 157 FOR_EACH(ishape, 0, nshapes) 158 CHK(s3daw_get_shape(s3daw, 0, &shape) == RES_OK); 159 CHK(s3daw_get_shape(s3daw, nshapes, &shape) == RES_BAD_ARG); 160 161 CHK(s3daw_clear(NULL) == RES_BAD_ARG); 162 CHK(s3daw_clear(s3daw) == RES_OK); 163 CHK(s3daw_get_shapes_count(s3daw, &nshapes) == RES_OK); 164 CHK(nshapes == 0); 165 CHK(s3daw_get_shape(s3daw, 0, &shape) == RES_BAD_ARG); 166 167 file = fopen("cbox.obj", "r"); 168 CHK(file != NULL); 169 170 CHK(s3daw_load_stream(s3daw, file) == RES_OK); 171 CHK(s3daw_get_shapes_count(s3daw, &nshapes) == RES_OK); 172 CHK(nshapes == 5); 173 FOR_EACH(ishape, 0, nshapes) 174 CHK(s3daw_get_shape(s3daw, ishape, &shape) == RES_OK); 175 176 CHK(s3daw_get_s3d_device(s3daw, &s3d) == RES_OK); 177 CHK(s3d_scene_create(s3d, &scene) == RES_OK); 178 179 CHK(s3daw_attach_to_scene(NULL, NULL) == RES_BAD_ARG); 180 CHK(s3daw_attach_to_scene(s3daw, NULL) == RES_BAD_ARG); 181 CHK(s3daw_attach_to_scene(NULL, scene) == RES_BAD_ARG); 182 CHK(s3daw_attach_to_scene(s3daw, scene) == RES_OK); 183 184 CHK(s3daw_detach_from_scene(NULL, NULL) == RES_BAD_ARG); 185 CHK(s3daw_detach_from_scene(s3daw, NULL) == RES_BAD_ARG); 186 CHK(s3daw_detach_from_scene(NULL, scene) == RES_BAD_ARG); 187 CHK(s3daw_detach_from_scene(s3daw, scene) == RES_OK); 188 189 CHK(s3daw_detach_from_scene(s3daw, scene) == RES_BAD_ARG); 190 CHK(s3d_scene_ref_put(scene) == RES_OK); 191 192 fclose(file); 193 } 194 195 int 196 main(int argc, char** argv) 197 { 198 struct mem_allocator allocator_proxy; 199 struct aw_mtl* aw_mtl; 200 struct aw_obj* aw_obj; 201 struct s3daw* s3daw; 202 struct s3d_device* s3d; 203 struct s3d_device* s3d_tmp; 204 (void)argc, (void)argv; 205 206 mem_init_proxy_allocator(&allocator_proxy, &mem_default_allocator); 207 208 CHK(s3d_device_create(NULL, &allocator_proxy, 0, &s3d) == RES_OK); 209 210 CHK(s3daw_create(NULL, NULL, NULL, NULL, NULL, 1, NULL) == RES_BAD_ARG); 211 CHK(s3daw_create(NULL, NULL, NULL, NULL, NULL, 1, &s3daw) == RES_BAD_ARG); 212 CHK(s3daw_create(NULL, NULL, NULL, NULL, s3d, 1, NULL) == RES_BAD_ARG); 213 CHK(s3daw_create(NULL, NULL, NULL, NULL,s3d, 1, &s3daw) == RES_OK); 214 215 CHK(s3daw_ref_get(NULL) == RES_BAD_ARG); 216 CHK(s3daw_ref_get(s3daw) == RES_OK); 217 CHK(s3daw_ref_put(NULL) == RES_BAD_ARG); 218 CHK(s3daw_ref_put(s3daw) == RES_OK); 219 CHK(s3daw_ref_put(s3daw) == RES_OK); 220 221 CHK(s3daw_create(NULL, &allocator_proxy, NULL, NULL, NULL, 1, NULL) == RES_BAD_ARG); 222 CHK(s3daw_create(NULL, &allocator_proxy, NULL, NULL, NULL, 1, &s3daw) == RES_BAD_ARG); 223 CHK(s3daw_create(NULL, &allocator_proxy, NULL, NULL, s3d, 1, NULL) == RES_BAD_ARG); 224 CHK(s3daw_create(NULL, &allocator_proxy, NULL, NULL, s3d, 1, &s3daw) == RES_OK); 225 CHK(s3daw_ref_put(s3daw) == RES_OK); 226 227 CHK(s3daw_create 228 (LOGGER_DEFAULT, &allocator_proxy, NULL, NULL, s3d, 1, &s3daw) == RES_OK); 229 230 CHK(s3daw_get_loaders(NULL, NULL, NULL) == RES_BAD_ARG); 231 CHK(s3daw_get_loaders(s3daw, NULL, NULL) == RES_OK); /* Useless */ 232 CHK(s3daw_get_loaders(NULL, &aw_obj, NULL) == RES_BAD_ARG); 233 CHK(s3daw_get_loaders(s3daw, &aw_obj, NULL) == RES_OK); 234 CHK(s3daw_get_loaders(NULL, NULL, &aw_mtl) == RES_BAD_ARG); 235 CHK(s3daw_get_loaders(s3daw, NULL, &aw_mtl) == RES_OK); 236 CHK(s3daw_get_loaders(NULL, &aw_obj, &aw_mtl) == RES_BAD_ARG); 237 CHK(s3daw_get_loaders(s3daw, &aw_obj, &aw_mtl) == RES_OK); 238 239 CHK(s3daw_get_s3d_device(NULL, NULL) == RES_BAD_ARG); 240 CHK(s3daw_get_s3d_device(s3daw, NULL) == RES_BAD_ARG); 241 CHK(s3daw_get_s3d_device(NULL, &s3d_tmp) == RES_BAD_ARG); 242 CHK(s3daw_get_s3d_device(s3daw, &s3d_tmp) == RES_OK); 243 CHK(s3d_tmp == s3d); 244 245 test_cbox(s3daw); 246 247 CHK(s3daw_ref_put(s3daw) == RES_OK); 248 CHK(s3d_device_ref_put(s3d) == RES_OK); 249 250 if(MEM_ALLOCATED_SIZE(&allocator_proxy)) { 251 char dump[512]; 252 MEM_DUMP(&allocator_proxy, dump, sizeof(dump)/sizeof(char)); 253 fprintf(stderr, "%s\n", dump); 254 FATAL("Memory leaks\n"); 255 } 256 mem_shutdown_proxy_allocator(&allocator_proxy); 257 CHK(mem_allocated_size() == 0); 258 return 0; 259 } 260