#pragma once #include "../../types.hpp" #include namespace amalgine { class VertexShader; class PixelShader; class ShaderInputVec2 { friend class VertexShader; public: const std::string& getName() const; private: ShaderInputVec2(VertexShader *_vertexShader, i32 _attributeIndex) : vertexShader(_vertexShader), attributeIndex(_attributeIndex) { } private: VertexShader *vertexShader; i32 attributeIndex; }; class ShaderVec4 { public: ShaderVec4(f32 x = 0.0f, f32 y = 0.0f, f32 z = 0.0f, f32 w = 0.0f) { result = "vec4("; result += std::to_string(x); result += ", "; result += std::to_string(y); result += ", "; result += std::to_string(z); result += ", "; result += std::to_string(w); result += ")"; } ShaderVec4(const ShaderInputVec2 &vec2, f32 z = 0.0f, f32 w = 0.0f) { result = "vec4("; result += vec2.getName(); result += ", "; result += std::to_string(z); result += ", "; result += std::to_string(w); result += ")"; } const std::string& getOutput() const { return result; } private: std::string result; }; class ShaderOutputVec4 { friend class PixelShader; public: const std::string& getName() const; void operator=(const ShaderVec4 &shaderVec4); private: ShaderOutputVec4(PixelShader *_pixelShader, i32 _attributeIndex) : pixelShader(_pixelShader), attributeIndex(_attributeIndex) { } private: PixelShader *pixelShader; i32 attributeIndex; }; }