#ifndef CG1_TRACER_CLOUDSHADER_H #define CG1_TRACER_CLOUDSHADER_H #include "scene/scene.h" #include "shader.h" #include "light/light.h" #include "primitive/primitive.h" #include "common/noise/worleynoise.h" int const NOISE_SIZE = 128; int const TRANSMITTANCE_BREAK = 0.005f; // If transmittance goes below this limit, the cloud is considered opaque struct CloudSettings { int densitySamples = 100; int lightSamples = 20; float scale = 10; float densityTreshold = 0.55f; float densityIntensity = 2.5f; float densityAbsorption = 2; float darknessThreshold = 0.1f; float shadowIntensity = 0.8f; }; class CloudShader : public Shader { public: CloudShader(CloudSettings const &settings = CloudSettings()); // Shader functions Color shade(Scene const &scene, Ray const &ray) const; Color transparency(const Scene &scene, const Ray &ray, float maxLength) const override; private: CloudSettings settings; bool isTransparent() const; Noise cloudNoise; float getCloudDensity(Vector3d point) const; Color lightMarch(const Scene &scene, Vector3d position, const Ray &ray) const; }; #endif //CG1_TRACER_CLOUDSHADER_H