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:
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 */