commit 3d276fabd3897ce587ed402e212d0b47a22d1045
parent 32d0e08281f6cf6e9789a57fcf785095787f9322
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Wed, 7 Sep 2022 09:39:05 +0200
Add the suvm_mesh_desc_compute_hash function
Diffstat:
3 files changed, 38 insertions(+), 0 deletions(-)
diff --git a/src/suvm.h b/src/suvm.h
@@ -246,6 +246,11 @@ suvm_volume_get_mesh_desc
(const struct suvm_volume* volume,
struct suvm_mesh_desc* desc);
+SUVM_API res_T
+suvm_mesh_desc_compute_hash
+ (const struct suvm_mesh_desc* desc,
+ hash256_T hash);
+
/*******************************************************************************
* Primitive API
******************************************************************************/
diff --git a/src/suvm_volume.c b/src/suvm_volume.c
@@ -716,3 +716,27 @@ exit:
error:
goto exit;
}
+
+res_T
+suvm_mesh_desc_compute_hash(const struct suvm_mesh_desc* desc, hash256_T hash)
+{
+ struct sha256_ctx ctx;
+
+ if(!desc || !hash) return RES_BAD_ARG;
+
+ #define HASH(Var, Nb) \
+ sha256_ctx_update(&ctx, (const char*)(Var), sizeof(*Var)*(Nb));
+
+ sha256_ctx_init(&ctx);
+ HASH(desc->positions, desc->nvertices*desc->dvertex);
+ HASH(desc->indices, desc->nprimitives*desc->dprimitive);
+ HASH(&desc->nvertices, 1);
+ HASH(&desc->nprimitives, 1);
+ HASH(&desc->dvertex, 1);
+ HASH(&desc->dprimitive, 1);
+ sha256_ctx_finalize(&ctx, hash);
+
+ #undef HASH
+
+ return RES_OK;
+}
diff --git a/src/test_suvm_volume.c b/src/test_suvm_volume.c
@@ -537,6 +537,15 @@ check_hash
hash_sha256(NULL, 0, hash1);
CHK(hash256_eq(hash0, hash1));
+ msh_desc = SUVM_MESH_DESC_NULL;
+ CHK(suvm_mesh_desc_compute_hash(NULL, hash0) == RES_BAD_ARG);
+ CHK(suvm_mesh_desc_compute_hash(&msh_desc, NULL) == RES_BAD_ARG);
+ CHK(suvm_mesh_desc_compute_hash(&msh_desc, hash0) == RES_OK);
+
+ CHK(suvm_volume_get_mesh_desc(vol, &msh_desc) == RES_OK);
+ CHK(suvm_mesh_desc_compute_hash(&msh_desc, hash1) == RES_OK);
+ CHK(!hash256_eq(hash0, hash1));
+
/* Compute data size to hash */
sz_pos = msh->nvertices*sizeof(float[3]);
sz_ids = msh->ntetrahedra*sizeof(uint32_t[4]);