star-3d

Surface structuring for efficient 3D geometric queries
git clone git://git.meso-star.fr/star-3d.git
Log | Files | Refs | README | LICENSE

commit aa6ff0ef16ed01789b6961605387039faca92c75
parent 34db303d59561b6aa251b7ddf6908c6fa7cb6f60
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Mon,  5 Oct 2015 17:26:11 +0200

Update the API of the s3d_mesh_setup_indexed_vertices function

The number of vertex attributes is now explicitly defined as a function
argument rather than relying on the S3D_VERTEX_DATA_NULL constant that
was used to define the end of the list.

Diffstat:
Msrc/s3d.h | 4++--
Msrc/s3d_mesh.c | 9+++++----
Msrc/s3d_mesh.h | 1+
Msrc/s3d_shape.c | 3++-
Msrc/test_s3d_primitive.c | 15+++++++--------
Msrc/test_s3d_sampler.c | 15+++++++--------
Msrc/test_s3d_scene.c | 20+++++++++-----------
Msrc/test_s3d_shape.c | 95+++++++++++++++++++++++++++++++++++++++----------------------------------------
Msrc/test_s3d_trace_ray.c | 19+++++++++----------
9 files changed, 89 insertions(+), 92 deletions(-)

diff --git a/src/s3d.h b/src/s3d.h @@ -428,9 +428,9 @@ s3d_mesh_setup_indexed_vertices (const unsigned itri, unsigned ids[3], void* ctx), const unsigned nverts, /* List of the shape vertex data. Must have at least an attrib with the - * S3D_POSITION usage. The last element of the list must be - * S3D_VERTEX_DATA_NULL */ + * S3D_POSITION usage. */ struct s3d_vertex_data attribs[], + const unsigned nattribs, /* # attributes in the attribs list */ void* data); /* Client data set as the last param of the callbacks */ /******************************************************************************* diff --git a/src/s3d_mesh.c b/src/s3d_mesh.c @@ -449,6 +449,7 @@ mesh_setup_indexed_vertices void (*get_indices)(const unsigned itri, unsigned ids[3], void* ctx), const unsigned nverts, struct s3d_vertex_data attribs[], + const unsigned nattribs, void* data) { unsigned iattr; @@ -456,7 +457,7 @@ mesh_setup_indexed_vertices res_T res = RES_OK; ASSERT(mesh); - if(!ntris || !nverts || !attribs) { + if(!ntris || !nverts || !attribs || !nattribs) { res = RES_BAD_ARG; goto error; } @@ -479,7 +480,8 @@ mesh_setup_indexed_vertices /* Check the vertex data description */ iattr = 0; has_position = 0; - while(attribs[iattr].usage != S3D_ATTRIBS_COUNT__) { + FOR_EACH(iattr, 0, nattribs) { + ASSERT(attribs[iattr].usage < S3D_ATTRIBS_COUNT__); if(attribs[iattr].get == S3D_KEEP) { const enum s3d_attrib_usage attr_usage = attribs[iattr].usage; const enum s3d_type type = attribs[iattr].type; @@ -499,7 +501,6 @@ mesh_setup_indexed_vertices } if(attribs[iattr].usage == S3D_POSITION) has_position = 1; - ++iattr; } if(!has_position) { /* The vertex must have a position */ @@ -510,7 +511,7 @@ mesh_setup_indexed_vertices mesh_setup_indices(mesh, ntris, get_indices, nverts, data); /* Setup vertex data */ - for(iattr = 0; attribs[iattr].usage != S3D_ATTRIBS_COUNT__; ++iattr) { + FOR_EACH(iattr, 0, nattribs) { if(attribs[iattr].usage == S3D_POSITION) { mesh_setup_positions(mesh, nverts, attribs + iattr, data); } else { diff --git a/src/s3d_mesh.h b/src/s3d_mesh.h @@ -128,6 +128,7 @@ mesh_setup_indexed_vertices void (*get_indices)(const unsigned itri, unsigned ids[3], void* ctx), const unsigned nverts, struct s3d_vertex_data attribs[], + const unsigned nattribs, void* data); extern LOCAL_SYM void diff --git a/src/s3d_shape.c b/src/s3d_shape.c @@ -251,11 +251,12 @@ s3d_mesh_setup_indexed_vertices void (*get_indices)(const unsigned itri, unsigned ids[3], void* ctx), const unsigned nverts, struct s3d_vertex_data attribs[], + const unsigned nattribs, void* data) { if(!shape || shape->type != GEOM_MESH) return RES_BAD_ARG; return mesh_setup_indexed_vertices - (shape->data.mesh, ntris, get_indices, nverts, attribs, data); + (shape->data.mesh, ntris, get_indices, nverts, attribs, nattribs, data); } diff --git a/src/test_s3d_primitive.c b/src/test_s3d_primitive.c @@ -89,7 +89,7 @@ main(int argc, char** argv) struct s3d_shape* plane; struct s3d_attrib attr; struct s3d_primitive prim = S3D_PRIMITIVE_NULL; - struct s3d_vertex_data attribs[2]; + struct s3d_vertex_data attribs; struct cbox_desc desc; size_t nprims; size_t i; @@ -108,21 +108,20 @@ main(int argc, char** argv) CHECK(s3d_shape_get_id(walls, &walls_id), RES_OK); CHECK(s3d_scene_attach_shape(scn, walls), RES_OK); - attribs[0].usage = S3D_POSITION; - attribs[0].type = S3D_FLOAT3; - attribs[0].get = cbox_get_position; - attribs[1] = S3D_VERTEX_DATA_NULL; + attribs.usage = S3D_POSITION; + attribs.type = S3D_FLOAT3; + attribs.get = cbox_get_position; ntris = cbox_walls_ntris; nverts = cbox_walls_nverts; desc.vertices = cbox_walls; desc.indices = cbox_walls_ids; CHECK(s3d_mesh_setup_indexed_vertices - (walls, ntris, cbox_get_ids, nverts, attribs, &desc), RES_OK); + (walls, ntris, cbox_get_ids, nverts, &attribs, 1, &desc), RES_OK); - attribs[0].get = plane_get_pos; + attribs.get = plane_get_pos; CHECK(s3d_mesh_setup_indexed_vertices - (plane, plane_ntris, plane_get_ids, plane_nverts, attribs, NULL), RES_OK); + (plane, plane_ntris, plane_get_ids, plane_nverts, &attribs, 1, NULL), RES_OK); CHECK(s3d_scene_begin_session(scn, S3D_SAMPLE), RES_OK); CHECK(s3d_scene_sample(scn, 0, 0, 0, &prim, uv), RES_OK); diff --git a/src/test_s3d_sampler.c b/src/test_s3d_sampler.c @@ -57,7 +57,7 @@ main(int argc, char** argv) struct s3d_shape* walls; struct s3d_shape* short_block; struct s3d_shape* tall_block; - struct s3d_vertex_data attribs[2]; + struct s3d_vertex_data attribs; struct s3d_primitive prim; struct s3d_primitive prim1; struct s3d_attrib attr0, attr1; @@ -106,17 +106,16 @@ main(int argc, char** argv) CHECK(S3D_PRIMITIVE_EQ(&prim, &S3D_PRIMITIVE_NULL), 1); CHECK(s3d_scene_end_session(scn), RES_OK); - attribs[0].usage = S3D_POSITION; - attribs[0].type = S3D_FLOAT3; - attribs[0].get = cbox_get_position; - attribs[1] = S3D_VERTEX_DATA_NULL; + attribs.usage = S3D_POSITION; + attribs.type = S3D_FLOAT3; + attribs.get = cbox_get_position; ntris = sizeof(cbox_walls_ids)/sizeof(unsigned[3]); nverts = sizeof(cbox_walls)/sizeof(float[3]); desc.vertices = cbox_walls; desc.indices = cbox_walls_ids; CHECK(s3d_mesh_setup_indexed_vertices - (walls, ntris, cbox_get_ids, nverts, attribs, &desc), RES_OK); + (walls, ntris, cbox_get_ids, nverts, &attribs, 1, &desc), RES_OK); CHECK(s3d_scene_attach_shape(scn, walls), RES_OK); @@ -164,7 +163,7 @@ main(int argc, char** argv) desc.vertices = cbox_short_block; desc.indices = cbox_block_ids; CHECK(s3d_mesh_setup_indexed_vertices - (short_block, ntris, cbox_get_ids, nverts, attribs, &desc), RES_OK); + (short_block, ntris, cbox_get_ids, nverts, &attribs, 1, &desc), RES_OK); CHECK(s3d_scene_attach_shape(scn, short_block), RES_OK); CHECK(s3d_scene_attach_shape(scn, tall_block), RES_OK); @@ -174,7 +173,7 @@ main(int argc, char** argv) CHECK(s3d_primitive_get_attrib(&prim, S3D_POSITION, uv, &attr0), RES_OK); desc.vertices = cbox_tall_block; CHECK(s3d_mesh_setup_indexed_vertices - (tall_block, ntris, cbox_get_ids, nverts, attribs, &desc), RES_OK); + (tall_block, ntris, cbox_get_ids, nverts, &attribs, 1, &desc), RES_OK); CHECK(s3d_scene_sample(scn, 0.5f, 0.5f, 0.5f, &prim, uv), RES_OK); CHECK(s3d_primitive_get_attrib(&prim, S3D_POSITION, uv, &attr1), RES_OK); CHECK(f3_eq_eps(attr0.value, attr1.value, 1.e-6f), 1); diff --git a/src/test_s3d_scene.c b/src/test_s3d_scene.c @@ -92,7 +92,7 @@ main(int argc, char** argv) struct s3d_scene* scn; struct s3d_scene* scn2; struct s3d_scene* scn3; - struct s3d_vertex_data attribs[2]; + struct s3d_vertex_data attribs; struct s3d_shape* shapes[4]; const size_t nshapes = sizeof(shapes)/sizeof(struct s3d_shape*); void* data = (void*)&cbox_walls_desc; @@ -239,13 +239,12 @@ main(int argc, char** argv) CHECK(s3d_scene_create(dev, &scn), RES_OK); CHECK(s3d_scene_create(dev, &scn2), RES_OK); - attribs[0].type = S3D_FLOAT3; - attribs[0].usage = S3D_POSITION; - attribs[0].get = cbox_get_position; - attribs[1] = S3D_VERTEX_DATA_NULL; + attribs.type = S3D_FLOAT3; + attribs.usage = S3D_POSITION; + attribs.get = cbox_get_position; CHECK(s3d_shape_create_mesh(dev, shapes + 0), RES_OK); CHECK(s3d_mesh_setup_indexed_vertices(shapes[0], cbox_walls_ntris, - cbox_get_ids, cbox_walls_nverts, attribs, data), RES_OK); + cbox_get_ids, cbox_walls_nverts, &attribs, 1, data), RES_OK); CHECK(s3d_scene_attach_shape(scn, shapes[0]), RES_OK); CHECK(s3d_scene_begin_session(scn, S3D_TRACE), RES_OK); @@ -303,12 +302,11 @@ main(int argc, char** argv) } CHECK(s3d_scene_end_session(scn2), RES_OK); - attribs[0].type = S3D_FLOAT3; - attribs[0].usage = S3D_POSITION; - attribs[0].get = cube_get_pos; - attribs[1] = S3D_VERTEX_DATA_NULL; + attribs.type = S3D_FLOAT3; + attribs.usage = S3D_POSITION; + attribs.get = cube_get_pos; CHECK(s3d_mesh_setup_indexed_vertices - (shapes[0], cube_ntris, cube_get_ids, cube_nverts, attribs, NULL), RES_OK); + (shapes[0], cube_ntris, cube_get_ids, cube_nverts, &attribs, 1, NULL), RES_OK); CHECK(s3d_scene_begin_session(scn, S3D_TRACE), RES_OK); CHECK(s3d_scene_compute_area(scn, &area), RES_OK); diff --git a/src/test_s3d_shape.c b/src/test_s3d_shape.c @@ -75,8 +75,8 @@ main(int argc, char** argv) CHECK(s3d_shape_is_attached(shape, &c), RES_OK); CHECK(c, 0); - CHECK(s3d_scene_attach_shape(NULL, NULL), RES_BAD_ARG); - CHECK(s3d_scene_attach_shape(scn, NULL), RES_BAD_ARG); + CHECK(s3d_scene_attach_shape(NULL, NULL), RES_BAD_ARG); + CHECK(s3d_scene_attach_shape(scn, NULL), RES_BAD_ARG); CHECK(s3d_scene_attach_shape(NULL, shape), RES_BAD_ARG); CHECK(s3d_scene_attach_shape(scn, shape), RES_OK); CHECK(s3d_shape_is_attached(shape, &c), RES_OK); @@ -92,124 +92,123 @@ main(int argc, char** argv) attribs[0].type = S3D_FLOAT3; attribs[0].usage = S3D_POSITION; attribs[0].get = cbox_get_position; - attribs[1] = S3D_VERTEX_DATA_NULL; CHECK(s3d_mesh_setup_indexed_vertices - (NULL, 0, NULL, 0, NULL, data), RES_BAD_ARG); + (NULL, 0, NULL, 0, NULL, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (shape, 0, NULL, 0, NULL, data), RES_BAD_ARG); + (shape, 0, NULL, 0, NULL, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (NULL, cbox_ntris, NULL, 0, NULL, data), RES_BAD_ARG); + (NULL, cbox_ntris, NULL, 0, NULL, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (shape, cbox_ntris, NULL, 0, NULL, data), RES_BAD_ARG); + (shape, cbox_ntris, NULL, 0, NULL, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (NULL, 0, cbox_get_ids, 0, NULL, data), RES_BAD_ARG); + (NULL, 0, cbox_get_ids, 0, NULL, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (shape, 0, cbox_get_ids, 0, NULL, data), RES_BAD_ARG); + (shape, 0, cbox_get_ids, 0, NULL, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (NULL, cbox_ntris, cbox_get_ids, 0, NULL, data), RES_BAD_ARG); + (NULL, cbox_ntris, cbox_get_ids, 0, NULL, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (shape, cbox_ntris, cbox_get_ids, 0, NULL, data), RES_BAD_ARG); + (shape, cbox_ntris, cbox_get_ids, 0, NULL, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (NULL, 0, NULL, cbox_nverts, NULL, data), RES_BAD_ARG); + (NULL, 0, NULL, cbox_nverts, NULL, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (shape, 0, NULL, cbox_nverts, NULL, data), RES_BAD_ARG); + (shape, 0, NULL, cbox_nverts, NULL, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (NULL, cbox_ntris, NULL, cbox_nverts, NULL, data), RES_BAD_ARG); + (NULL, cbox_ntris, NULL, cbox_nverts, NULL, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (shape, cbox_ntris, NULL, cbox_nverts, NULL, data), RES_BAD_ARG); + (shape, cbox_ntris, NULL, cbox_nverts, NULL, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (NULL, 0, cbox_get_ids, cbox_nverts, NULL, data), RES_BAD_ARG); + (NULL, 0, cbox_get_ids, cbox_nverts, NULL, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (shape, 0, cbox_get_ids, cbox_nverts, NULL, data), RES_BAD_ARG); + (shape, 0, cbox_get_ids, cbox_nverts, NULL, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (NULL, cbox_ntris, cbox_get_ids, cbox_nverts, NULL, data), RES_BAD_ARG); + (NULL, cbox_ntris, cbox_get_ids, cbox_nverts, NULL, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (shape, cbox_ntris, cbox_get_ids, cbox_nverts, NULL, data), RES_BAD_ARG); + (shape, cbox_ntris, cbox_get_ids, cbox_nverts, NULL, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (NULL, 0, NULL, 0, attribs, data), RES_BAD_ARG); + (NULL, 0, NULL, 0, attribs, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (shape, 0, NULL, 0, attribs, data), RES_BAD_ARG); + (shape, 0, NULL, 0, attribs, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (NULL, cbox_ntris, NULL, 0, attribs, data), RES_BAD_ARG); + (NULL, cbox_ntris, NULL, 0, attribs, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (shape, cbox_ntris, NULL, 0, attribs, data), RES_BAD_ARG); + (shape, cbox_ntris, NULL, 0, attribs, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (NULL, 0, cbox_get_ids, 0, attribs, data), RES_BAD_ARG); + (NULL, 0, cbox_get_ids, 0, attribs, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (shape, 0, cbox_get_ids, 0, attribs, data), RES_BAD_ARG); + (shape, 0, cbox_get_ids, 0, attribs, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (NULL, cbox_ntris, cbox_get_ids, 0, attribs, data), RES_BAD_ARG); + (NULL, cbox_ntris, cbox_get_ids, 0, attribs, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (shape, cbox_ntris, cbox_get_ids, 0, attribs, data), RES_BAD_ARG); + (shape, cbox_ntris, cbox_get_ids, 0, attribs, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (NULL, 0, NULL, cbox_nverts, attribs, data), RES_BAD_ARG); + (NULL, 0, NULL, cbox_nverts, attribs, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (shape, 0, NULL, cbox_nverts, attribs, data), RES_BAD_ARG); + (shape, 0, NULL, cbox_nverts, attribs, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (NULL, cbox_ntris, NULL, cbox_nverts, attribs, data), RES_BAD_ARG); + (NULL, cbox_ntris, NULL, cbox_nverts, attribs, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (shape, cbox_ntris, NULL, cbox_nverts, attribs, data), RES_BAD_ARG); + (shape, cbox_ntris, NULL, cbox_nverts, attribs, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (NULL, 0, cbox_get_ids, cbox_nverts, attribs, data), RES_BAD_ARG); + (NULL, 0, cbox_get_ids, cbox_nverts, attribs, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (shape, 0, cbox_get_ids, cbox_nverts, attribs, data), RES_BAD_ARG); + (shape, 0, cbox_get_ids, cbox_nverts, attribs, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (NULL, cbox_ntris, cbox_get_ids, cbox_nverts, attribs, data), RES_BAD_ARG); + (NULL, cbox_ntris, cbox_get_ids, cbox_nverts, attribs, 1, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (shape, cbox_ntris, cbox_get_ids, cbox_nverts, attribs, data), RES_OK); + (shape, cbox_ntris, cbox_get_ids, cbox_nverts, attribs, 1, data), RES_OK); + CHECK(s3d_mesh_setup_indexed_vertices + (shape, cbox_ntris, cbox_get_ids, cbox_nverts, attribs, 0, data), RES_BAD_ARG); attribs[0] = S3D_VERTEX_DATA_NULL; CHECK(s3d_mesh_setup_indexed_vertices - (shape, cbox_ntris, cbox_get_ids, cbox_nverts, attribs, data), RES_BAD_ARG); + (shape, cbox_ntris, cbox_get_ids, cbox_nverts, attribs, 0, data), RES_BAD_ARG); attribs[0].type = S3D_FLOAT3; attribs[0].usage = S3D_POSITION; attribs[0].get = S3D_KEEP; CHECK(s3d_mesh_setup_indexed_vertices - (shape, cbox_ntris, cbox_get_ids, cbox_nverts, attribs, data), RES_OK); + (shape, cbox_ntris, cbox_get_ids, cbox_nverts, attribs, 1, data), RES_OK); attribs[0].get = cbox_get_position; CHECK(s3d_mesh_setup_indexed_vertices - (shape, cbox_ntris, S3D_KEEP, cbox_nverts, attribs, data), RES_OK); + (shape, cbox_ntris, S3D_KEEP, cbox_nverts, attribs, 1, data), RES_OK); attribs[0].type = S3D_FLOAT3; attribs[0].usage = S3D_ATTRIB_0; attribs[0].get = cbox_get_normal; CHECK(s3d_mesh_setup_indexed_vertices - (shape, cbox_ntris, S3D_KEEP, cbox_nverts, attribs, data), RES_BAD_ARG); + (shape, cbox_ntris, S3D_KEEP, cbox_nverts, attribs, 1, data), RES_BAD_ARG); attribs[1].type = S3D_FLOAT3; attribs[1].usage = S3D_POSITION; attribs[1].get = S3D_KEEP; - attribs[2] = S3D_VERTEX_DATA_NULL; CHECK(s3d_mesh_setup_indexed_vertices - (shape, cbox_ntris, S3D_KEEP, cbox_nverts, attribs, data), RES_OK); + (shape, cbox_ntris, S3D_KEEP, cbox_nverts, attribs, 2, data), RES_OK); attribs[2].type = S3D_FLOAT2; attribs[2].usage = S3D_ATTRIB_2; attribs[2].get = cbox_get_uv; attribs[3] = S3D_VERTEX_DATA_NULL; CHECK(s3d_mesh_setup_indexed_vertices - (shape, cbox_ntris, S3D_KEEP, cbox_nverts, attribs, data), RES_OK); + (shape, cbox_ntris, S3D_KEEP, cbox_nverts, attribs, 3, data), RES_OK); attribs[0].get = S3D_KEEP; attribs[1].get = S3D_KEEP; attribs[2].get = S3D_KEEP; CHECK(s3d_mesh_setup_indexed_vertices - (shape, 2, S3D_KEEP, cbox_nverts, attribs, data), RES_BAD_ARG); + (shape, 2, S3D_KEEP, cbox_nverts, attribs, 3, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (shape, cbox_ntris, S3D_KEEP, cbox_nverts+1, attribs, data), RES_BAD_ARG); + (shape, cbox_ntris, S3D_KEEP, cbox_nverts+1, attribs, 3, data), RES_BAD_ARG); CHECK(s3d_mesh_setup_indexed_vertices - (shape, cbox_ntris, S3D_KEEP, cbox_nverts, attribs, data), RES_OK); + (shape, cbox_ntris, S3D_KEEP, cbox_nverts, attribs, 3, data), RES_OK); attribs[2].type = S3D_FLOAT3; CHECK(s3d_mesh_setup_indexed_vertices - (shape, cbox_ntris, S3D_KEEP, cbox_nverts, attribs, data), RES_BAD_ARG); + (shape, cbox_ntris, S3D_KEEP, cbox_nverts, attribs, 3, data), RES_BAD_ARG); attribs[0].get = cbox_get_position; - attribs[2] = S3D_VERTEX_DATA_NULL; CHECK(s3d_mesh_setup_indexed_vertices - (shape, cbox_ntris, S3D_KEEP, cbox_nverts, attribs, data), RES_OK); + (shape, cbox_ntris, S3D_KEEP, cbox_nverts, attribs, 2, data), RES_OK); CHECK(s3d_shape_is_enabled(NULL, NULL), RES_BAD_ARG); CHECK(s3d_shape_is_enabled(shape, NULL), RES_BAD_ARG); diff --git a/src/test_s3d_trace_ray.c b/src/test_s3d_trace_ray.c @@ -93,7 +93,7 @@ main(int argc, char** argv) struct s3d_shape* walls; struct s3d_shape* tall_block; struct s3d_shape* short_block; - struct s3d_vertex_data attribs[4]; + struct s3d_vertex_data attribs; struct s3d_primitive prims[30]; struct camera cam; struct cbox_desc desc; @@ -121,10 +121,9 @@ main(int argc, char** argv) CHECK(s3d_device_create(NULL, &allocator, 1, &dev), RES_OK); CHECK(s3d_scene_create(dev, &scn), RES_OK); - attribs[0].usage = S3D_POSITION; - attribs[0].type = S3D_FLOAT3; - attribs[0].get = cbox_get_position; - attribs[1] = S3D_VERTEX_DATA_NULL; + attribs.usage = S3D_POSITION; + attribs.type = S3D_FLOAT3; + attribs.get = cbox_get_position; ntris = cbox_walls_ntris; nverts = cbox_walls_nverts; @@ -132,7 +131,7 @@ main(int argc, char** argv) desc.indices = cbox_walls_ids; CHECK(s3d_shape_create_mesh(dev, &walls), RES_OK); CHECK(s3d_mesh_setup_indexed_vertices - (walls, ntris, cbox_get_ids, nverts, attribs, &desc), RES_OK); + (walls, ntris, cbox_get_ids, nverts, &attribs, 1, &desc), RES_OK); CHECK(s3d_scene_attach_shape(scn, walls), RES_OK); CHECK(s3d_shape_ref_put(walls), RES_OK); @@ -186,20 +185,20 @@ main(int argc, char** argv) CHECK(s3d_shape_create_mesh(dev, &tall_block), RES_OK); CHECK(s3d_shape_get_id(tall_block, &tall_block_id), RES_OK); CHECK(s3d_mesh_setup_indexed_vertices - (tall_block, ntris, cbox_get_ids, nverts, attribs, &desc), RES_OK); + (tall_block, ntris, cbox_get_ids, nverts, &attribs, 1, &desc), RES_OK); CHECK(s3d_scene_attach_shape(scn, tall_block), RES_OK); /* Update the inst vertices */ desc.vertices = cbox_tall_block; CHECK(s3d_mesh_setup_indexed_vertices - (tall_block, ntris, S3D_KEEP, nverts, attribs, &desc), RES_OK); + (tall_block, ntris, S3D_KEEP, nverts, &attribs, 1, &desc), RES_OK); /* Create a the CBox short block inst */ desc.vertices = cbox_short_block; CHECK(s3d_shape_create_mesh(dev, &short_block), RES_OK); CHECK(s3d_shape_get_id(short_block, &short_block_id), RES_OK); CHECK(s3d_mesh_setup_indexed_vertices - (short_block, ntris, cbox_get_ids, nverts, attribs, &desc), RES_OK); + (short_block, ntris, cbox_get_ids, nverts, &attribs, 1, &desc), RES_OK); CHECK(s3d_scene_attach_shape(scn, short_block), RES_OK); /* Instantiate the scene */ @@ -218,7 +217,7 @@ main(int argc, char** argv) CHECK(s3d_shape_create_mesh(dev, &walls), RES_OK); CHECK(s3d_shape_get_id(walls, &walls_id), RES_OK); CHECK(s3d_mesh_setup_indexed_vertices - (walls, ntris, cbox_get_ids, nverts, attribs, &desc), RES_OK); + (walls, ntris, cbox_get_ids, nverts, &attribs, 1, &desc), RES_OK); CHECK(s3d_scene_attach_shape(scn, walls), RES_OK); /* Check that the ids are all different */