test_ssol_instance.c (7694B)
1 /* Copyright (C) 2018-2026 |Meso|Star> (contact@meso-star.com) 2 * Copyright (C) 2016, 2018 CNRS 3 * 4 * This program is free software: you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation, either version 3 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program. If not, see <http://www.gnu.org/licenses/>. */ 16 17 #include "ssol.h" 18 #include "test_ssol_utils.h" 19 #include <rsys/double33.h> 20 21 #define PLANE_NAME SQUARE 22 #define HALF_X 1 23 #define HALF_Y 1 24 #include "test_ssol_rect_geometry.h" 25 26 int 27 main(int argc, char** argv) 28 { 29 struct mem_allocator allocator; 30 struct ssol_device* dev; 31 struct ssol_shape* shape; 32 struct ssol_material* material; 33 struct ssol_object* object; 34 struct ssol_instance* instance; 35 struct ssol_instance* instance1; 36 struct ssol_vertex_data attrib = SSOL_VERTEX_DATA_NULL; 37 struct ssol_instantiated_shaded_shape sshape; 38 double transform[12] = {1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, 0}; 39 double val[3], area; 40 size_t n; 41 unsigned i, count; 42 uint32_t id, id1; 43 int mask, prim; 44 (void) argc, (void) argv; 45 46 mem_init_proxy_allocator(&allocator, &mem_default_allocator); 47 48 CHK(ssol_device_create 49 (NULL, &allocator, SSOL_NTHREADS_DEFAULT, 0, &dev) == RES_OK); 50 51 CHK(ssol_material_create_virtual(dev, &material) == RES_OK); 52 53 attrib.usage = SSOL_POSITION; 54 attrib.get = get_position; 55 CHK(ssol_shape_create_mesh(dev, &shape) == RES_OK); 56 CHK(ssol_mesh_setup(shape, SQUARE_NTRIS__, get_ids, SQUARE_NVERTS__, 57 &attrib, 1, (void*)&SQUARE_DESC__) == RES_OK); 58 59 CHK(ssol_object_create(dev, &object) == RES_OK); 60 CHK(ssol_object_add_shaded_shape(object, shape, material, material) == RES_OK); 61 62 CHK(ssol_object_instantiate(object, &instance) == RES_OK); 63 CHK(ssol_object_instantiate(object, &instance1) == RES_OK); 64 65 CHK(ssol_instance_get_id(NULL, NULL) == RES_BAD_ARG); 66 CHK(ssol_instance_get_id(instance, NULL) == RES_BAD_ARG); 67 CHK(ssol_instance_get_id(NULL, &id) == RES_BAD_ARG); 68 CHK(ssol_instance_get_id(instance, &id) == RES_OK); 69 CHK(ssol_instance_get_id(instance1, &id1) == RES_OK); 70 CHK(id != id1); 71 72 CHK(ssol_instance_ref_get(NULL) == RES_BAD_ARG); 73 CHK(ssol_instance_ref_get(instance) == RES_OK); 74 75 CHK(ssol_instance_ref_put(NULL) == RES_BAD_ARG); 76 CHK(ssol_instance_ref_put(instance) == RES_OK); 77 78 CHK(ssol_instance_set_transform(NULL, transform) == RES_BAD_ARG); 79 CHK(ssol_instance_set_transform(instance, NULL) == RES_BAD_ARG); 80 CHK(ssol_instance_set_transform(instance, transform) == RES_OK); 81 CHK(ssol_instance_set_transform(instance, transform) == RES_OK); 82 83 CHK(ssol_instance_get_area(instance, NULL) == RES_BAD_ARG); 84 CHK(ssol_instance_get_area(NULL, &area) == RES_BAD_ARG); 85 CHK(ssol_instance_get_area(instance, &area) == RES_OK); 86 87 CHK(ssol_instance_set_receiver(NULL, 0, 0) == RES_BAD_ARG); 88 CHK(ssol_instance_set_receiver(instance, 0, 0) == RES_OK); 89 90 CHK(ssol_instance_is_receiver(NULL, NULL, NULL) == RES_BAD_ARG); 91 CHK(ssol_instance_is_receiver(instance, NULL, NULL) == RES_BAD_ARG); 92 CHK(ssol_instance_is_receiver(NULL, &mask, NULL) == RES_BAD_ARG); 93 CHK(ssol_instance_is_receiver(instance, &mask, NULL) == RES_BAD_ARG); 94 CHK(ssol_instance_is_receiver(NULL, NULL, &prim) == RES_BAD_ARG); 95 CHK(ssol_instance_is_receiver(instance, NULL, &prim) == RES_BAD_ARG); 96 CHK(ssol_instance_is_receiver(NULL, &mask, &prim) == RES_BAD_ARG); 97 CHK(ssol_instance_is_receiver(instance, &mask, &prim) == RES_OK); 98 CHK(mask == 0); 99 CHK(prim == 0); 100 101 CHK(ssol_instance_set_receiver(instance, SSOL_FRONT, 0) == RES_OK); 102 CHK(ssol_instance_is_receiver(instance, &mask, &prim) == RES_OK); 103 CHK(mask == SSOL_FRONT); 104 CHK(prim == 0); 105 CHK(ssol_instance_set_receiver(instance, SSOL_FRONT|SSOL_BACK, 1) == RES_OK); 106 CHK(ssol_instance_is_receiver(instance, &mask, &prim) == RES_OK); 107 CHK(mask == (SSOL_FRONT|SSOL_BACK)); 108 CHK(prim == 1); 109 110 CHK(ssol_instance_sample(NULL, 0) == RES_BAD_ARG); 111 CHK(ssol_instance_sample(instance, 0) == RES_OK); 112 CHK(ssol_instance_sample(instance, 1) == RES_OK); 113 114 CHK(ssol_instance_get_shaded_shapes_count(NULL, NULL) == RES_BAD_ARG); 115 CHK(ssol_instance_get_shaded_shapes_count(instance, NULL) == RES_BAD_ARG); 116 CHK(ssol_instance_get_shaded_shapes_count(NULL, &n) == RES_BAD_ARG); 117 CHK(ssol_instance_get_shaded_shapes_count(instance, &n) == RES_OK); 118 CHK(n == 1); 119 120 CHK(ssol_instance_get_shaded_shape(NULL, n, NULL) == RES_BAD_ARG); 121 CHK(ssol_instance_get_shaded_shape(instance, n, NULL) == RES_BAD_ARG); 122 CHK(ssol_instance_get_shaded_shape(NULL, 0, NULL) == RES_BAD_ARG); 123 CHK(ssol_instance_get_shaded_shape(instance, 0, NULL) == RES_BAD_ARG); 124 CHK(ssol_instance_get_shaded_shape(NULL, n, &sshape) == RES_BAD_ARG); 125 CHK(ssol_instance_get_shaded_shape(instance, n, &sshape) == RES_BAD_ARG); 126 CHK(ssol_instance_get_shaded_shape(NULL, 0, &sshape) == RES_BAD_ARG); 127 CHK(ssol_instance_get_shaded_shape(instance, 0, &sshape) == RES_OK); 128 129 CHK(sshape.shape == shape); 130 CHK(sshape.mtl_front == material); 131 CHK(sshape.mtl_back == material); 132 133 CHK(ssol_shape_get_vertices_count(sshape.shape, &count) == RES_OK); 134 135 #define GET_ATTR ssol_instantiated_shaded_shape_get_vertex_attrib 136 CHK(GET_ATTR(NULL, count, (unsigned)-1, NULL) == RES_BAD_ARG); 137 CHK(GET_ATTR(&sshape, count, (unsigned)-1, NULL) == RES_BAD_ARG); 138 CHK(GET_ATTR(NULL, 0, (unsigned)-1, NULL) == RES_BAD_ARG); 139 CHK(GET_ATTR(&sshape, 0, (unsigned)-1, NULL) == RES_BAD_ARG); 140 CHK(GET_ATTR(NULL, count, SSOL_POSITION, NULL) == RES_BAD_ARG); 141 CHK(GET_ATTR(&sshape, count, SSOL_POSITION, NULL) == RES_BAD_ARG); 142 CHK(GET_ATTR(NULL, 0, SSOL_POSITION, NULL) == RES_BAD_ARG); 143 CHK(GET_ATTR(&sshape, 0, SSOL_POSITION, NULL) == RES_BAD_ARG); 144 CHK(GET_ATTR(NULL, count, (unsigned)-1, val) == RES_BAD_ARG); 145 CHK(GET_ATTR(&sshape, count, (unsigned)-1, val) == RES_BAD_ARG); 146 CHK(GET_ATTR(NULL, 0, (unsigned)-1, val) == RES_BAD_ARG); 147 CHK(GET_ATTR(&sshape, 0, (unsigned)-1, val) == RES_BAD_ARG); 148 CHK(GET_ATTR(NULL, count, SSOL_POSITION, val) == RES_BAD_ARG); 149 CHK(GET_ATTR(&sshape, count, SSOL_POSITION, val) == RES_BAD_ARG); 150 CHK(GET_ATTR(NULL, 0, SSOL_POSITION, val) == RES_BAD_ARG); 151 FOR_EACH(i, 0, count) { 152 float valf[3]; 153 double val2[3]; 154 155 CHK(GET_ATTR(&sshape, i, SSOL_POSITION, val) == RES_OK); 156 get_position(i, valf, (void*)&SQUARE_DESC__); 157 d3_set_f3(val2, valf); 158 d33_muld3(val2, transform, val2); 159 d3_add(val2, transform+9, val2); 160 CHK(eq_eps(val[0], val2[0], 1.e-6) == 1); 161 CHK(eq_eps(val[1], val2[1], 1.e-6) == 1); 162 CHK(eq_eps(val[2], val2[2], 1.e-6) == 1); 163 } 164 CHK(ssol_instance_get_shaded_shape(instance1, 0, &sshape) == RES_OK); 165 FOR_EACH(i, 0, count) { 166 float valf[3]; 167 168 CHK(GET_ATTR(&sshape, i, SSOL_POSITION, val) == RES_OK); 169 get_position(i, valf, (void*)&SQUARE_DESC__); 170 CHK((float)val[0] == valf[0]); 171 CHK((float)val[1] == valf[1]); 172 CHK((float)val[2] == valf[2]); 173 } 174 #undef GET_ATTR 175 176 177 CHK(ssol_instance_ref_put(instance) == RES_OK); 178 CHK(ssol_instance_ref_put(instance1) == RES_OK); 179 CHK(ssol_object_ref_put(object) == RES_OK); 180 CHK(ssol_shape_ref_put(shape) == RES_OK); 181 CHK(ssol_material_ref_put(material) == RES_OK); 182 183 CHK(ssol_device_ref_put(dev) == RES_OK); 184 185 check_memory_allocator(&allocator); 186 mem_shutdown_proxy_allocator(&allocator); 187 CHK(mem_allocated_size() == 0); 188 189 return 0; 190 }