commit bded6edefa46e89034f766c97170ff954589cee4
parent 62ff97ee72b9944937e10cc9ba9083bfaab55130
Author: Christophe Coustet <christophe.coustet@meso-star.com>
Date: Tue, 23 Aug 2016 18:49:55 +0200
Use new s3d_view API.
Diffstat:
5 files changed, 91 insertions(+), 54 deletions(-)
diff --git a/src/ssol_object_instance.c b/src/ssol_object_instance.c
@@ -148,8 +148,8 @@ res_T
ssol_object_instance_is_attached
(struct ssol_object_instance* instance, char* is_attached)
{
+ FATAL("Not implemented yet.");
if(!instance || !is_attached) return RES_BAD_ARG;
- S3D(shape_is_attached(instance->s3d_shape, is_attached));
return RES_OK;
}
diff --git a/src/ssol_scene.c b/src/ssol_scene.c
@@ -22,30 +22,11 @@
#include "ssol_object_c.h"
#include "ssol_object_instance_c.h"
-#include <rsys/hash_table.h>
#include <rsys/list.h>
#include <rsys/mem_allocator.h>
-#include <rsys/ref_count.h>
#include <rsys/rsys.h>
#include <rsys/float3.h>
-/* Define the htable_instance data structure */
-#define HTABLE_NAME instance
-#define HTABLE_KEY unsigned /* S3D object instance identifier */
-#define HTABLE_DATA struct ssol_object_instance*
-#include <rsys/hash_table.h>
-
-struct ssol_scene
-{
- struct htable_instance instances;
- struct s3d_scene* s3d_scn;
- struct s3d_scene* s3d_sampling_scn;
- struct ssol_sun* sun;
-
- struct ssol_device* dev;
- ref_T ref;
-};
-
/*******************************************************************************
* Helper functions
******************************************************************************/
diff --git a/src/ssol_scene_c.h b/src/ssol_scene_c.h
@@ -17,6 +17,25 @@
#define SSOL_SCENE_C_H
#include <rsys/rsys.h>
+#include <rsys/ref_count.h>
+#include <rsys/hash_table.h>
+
+ /* Define the htable_instance data structure */
+#define HTABLE_NAME instance
+#define HTABLE_KEY unsigned /* S3D object instance identifier */
+#define HTABLE_DATA struct ssol_object_instance*
+#include <rsys/hash_table.h>
+
+struct ssol_scene
+{
+ struct htable_instance instances;
+ struct s3d_scene* s3d_scn;
+ struct s3d_scene* s3d_sampling_scn;
+ struct ssol_sun* sun;
+
+ struct ssol_device* dev;
+ ref_T ref;
+};
struct s3d_hit;
struct s3d_scene;
diff --git a/src/ssol_solver.c b/src/ssol_solver.c
@@ -157,19 +157,19 @@ get_transform(const struct ssol_object_instance* instance)
* Local functions
******************************************************************************/
res_T
-set_sun_distributions
- (const struct ssol_sun* sun,
- struct solver_data* data)
-{
+set_sun_distributions(struct solver_data* data) {
struct ssol_spectrum* spectrum;
struct ssol_device* dev;
+ const struct ssol_sun* sun;
const double* frequencies;
const double* intensities;
res_T res = RES_OK;
size_t sz;
- if (!sun || !data) return RES_BAD_ARG;
+ if (!data) return RES_BAD_ARG;
ASSERT(data->scene);
+ sun = scene_get_sun(data->scene);
+ ASSERT(sun);
dev = scene_get_device(data->scene);
ASSERT(dev && dev->allocator);
/* first set the spectrum distribution */
@@ -298,31 +298,79 @@ quadric_transform
return RES_OK;
}
+res_T
+set_views(struct solver_data* data) {
+ res_T res = RES_OK;
+ struct ssol_scene* scene;
+ struct s3d_scene* raytrace_scene;
+ struct s3d_scene* sampling_scene;
+ struct htable_instance_iterator it, it_end;
+ int mirror_found = 0;
+
+ if (!data) return RES_BAD_ARG;
+
+ scene = data->scene;
+ ASSERT(scene);
+ raytrace_scene = scene_get_s3d_scene(scene);
+ ASSERT(raytrace_scene);
+ sampling_scene = scene_get_s3d_sampling_scn(scene);
+ ASSERT(sampling_scene);
+ /* feed sampling s3d_scene */
+ S3D(scene_clear(sampling_scene));
+ htable_instance_begin(&scene->instances, &it);
+ htable_instance_end(&scene->instances, &it_end);
+ while (!htable_instance_iterator_eq(&it, &it_end)) {
+ struct ssol_object_instance* inst;
+ struct ssol_material* mat;
+ inst = *htable_instance_iterator_data_get(&it);
+ /* keep only primary mirrors */
+ mat = inst->object->material;
+ if (material_get_type(mat) != MATERIAL_MIRROR)
+ continue;
+ mirror_found = 1;
+ res = s3d_scene_attach_shape(sampling_scene, inst->s3d_shape);
+ if (res != RES_OK) goto error;
+ htable_instance_iterator_next(&it);
+ }
+ if (!mirror_found) {
+ res = RES_BAD_ARG;
+ log_error(scene->dev, "%s: no mirror geometry defined.\n", FUNC_NAME);
+ goto error;
+ }
+ /* create views from scenes */
+ res = s3d_scene_view_create(raytrace_scene, S3D_TRACE, &data->trace_view);
+ if (res != RES_OK) goto error;
+ res = s3d_scene_view_create(sampling_scene, S3D_SAMPLE, &data->sample_view);
+ if (res != RES_OK) goto error;
+
+exit:
+ return res;
+error:
+ /* TODO: clear data */
+ goto exit;
+}
+
static res_T
init_solver_data
(struct ssol_scene* scene,
struct solver_data* data)
{
res_T res = RES_OK;
- const struct ssol_sun* sun;
- struct s3d_scene* scene3d;
+
if (!data || !scene) return RES_BAD_ARG;
- sun = scene_get_sun(scene);
- ASSERT(sun);
data->scene = scene;
- /* create geometry-related data */
- /* res = process_instances(data); */
+ /* create 2 s3d_scene_view for raytracing and sampling */
+ res = set_views(data);
if (res != RES_OK) goto error;
/* create sun distributions */
- res = set_sun_distributions(sun, data);
+ res = set_sun_distributions(data);
if (res != RES_OK) goto error;
- scene3d = scene_get_s3d_scene(scene);
- S3D(scene_begin_session(scene3d, S3D_TRACE));
exit:
return res;
error:
+ /* TODO: clear data */
goto exit;
}
@@ -408,8 +456,6 @@ ssol_solve
FILE* output)
{
struct solver_data data;
- struct s3d_scene* s3d_scn = NULL;
- struct s3d_scene* s3d_sampling_scn = NULL;
struct brdf_composite* brdfs = NULL;
struct s3d_primitive primitive;
struct s3d_attrib attrib;
@@ -438,8 +484,6 @@ ssol_solve
res = init_solver_data(scene, &data);
if (res != RES_OK) goto error;
- s3d_scn = scene_get_s3d_scene(scene);
- s3d_sampling_scn = scene_get_s3d_sampling_scn(scene);
sun = scene_get_sun(scene);
rz.sun_segment.weight = ssol_sun_get_dni(sun);
for (r = 0; r < realisations_count; r++) {
@@ -456,7 +500,7 @@ ssol_solve
r1 = ssp_rng_canonical_float(rng);
r2 = ssp_rng_canonical_float(rng);
r3 = ssp_rng_canonical_float(rng);
- S3D(scene_sample(s3d_sampling_scn, r1, r2, r3, &primitive, uv));
+ S3D(scene_view_sample(data.sample_view, r1, r2, r3, &primitive, uv));
S3D(primitive_get_attrib(&primitive, S3D_POSITION, uv, &attrib));
CHECK(attrib.type, S3D_FLOAT3);
@@ -475,7 +519,7 @@ ssol_solve
/* check if the point receives sunlight */
/* TODO: need only an occlusion test */
- S3D(scene_trace_ray(s3d_scn, seg->org, seg->dir, seg->range, NULL, &seg->hit));
+ S3D(scene_view_trace_ray(data.trace_view, seg->org, seg->dir, seg->range, NULL, &seg->hit));
if (!S3D_HIT_NONE(&seg->hit)) {
rz.final_weight = 0;
rz.end = TERM_SHADOW;
@@ -512,7 +556,7 @@ ssol_solve
brdf_composite_sample(brdfs, rng, prev->dir, tmp, seg->dir);
/* then check if the ray hits something */
- S3D(scene_trace_ray(s3d_scn, seg->org, seg->dir, seg->range, NULL, &seg->hit));
+ S3D(scene_view_trace_ray(data.trace_view, seg->org, seg->dir, seg->range, NULL, &seg->hit));
if (S3D_HIT_NONE(&seg->hit)) {
rz.final_weight = 0;
rz.end = TERM_MISSING;
@@ -541,7 +585,6 @@ ssol_solve
exit:
/* TODO: release data */
- S3D(scene_end_session(s3d_scn));
clear_realization(&rz);
return res;
error:
diff --git a/src/ssol_solver_c.h b/src/ssol_solver_c.h
@@ -34,11 +34,10 @@
struct solver_data {
struct ssol_scene* scene;
- /* data comming from instances of the scene */
- struct darray_quadric quadrics;
- struct darray_3dshape shapes;
- /* the 3D scene used for raytracing */
- struct s3d_scene* scene3d;
+ /* the s3d_scene_view used for raytracing */
+ struct s3d_scene_view* trace_view;
+ /* the s3d_scene_view used for sampling */
+ struct s3d_scene_view* sample_view;
/* the random distributions for sun sampling */
struct ranst_sun_dir* sun_dir_ran;
struct ssp_ranst_piecewise_linear* sun_spectrum_ran;
@@ -47,15 +46,10 @@ struct solver_data {
/* TODO: refcount management for data */
extern LOCAL_SYM res_T
-set_sun_distributions
- (const struct ssol_sun* sun,
- struct solver_data* data);
+set_sun_distributions(struct solver_data* data);
-#if 0
extern LOCAL_SYM res_T
-process_instances
- (struct solver_data* data);
-#endif
+set_views(struct solver_data* data);
/* transform a single quadric in world space */
extern LOCAL_SYM res_T