summaryrefslogtreecommitdiff
path: root/hw4/src/compoundShader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'hw4/src/compoundShader.cpp')
-rw-r--r--hw4/src/compoundShader.cpp60
1 files changed, 60 insertions, 0 deletions
diff --git a/hw4/src/compoundShader.cpp b/hw4/src/compoundShader.cpp
new file mode 100644
index 0000000..5e19f1f
--- /dev/null
+++ b/hw4/src/compoundShader.cpp
@@ -0,0 +1,60 @@
+/******************************************************************/
+/* This file is part of the homework assignments for CSCI-427/527 */
+/* at The College of William & Mary and authored by Pieter Peers. */
+/* No part of this file, whether altered or in original form, can */
+/* be distributed or used outside the context of CSCI-427/527 */
+/* without consent of either the College of William & Mary or */
+/* Pieter Peers. */
+/******************************************************************/
+
+#include <algorithm>
+#include "compoundShader.h"
+
+//////////////////
+// Constructors //
+//////////////////
+compoundShader::compoundShader(const std::vector<std::shared_ptr<const shader_base>>& shader_list)
+ : shader_base()
+{
+ _compound = shader_list;
+}
+
+
+/////////////
+// Methods //
+/////////////
+color compoundShader::shade(const intersectionPoint& ip, const vec3d& light_dir) const
+{
+ color result(0.0f, 0.0f, 0.0f);
+ for_each(_compound.begin(), _compound.end(), [&](const std::shared_ptr<const shader_base>& shader)
+ {
+ result += shader->shade(ip, light_dir);
+ });
+
+ // Done.
+ return result;
+}
+
+
+shaderProperties compoundShader::properties(const intersectionPoint& ip) const
+{
+ // if any component has a property set, then set it for the compound
+ shaderProperties result(false, false);
+ for(unsigned int i=0; i < _compound.size(); i++)
+ result |= _compound[i]->properties(ip);
+
+ // Done.
+ return result;
+}
+
+
+void compoundShader::_print(std::ostream& s) const
+{
+ s << "Compound Shader (" << _compound.size() << " components): {";
+ for(unsigned int i=0; i < _compound.size(); i++)
+ {
+ s << *_compound[i];
+ if(i != _compound.size()-1) s << ", ";
+ }
+ s << "}";
+}