commit 5a7af779a3a624a87f6abc650e6ce1d758df3379
parent 926f3f141f8358baa890e34b70b6d37ed34c87c0
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Fri, 6 Apr 2018 16:20:42 +0200
Add the sdis_scene_get_boundary_position function
Diffstat:
2 files changed, 38 insertions(+), 0 deletions(-)
diff --git a/src/sdis.h b/src/sdis.h
@@ -400,6 +400,13 @@ sdis_scene_get_aabb
double lower[3],
double upper[3]);
+SDIS_API res_T
+sdis_scene_get_boundary_position
+ (const struct sdis_scene* scn,
+ const size_t iprim, /* Primitive index */
+ const double uv[2], /* Parametric coordinate onto the pimitive */
+ double pos[3]); /* World space position */
+
/*******************************************************************************
* An estimator stores the state of a simulation
******************************************************************************/
diff --git a/src/sdis_scene.c b/src/sdis_scene.c
@@ -608,6 +608,37 @@ sdis_scene_get_aabb
return RES_OK;
}
+res_T
+sdis_scene_get_boundary_position
+ (const struct sdis_scene* scn,
+ const size_t iprim,
+ const double uv[],
+ double pos[])
+{
+ if(!scn || !uv || !pos) return RES_BAD_ARG;
+ if(iprim >= scene_get_primitives_count(scn)) return RES_BAD_ARG;
+
+ if(scene_is_2d(scn)) {
+ struct s2d_primitive prim;
+ struct s2d_attrib attr;
+ float s = (float)uv[0];
+
+ S2D(scene_view_get_primitive(scn->s2d_view, (unsigned int)iprim, &prim));
+ S2D(primitive_get_attrib(&prim, S2D_POSITION, s, &attr));
+ d2_set_f2(pos, attr.value);
+ } else {
+ struct s3d_primitive prim;
+ struct s3d_attrib attr;
+ float st[2];
+
+ f2_set_d2(st, uv);
+ S3D(scene_view_get_primitive(scn->s3d_view, (unsigned int)iprim, &prim));
+ S3D(primitive_get_attrib(&prim, S3D_POSITION, st, &attr));
+ d3_set_f3(pos, attr.value);
+ }
+ return RES_OK;
+}
+
/*******************************************************************************
* Local miscellaneous function
******************************************************************************/