From 1af787b9ab1fd2996a593cdf12e7240bb2ac4561 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Fri, 25 Jun 2010 16:37:17 +0000 Subject: [PATCH] added jitter and radius parameters to light objects; not using them yet git-svn-id: svn://anubis/fart/trunk@255 7f9b0f55-74a9-4bce-be96-3c2cd072584d --- main/Light.cc | 7 +++++++ main/Light.h | 6 ++++++ parser/nodes.h | 6 ++++++ parser/parser.lex | 1 + parser/parser.yy | 12 ++++++++++++ scenes/subtract-subtract.fart | 1 + util/Ray.cc | 9 +-------- util/Vector.cc | 19 +++++++++++++++++-- util/Vector.h | 1 + vim/syntax/fart.vim | 2 +- 10 files changed, 53 insertions(+), 11 deletions(-) diff --git a/main/Light.cc b/main/Light.cc index 4012c75..8afd582 100644 --- a/main/Light.cc +++ b/main/Light.cc @@ -1,11 +1,18 @@ #include "Light.h" #include "util/Vector.h" +#include "util/Ray.h" Light::Light() { m_position = Vector(0, 0, 0); m_diffuse_color = Color::white; m_specular_color = Color::white; + m_jitter = 1; + m_radius = 1.0; } +Vector Light::getJitterPosition() const +{ + return m_position + Vector::randomVector() * m_radius; +} diff --git a/main/Light.h b/main/Light.h index e1e869f..88ebe30 100644 --- a/main/Light.h +++ b/main/Light.h @@ -14,6 +14,8 @@ class Light void setPosition(refptr vec) { setPosition(*vec); } const Vector & getPosition() const { return m_position; } + Vector getJitterPosition() const; + void setDiffuseColor(const Color & diffuse) { m_diffuse_color = diffuse; @@ -25,11 +27,15 @@ class Light m_specular_color = specular; } const Color & getSpecularColor() const { return m_specular_color; } + void setJitter(int j) { m_jitter = j; } + int getJitter() const { return m_jitter; } protected: Vector m_position; Color m_diffuse_color; Color m_specular_color; + double m_radius; + int m_jitter; }; #include "PointLight.h" diff --git a/parser/nodes.h b/parser/nodes.h index e55615f..a1687d9 100644 --- a/parser/nodes.h +++ b/parser/nodes.h @@ -130,6 +130,12 @@ class ItemsNode : public Node { }; +class JitterNode : public IntegerNode +{ + public: + JitterNode(int i) : IntegerNode(i) {} +}; + class LightNode : public Node { }; diff --git a/parser/parser.lex b/parser/parser.lex index b7f7c71..4f56684 100644 --- a/parser/parser.lex +++ b/parser/parser.lex @@ -49,6 +49,7 @@ diffuse return DIFFUSE; exposure return EXPOSURE; height return HEIGHT; intersect return INTERSECT; +jitter return JITTER; light return LIGHT; look_at return LOOKAT; material return MATERIAL; diff --git a/parser/parser.yy b/parser/parser.yy index e570fb6..923038a 100644 --- a/parser/parser.yy +++ b/parser/parser.yy @@ -68,6 +68,7 @@ static refptr parsed_scene_node; %token EXPOSURE; %token HEIGHT; %token INTERSECT; +%token JITTER; %token LIGHT; %token LOOKAT; %token MATERIAL; @@ -190,6 +191,11 @@ intersect: INTERSECT LCURLY bool_items RCURLY { } ; +jitter: JITTER number { + $$ = new JitterNode($2->getInteger()); + } + ; + light: LIGHT LCURLY light_items RCURLY { $$ = new LightNode(); $$->addChildren($3); @@ -216,6 +222,12 @@ light_item: POSITION vector { | COLOR vector { $$ = new ColorNode($2->getVector()); } + | radius { + $$ = $1; + } + | jitter { + $$ = $1; + } ; material: MATERIAL LCURLY material_items RCURLY { diff --git a/scenes/subtract-subtract.fart b/scenes/subtract-subtract.fart index 11fe6bc..c11e527 100644 --- a/scenes/subtract-subtract.fart +++ b/scenes/subtract-subtract.fart @@ -15,6 +15,7 @@ scene light { position <-1, -3, 4> + jitter 5 } plane diff --git a/util/Ray.cc b/util/Ray.cc index 2eac9f3..ff4e0b9 100644 --- a/util/Ray.cc +++ b/util/Ray.cc @@ -18,14 +18,7 @@ Ray::Ray(const Vector & origin, const Vector & direction) Ray Ray::randomRay() { - double x, y, z; - do - { - x = 2.0 * rand() / RAND_MAX - 1.0; - y = 2.0 * rand() / RAND_MAX - 1.0; - z = 2.0 * rand() / RAND_MAX - 1.0; - } while (x*x + y*y + z*z <= 1.0); - return Ray(Vector(0, 0, 0), Vector(x, y, z)); + return Ray(Vector(0, 0, 0), Vector::randomVector()); } /* diff --git a/util/Vector.cc b/util/Vector.cc index d2e0944..1744dcb 100644 --- a/util/Vector.cc +++ b/util/Vector.cc @@ -1,7 +1,10 @@ +#include /* rand() */ +#include + +#include + #include "Vector.h" -#include -#include Vector::Vector() { @@ -17,6 +20,18 @@ Vector::Vector(double x, double y, double z) m_array[2] = z; } +Vector Vector::randomVector() +{ + double x, y, z; + do + { + x = 2.0 * rand() / RAND_MAX - 1.0; + y = 2.0 * rand() / RAND_MAX - 1.0; + z = 2.0 * rand() / RAND_MAX - 1.0; + } while (x*x + y*y + z*z > 1.0); + return Vector(x, y, z).normalize(); +} + Vector & Vector::normalize() { double length = mag(); diff --git a/util/Vector.h b/util/Vector.h index 6794e16..9e8fff4 100644 --- a/util/Vector.h +++ b/util/Vector.h @@ -9,6 +9,7 @@ class Vector public: Vector(); Vector(double x, double y, double z); + static Vector randomVector(); double & operator[](int idx) { return m_array[idx]; } double operator[](int idx) const { return m_array[idx]; } Vector operator-() const; diff --git a/vim/syntax/fart.vim b/vim/syntax/fart.vim index 46c5dbd..9e0371f 100644 --- a/vim/syntax/fart.vim +++ b/vim/syntax/fart.vim @@ -10,7 +10,7 @@ endif syn case match -syn keyword fartKeywords ambient color define diffuse exposure height look_at material max_depth multisample options position radius reflectance rotate scale shininess size specular translate transparency union up vfov width +syn keyword fartKeywords ambient color define diffuse exposure height jitter look_at material max_depth multisample options position radius reflectance rotate scale shininess size specular translate transparency union up vfov width syn keyword fartObjects box camera cyl intersect light plane scene sphere subtract union syn match fartNumber "\(^\|\W\)\@<=[+-]\=\(\d\+\)\=\.\=\d\+\([eE][+-]\=\d\+\)\="