From 367d5fc610b4111fbf036b0d32becee9118403b2 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Mon, 8 Oct 2012 12:21:16 +0200 Subject: [PATCH] Move Node and Phase out from being inner classes, given that we soon want to expose Node to effects. --- effect_chain.cpp | 20 ++++++------ effect_chain.h | 82 +++++++++++++++++++++++++----------------------- 2 files changed, 53 insertions(+), 49 deletions(-) diff --git a/effect_chain.cpp b/effect_chain.cpp index b4be148..1d84e89 100644 --- a/effect_chain.cpp +++ b/effect_chain.cpp @@ -74,9 +74,9 @@ void EffectChain::add_effect_raw(Effect *effect, const std::vector &in node_map[effect] = node; } -void EffectChain::find_all_nonlinear_inputs(EffectChain::Node *node, - std::vector *nonlinear_inputs, - std::vector *intermediates) +void EffectChain::find_all_nonlinear_inputs(Node *node, + std::vector *nonlinear_inputs, + std::vector *intermediates) { if (node->output_gamma_curve == GAMMA_LINEAR) { return; @@ -92,7 +92,7 @@ void EffectChain::find_all_nonlinear_inputs(EffectChain::Node *node, } } -EffectChain::Node *EffectChain::normalize_to_linear_gamma(EffectChain::Node *input) +Node *EffectChain::normalize_to_linear_gamma(Node *input) { // Find out if all the inputs can be set to deliver sRGB inputs. // If so, we can just ask them to do that instead of inserting a @@ -140,7 +140,7 @@ EffectChain::Node *EffectChain::normalize_to_linear_gamma(EffectChain::Node *inp return node; } -EffectChain::Node *EffectChain::normalize_to_srgb(EffectChain::Node *input) +Node *EffectChain::normalize_to_srgb(Node *input) { assert(input->output_gamma_curve == GAMMA_LINEAR); ColorSpaceConversionEffect *colorspace_conversion = new ColorSpaceConversionEffect(); @@ -218,9 +218,9 @@ std::string replace_prefix(const std::string &text, const std::string &prefix) return output; } -EffectChain::Phase *EffectChain::compile_glsl_program( - const std::vector &inputs, - const std::vector &effects) +Phase *EffectChain::compile_glsl_program( + const std::vector &inputs, + const std::vector &effects) { assert(!effects.empty()); @@ -312,7 +312,7 @@ EffectChain::Phase *EffectChain::compile_glsl_program( // // We follow a quite simple depth-first search from the output, although // without any explicit recursion. -void EffectChain::construct_glsl_programs(EffectChain::Node *output) +void EffectChain::construct_glsl_programs(Node *output) { // Which effects have already been completed in this phase? // We need to keep track of it, as an effect with multiple outputs @@ -414,7 +414,7 @@ void EffectChain::construct_glsl_programs(EffectChain::Node *output) std::reverse(phases.begin(), phases.end()); } -void EffectChain::find_output_size(EffectChain::Phase *phase) +void EffectChain::find_output_size(Phase *phase) { Node *output_node = phase->effects.back(); diff --git a/effect_chain.h b/effect_chain.h index 9d389d5..e6e2d72 100644 --- a/effect_chain.h +++ b/effect_chain.h @@ -8,6 +8,49 @@ #include "image_format.h" #include "input.h" +class EffectChain; +class Phase; + +// A node in the graph; basically an effect and some associated information. +class Node { +public: + Effect *effect; + + // Edges in the graph (forward and backward). + std::vector outgoing_links; + std::vector incoming_links; + +private: + // Identifier used to create unique variables in GLSL. + std::string effect_id; + + // If output goes to RTT (otherwise, none of these are set). + // The Phsae pointer is a but ugly; we should probably fix so + // that Phase takes other phases as inputs, instead of Node. + GLuint output_texture; + unsigned output_texture_width, output_texture_height; + Phase *phase; + + // Used during the building of the effect chain. + ColorSpace output_color_space; + GammaCurve output_gamma_curve; + + friend class EffectChain; +}; + +// A rendering phase; a single GLSL program rendering a single quad. +struct Phase { + GLint glsl_program_num; + bool input_needs_mipmaps; + + // Inputs are only inputs from other phases (ie., those that come from RTT); + // input textures are not counted here. + std::vector inputs; + + std::vector effects; // In order. + unsigned output_width, output_height; +}; + class EffectChain { public: EffectChain(unsigned width, unsigned height); @@ -62,44 +105,6 @@ public: } private: - struct Phase; - - // A node in the graph; basically an effect and some associated information. - struct Node { - Effect *effect; - - // Identifier used to create unique variables in GLSL. - std::string effect_id; - - // Edges in the graph (forward and backward). - std::vector outgoing_links; - std::vector incoming_links; - - // If output goes to RTT (otherwise, none of these are set). - // The Phsae pointer is a but ugly; we should probably fix so - // that Phase takes other phases as inputs, instead of Node. - GLuint output_texture; - unsigned output_texture_width, output_texture_height; - Phase *phase; - - // Used during the building of the effect chain. - ColorSpace output_color_space; - GammaCurve output_gamma_curve; - }; - - // A rendering phase; a single GLSL program rendering a single quad. - struct Phase { - GLint glsl_program_num; - bool input_needs_mipmaps; - - // Inputs are only inputs from other phases (ie., those that come from RTT); - // input textures are not counted here. - std::vector inputs; - - std::vector effects; // In order. - unsigned output_width, output_height; - }; - // Determine the preferred output size of a given phase. // Requires that all input phases (if any) already have output sizes set. void find_output_size(Phase *phase); @@ -135,5 +140,4 @@ private: bool finalized; }; - #endif // !defined(_EFFECT_CHAIN_H) -- 2.39.2