Working on clouds walking
This commit is contained in:
parent
b7f64c6d79
commit
5e4b4e59a9
5 changed files with 79 additions and 17 deletions
2
src/rendering/clouds/clo_lighting.c
Normal file
2
src/rendering/clouds/clo_lighting.c
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
#include "clo_lighting.h"
|
||||||
|
|
30
src/rendering/clouds/clo_lighting.h
Normal file
30
src/rendering/clouds/clo_lighting.h
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
#ifndef _PAYSAGES_CLOUDS_LIGHTING_H_
|
||||||
|
#define _PAYSAGES_CLOUDS_LIGHTING_H_
|
||||||
|
|
||||||
|
#include "public.h"
|
||||||
|
#include "../tools/euclid.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cloud lighting helpers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
{
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Bind fake lighting functions to a renderer.
|
||||||
|
*/
|
||||||
|
void cloudsBindFakeLightingToRenderer(CloudsRenderer* renderer);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Bind real lighting functions to a renderer.
|
||||||
|
*/
|
||||||
|
void cloudsBindRealLightingToRenderer(CloudsRenderer* renderer);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -136,8 +136,8 @@ int cloudsGetLayerPrimarySegments(Renderer* renderer, CloudsLayerDefinition* lay
|
||||||
/* exiting the cloud */
|
/* exiting the cloud */
|
||||||
segment_length += step_length;
|
segment_length += step_length;
|
||||||
|
|
||||||
out_segments->enter = segment_start;
|
out_segments->entry_point = segment_start;
|
||||||
out_segments->exit = walker;
|
out_segments->exit_point = walker;
|
||||||
out_segments->length = segment_length;
|
out_segments->length = segment_length;
|
||||||
out_segments++;
|
out_segments++;
|
||||||
if (++segment_count >= max_segments)
|
if (++segment_count >= max_segments)
|
||||||
|
@ -155,3 +155,7 @@ int cloudsGetLayerPrimarySegments(Renderer* renderer, CloudsLayerDefinition* lay
|
||||||
|
|
||||||
return segment_count;
|
return segment_count;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int cloudsGetLayerSecondarySampling(Renderer* renderer, CloudsLayerDefinition* layer, CloudPrimarySegment* segment, int max_control_points, CloudSecondaryControlPoint* out_control_points)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
#include "../tools/euclid.h"
|
#include "../tools/euclid.h"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Functions to walk through a cloud layer.
|
* Functions to walk through a cloud layer (sampling).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -15,11 +15,25 @@ extern "C"
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
Vector3 enter;
|
Vector3 entry_point;
|
||||||
Vector3 exit;
|
Vector3 exit_point;
|
||||||
double length;
|
double length;
|
||||||
} CloudPrimarySegment;
|
} CloudPrimarySegment;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
/** Distance factor of the control point from the segment start */
|
||||||
|
double distance;
|
||||||
|
/** Location of the control point */
|
||||||
|
Vector3 location;
|
||||||
|
/** Global density at the control point (no edge noise applied) */
|
||||||
|
double global_density;
|
||||||
|
/** Particle dentisy at the control point, using edge noise */
|
||||||
|
double particle_density;
|
||||||
|
/** Estimated distance to nearest cloud exit */
|
||||||
|
double nearest_exit_distance;
|
||||||
|
} CloudSecondaryControlPoint;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Optimize the search limits in a layer.
|
* Optimize the search limits in a layer.
|
||||||
*
|
*
|
||||||
|
@ -38,11 +52,23 @@ int cloudsOptimizeWalkingBounds(CloudsLayerDefinition* layer, Vector3* start, Ve
|
||||||
* @param start Start position of the lookup
|
* @param start Start position of the lookup
|
||||||
* @param end End position of the lookup
|
* @param end End position of the lookup
|
||||||
* @param max_segments Maximum number of segments to collect
|
* @param max_segments Maximum number of segments to collect
|
||||||
* @param out_segments Allocated space to fill found segments
|
* @param out_segments Allocated space to fill found segments (must be at least 'max_segments' long)
|
||||||
* @return Number of segments found
|
* @return Number of segments found
|
||||||
*/
|
*/
|
||||||
int cloudsGetLayerPrimarySegments(Renderer* renderer, CloudsLayerDefinition* layer, Vector3 start, Vector3 end, int max_segments, CloudPrimarySegment* out_segments);
|
int cloudsGetLayerPrimarySegments(Renderer* renderer, CloudsLayerDefinition* layer, Vector3 start, Vector3 end, int max_segments, CloudPrimarySegment* out_segments);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sample a primary segment with refined details, collecting material interaction.
|
||||||
|
*
|
||||||
|
* @param renderer The renderer environment
|
||||||
|
* @param layer The cloud layer
|
||||||
|
* @param segment The primary segment to sample
|
||||||
|
* @param max_control_points Maximum number of control points to sample
|
||||||
|
* @param out_control_points Allocated space to fill with secondary control points (must be at least 'max_control_points' long)
|
||||||
|
* @return Number of control points sampled
|
||||||
|
*/
|
||||||
|
int cloudsGetLayerSecondarySampling(Renderer* renderer, CloudsLayerDefinition* layer, CloudPrimarySegment* segment, int max_control_points, CloudSecondaryControlPoint* out_control_points);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -221,18 +221,18 @@ START_TEST(test_clouds_primary_segments)
|
||||||
ck_assert_int_eq(segment_count, 2);
|
ck_assert_int_eq(segment_count, 2);
|
||||||
for (i = 0; i < segment_count; i++)
|
for (i = 0; i < segment_count; i++)
|
||||||
{
|
{
|
||||||
ck_assert_double_eq(segments[i].enter.y, 0.0);
|
ck_assert_double_eq(segments[i].entry_point.y, 0.0);
|
||||||
ck_assert_double_eq(segments[i].enter.z, 0.0);
|
ck_assert_double_eq(segments[i].entry_point.z, 0.0);
|
||||||
ck_assert_double_eq(segments[i].exit.y, 0.0);
|
ck_assert_double_eq(segments[i].exit_point.y, 0.0);
|
||||||
ck_assert_double_eq(segments[i].exit.z, 0.0);
|
ck_assert_double_eq(segments[i].exit_point.z, 0.0);
|
||||||
}
|
}
|
||||||
ck_assert_double_in_range(segments[0].enter.x, -0.5, 0.0);
|
ck_assert_double_in_range(segments[0].entry_point.x, -0.4, 0.0);
|
||||||
ck_assert_double_in_range(segments[0].exit.x, 0.5, 1.0);
|
ck_assert_double_in_range(segments[0].exit_point.x, 0.5, 1.0);
|
||||||
ck_assert_double_in_range(segments[0].length, 0.5, 1.5);
|
ck_assert_double_in_range(segments[0].length, 0.5, 1.3);
|
||||||
ck_assert_double_gte(segments[1].enter.x, segments[0].exit.x);
|
ck_assert_double_gte(segments[1].entry_point.x, segments[0].exit_point.x);
|
||||||
ck_assert_double_in_range(segments[1].enter.x, 0.5, 1.0);
|
ck_assert_double_in_range(segments[1].entry_point.x, 0.5, 1.0);
|
||||||
ck_assert_double_in_range(segments[1].exit.x, 1.5, 2.0);
|
ck_assert_double_in_range(segments[1].exit_point.x, 1.5, 1.9);
|
||||||
ck_assert_double_in_range(segments[1].length, 0.5, 1.5);
|
ck_assert_double_in_range(segments[1].length, 0.5, 1.3);
|
||||||
|
|
||||||
cloudsGetLayerType().callback_delete(layer);
|
cloudsGetLayerType().callback_delete(layer);
|
||||||
rendererDelete(renderer);
|
rendererDelete(renderer);
|
||||||
|
|
Loading…
Reference in a new issue