From 7b19946dab9bc0399214a36dc9067f56c4e0d3a8 Mon Sep 17 00:00:00 2001 From: Syndamia Date: Mon, 27 May 2024 09:22:23 +0300 Subject: [PATCH] [h10] Implemented SpotLight --- data/boxed.hexray | 37 ++++++++++++++++++------------------- flake.lock | 27 +++++++++++++++++++++++++++ flake.nix | 26 ++++++++++++++++++++++++++ src/lights.cpp | 17 +++++++++++++++++ src/lights.h | 19 +++++++++++++++++++ src/main.cpp | 2 +- src/scene.cpp | 1 + src/vector.h | 4 ++++ 8 files changed, 113 insertions(+), 20 deletions(-) create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/data/boxed.hexray b/data/boxed.hexray index e128db3..9ed1793 100644 --- a/data/boxed.hexray +++ b/data/boxed.hexray @@ -18,25 +18,24 @@ Camera camera { //////////////////////// LIGHTS //////////////////////////////////////////// -RectLight l2 { - xSubd 4 - ySubd 4 - translate (50, 50, -20) - scale (8, 8, 8) - color (1, 1, 1) - power 4000 - rotate (0, 45, 0) -} - -RectLight l_small { - translate (0, 28, 50) - rotate (0, -62, 0) - scale (10, 10, 10) - color (1, 1, 1) - power 4000 - xSubd 4 - ySubd 4 -} +SpotLight mylight { + color (1, 1, 1) + power 7000 + pos (50, 50, -20) + dir (-0.727, -0.582, 0.364) + innerAngle 13.8 + outerAngle 15.5 +} + +// RectLight l_small { +// translate (0, 28, 50) +// rotate (0, -62, 0) +// scale (10, 10, 10) +// color (1, 1, 1) +// power 4000 +// xSubd 4 +// ySubd 4 +// } //////////////////////// GEOMETRIES //////////////////////////////////////// diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..25db693 --- /dev/null +++ b/flake.lock @@ -0,0 +1,27 @@ +{ + "nodes": { + "nixpkgs": { + "locked": { + "lastModified": 1716061101, + "narHash": "sha256-H0eCta7ahEgloGIwE/ihkyGstOGu+kQwAiHvwVoXaA0=", + "owner": "nixos", + "repo": "nixpkgs", + "rev": "e7cc61784ddf51c81487637b3031a6dd2d6673a2", + "type": "github" + }, + "original": { + "owner": "nixos", + "ref": "nixos-23.11", + "repo": "nixpkgs", + "type": "github" + } + }, + "root": { + "inputs": { + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..d0a99fd --- /dev/null +++ b/flake.nix @@ -0,0 +1,26 @@ +# Този файл, заедно с flake.lock са си за моета система, да имам копие ако случайно изтрия нещо +{ + description = "hexray raytracer in FMI elective"; + + inputs = { + nixpkgs.url = "github:nixos/nixpkgs/nixos-23.11"; + }; + + outputs = inputs: + let + pkgs = inputs.nixpkgs.legacyPackages."x86_64-linux"; + in { + devShells."x86_64-linux".default = pkgs.mkShell { + nativeBuildInputs = with pkgs; [ + cmake + pkg-config + ]; + + buildInputs = with pkgs; [ + SDL2 + openexr_3 + zlib + ]; + }; + }; +} diff --git a/src/lights.cpp b/src/lights.cpp index d1b5a42..f1e6406 100644 --- a/src/lights.cpp +++ b/src/lights.cpp @@ -44,3 +44,20 @@ void RectLight::getNthSample(int sampleIdx, const Vector& shadePos, Vector& samp color.makeZero(); } } + +void SpotLight::getNthSample(int sampleIdx, const Vector& shadePos, Vector& samplePos, Color& color) { + samplePos = pos; + + Vector shadeDir = shadePos - pos; + double degr = degreesBetween(shadeDir, dir); + if (degr < innerAngle) { + color = this->color; + } + else if (degr > outerAngle) { + color = Color(0, 0, 0); + } + else { + double alpha = (degr - innerAngle) / (outerAngle - innerAngle); + color = (1 - alpha) * this->color + alpha * Color(0, 0, 0); + } +} diff --git a/src/lights.h b/src/lights.h index 548b53f..c76b9be 100644 --- a/src/lights.h +++ b/src/lights.h @@ -79,3 +79,22 @@ public: void getNthSample(int sampleIdx, const Vector& shadePos, Vector& samplePos, Color& color) override; }; + +class SpotLight : public Light { + Vector pos; + Vector dir; + double innerAngle; + double outerAngle; +public: + void fillProperties(ParsedBlock& pb) override + { + Light::fillProperties(pb); + pb.getVectorProp("pos", &pos); + pb.getVectorProp("dir", &dir); + pb.getDoubleProp("innerAngle", &innerAngle); + pb.getDoubleProp("outerAngle", &outerAngle); + } + + int getNumSamples() const override { return 1; } + void getNthSample(int sampleIdx, const Vector& shadePos, Vector& samplePos, Color& color) override; +}; diff --git a/src/main.cpp b/src/main.cpp index d523f60..7a181cb 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -222,7 +222,7 @@ bool renderStatic() return render(true); } -const char* DEFAULT_SCENE = "data/meshes.hexray"; +const char* DEFAULT_SCENE = "data/boxed.hexray"; int main(int argc, char** argv) { diff --git a/src/scene.cpp b/src/scene.cpp index f5fbdb0..82c8d98 100644 --- a/src/scene.cpp +++ b/src/scene.cpp @@ -799,6 +799,7 @@ SceneElement* DefaultSceneParser::newSceneElement(const char* className) if (!strcmp(className, "Const")) return new Const; if (!strcmp(className, "PointLight")) return new PointLight; if (!strcmp(className, "RectLight")) return new RectLight; + if (!strcmp(className, "SpotLight")) return new SpotLight; return NULL; } diff --git a/src/vector.h b/src/vector.h index a21b432..cd140fb 100644 --- a/src/vector.h +++ b/src/vector.h @@ -199,3 +199,7 @@ inline std::pair othonormedBasis(const Vector& v) result.second = result.first ^ v; return result; } + +inline double degreesBetween(const Vector& a, const Vector& b) { + return acos(dot(normalize(a), normalize(b))) * 180 / M_PI; +} -- 2.42.0