commit 6b9694436ac338c095077be3e97511ad5fb95465
parent 414e6a209075010ea01545a32c6b2191144c860c
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Wed, 22 Feb 2017 10:27:57 +0100
Add accessors to the instantiated shaded shapes
Diffstat:
| M | src/ssol.h | | | 33 | +++++++++++++++++++++++++++++++++ |
| M | src/ssol_instance.c | | | 70 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
2 files changed, 103 insertions(+), 0 deletions(-)
diff --git a/src/ssol.h b/src/ssol.h
@@ -247,6 +247,21 @@ struct ssol_receiver_data {
/* TODO Add the geometry and primitive identifier */
};
+struct ssol_instantiated_shaded_shape {
+ struct ssol_shape* shape;
+ struct ssol_material* mtl_front;
+ struct ssol_material* mtl_back;
+
+ /* Internal data */
+ double R__[9];
+ double T__[3];
+ double R_invtrans__[9];
+};
+
+#define SSOL_INSTANTIATED_SHADED_SHAPE_NULL__ { 0 }
+static const struct ssol_instantiated_shaded_shape
+SSOL_INSTANTIATED_SHADED_SHAPE_NULL = SSOL_INSTANTIATED_SHADED_SHAPE_NULL__;
+
struct ssol_mc_result {
double E; /* Expectation */
double V; /* Variance */
@@ -651,6 +666,24 @@ ssol_instance_get_area
(const struct ssol_instance* instance,
double* area);
+SSOL_API res_T
+ssol_instance_get_shaded_shapes_count
+ (const struct ssol_instance* instance,
+ size_t* nshaded_shapes);
+
+SSOL_API res_T
+ssol_instance_get_shaded_shape
+ (const struct ssol_instance* instance,
+ const size_t ishaded_shape,
+ struct ssol_instantiated_shaded_shape* shaded_shape_instance);
+
+SSOL_API res_T
+ssol_instantiated_shaded_shape_get_vertex_attrib
+ (const struct ssol_instantiated_shaded_shape* sshape,
+ const unsigned ivert,
+ const enum ssol_attrib_usage usage,
+ double value[]);
+
/*******************************************************************************
* Param buffer API
******************************************************************************/
diff --git a/src/ssol_instance.c b/src/ssol_instance.c
@@ -14,6 +14,7 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. */
#include "ssol.h"
+#include "ssol_c.h"
#include "ssol_object_c.h"
#include "ssol_shape_c.h"
#include "ssol_instance_c.h"
@@ -197,3 +198,72 @@ ssol_instance_get_area
*area = instance->shape_rt_area;
return RES_OK;
}
+
+res_T
+ssol_instance_get_shaded_shapes_count
+ (const struct ssol_instance* instance, size_t* count)
+{
+ if(!instance || !count) return RES_BAD_ARG;
+ *count = darray_shaded_shape_size_get(&instance->object->shaded_shapes);
+ return RES_OK;
+}
+
+res_T
+ssol_instance_get_shaded_shape
+ (const struct ssol_instance* instance,
+ const size_t ishape,
+ struct ssol_instantiated_shaded_shape* sshape)
+{
+ const struct shaded_shape* shaded_shape;
+
+ if(!instance || !sshape) return RES_BAD_ARG;
+ if(ishape >= darray_shaded_shape_size_get(&instance->object->shaded_shapes))
+ return RES_BAD_ARG;
+
+ shaded_shape = darray_shaded_shape_cdata_get
+ (&instance->object->shaded_shapes) + ishape;
+ sshape->shape = shaded_shape->shape;
+ sshape->mtl_front = shaded_shape->mtl_front;
+ sshape->mtl_back = shaded_shape->mtl_back;
+
+ if(sshape->shape->type != SHAPE_PUNCHED) {
+ d33_set(sshape->R__, instance->transform);
+ d3_set(sshape->T__, instance->transform+9);
+ } else {
+ d33_muld33(sshape->R__, instance->transform, sshape->shape->quadric.transform);
+ d33_muld3(sshape->T__, instance->transform, sshape->shape->quadric.transform+9);
+ d3_add(sshape->T__, sshape->T__, instance->transform+9);
+ }
+ d33_invtrans(sshape->R_invtrans__, sshape->R__);
+ return RES_OK;
+}
+
+res_T
+ssol_instantiated_shaded_shape_get_vertex_attrib
+ (const struct ssol_instantiated_shaded_shape* sshape,
+ const unsigned ivert,
+ const enum ssol_attrib_usage usage,
+ double value[])
+{
+ res_T res = RES_OK;
+
+ if(!sshape || (unsigned)usage >= SSOL_ATTRIBS_COUNT__ || !value)
+ return RES_BAD_ARG;
+
+ res = shape_fetched_raw_vertex_attrib(sshape->shape, ivert, usage, value);
+ if(res != RES_OK) return res;
+
+ /* Transform the fetched attrib */
+ switch(usage) {
+ case SSOL_NORMAL:
+ d33_muld3(value, sshape->R_invtrans__, value);
+ break;
+ case SSOL_POSITION:
+ d33_muld3(value, sshape->R__, value);
+ d3_add(value, sshape->T__, value);
+ break;
+ default: /* Do nothing */ break;
+ }
+ return RES_OK;
+}
+