[964] | 1 | /*
|
---|
| 2 | Copyright (C) 2005-2006 Feeling Software Inc.
|
---|
| 3 | MIT License: http://www.opensource.org/licenses/mit-license.php
|
---|
| 4 | */
|
---|
| 5 |
|
---|
| 6 | /**
|
---|
| 7 | @file FCDEffectPassShader.h
|
---|
| 8 | This file contains the FCDEffectPassShader and the FCDEffectPassBind classes.
|
---|
| 9 | */
|
---|
| 10 |
|
---|
| 11 | #ifndef _FCD_EFFECT_PASS_SHADER_H_
|
---|
| 12 | #define _FCD_EFFECT_PASS_SHADER_H_
|
---|
| 13 |
|
---|
| 14 | #include "FCDocument/FCDObject.h"
|
---|
| 15 |
|
---|
| 16 | class FCDocument;
|
---|
| 17 | class FCDEffectCode;
|
---|
| 18 |
|
---|
| 19 | /**
|
---|
| 20 | A COLLADA shader binding.
|
---|
| 21 |
|
---|
| 22 | Binds an external symbol to a COLLADA effect parameter, by reference.
|
---|
| 23 |
|
---|
| 24 | @ingroup FCDEffect
|
---|
| 25 | */
|
---|
| 26 | class FCOLLADA_EXPORT FCDEffectPassBind
|
---|
| 27 | {
|
---|
| 28 | public:
|
---|
| 29 | string reference; /**< A COLLADA effect parameter reference. */
|
---|
| 30 | string symbol; /**< An external symbol, used within the shader code. */
|
---|
| 31 | };
|
---|
| 32 |
|
---|
| 33 | typedef vector<FCDEffectPassBind> FCDEffectPassBindList; /**< A dynamically-sized array of shader bindings. */
|
---|
| 34 |
|
---|
| 35 | /**
|
---|
| 36 | A COLLADA shader.
|
---|
| 37 |
|
---|
| 38 | The shader abstraction level in ColladaFX is contained within the effect passes.
|
---|
| 39 | There are two types of shaders: vertex shaders and fragment/pixel shaders.
|
---|
| 40 | A COLLADA shader contains a list of bindings to attach the effect parameters to the
|
---|
| 41 | shader input parameters.
|
---|
| 42 |
|
---|
| 43 | The shader object also contains the compiler information necessary to build
|
---|
| 44 | the shader: its code, the compiler target and the compiler options.
|
---|
| 45 | */
|
---|
| 46 | class FCOLLADA_EXPORT FCDEffectPassShader : public FCDObject
|
---|
| 47 | {
|
---|
| 48 | private:
|
---|
| 49 | DeclareObjectType;
|
---|
| 50 | FCDEffectPass* parent;
|
---|
| 51 |
|
---|
| 52 | FCDEffectPassBindList bindings;
|
---|
| 53 | fstring compilerTarget;
|
---|
| 54 | fstring compilerOptions;
|
---|
| 55 | string name;
|
---|
| 56 | bool isFragment;
|
---|
| 57 | FCDEffectCode* code;
|
---|
| 58 |
|
---|
| 59 | public:
|
---|
| 60 | /** Constructor: do not use directly. Instead, use the FCDEffectPass::AddShader,
|
---|
| 61 | FCDEffectPass::AddVertexShader or FCDEffectPass::AddFragmentShader functions.
|
---|
| 62 | @param document The COLLADA document that owns this shader.
|
---|
| 63 | @param parent The effect pass that contains this shader. */
|
---|
| 64 | FCDEffectPassShader(FCDocument* document, FCDEffectPass* parent);
|
---|
| 65 |
|
---|
| 66 | /** Destructor: do not use directly.
|
---|
| 67 | Instead, use the FCDEffectPass::ReleaseShader function. */
|
---|
| 68 | virtual ~FCDEffectPassShader();
|
---|
| 69 |
|
---|
| 70 | /** Retrieves the effect pass that contains this shader.
|
---|
| 71 | @return The effect pass. */
|
---|
| 72 | inline FCDEffectPass* GetParent() { return parent; }
|
---|
| 73 | inline const FCDEffectPass* GetParent() const { return parent; } /**< See above. */
|
---|
| 74 |
|
---|
| 75 | /** Sets this shader as affecting vertices.
|
---|
| 76 | This sets the stage of the shader to the vertex pipeline. */
|
---|
| 77 | inline void AffectsVertices() { isFragment = false; }
|
---|
| 78 |
|
---|
| 79 | /** Sets this shader as affecting fragments/pixels.
|
---|
| 80 | This sets the stage of the shader to the fragment/pixel pipeline. */
|
---|
| 81 | inline void AffectsFragments() { isFragment = true; }
|
---|
| 82 |
|
---|
| 83 | /** Retrieves whether this shader affects fragments/pixels.
|
---|
| 84 | @return Whether this shader affects fragments/pixels. */
|
---|
| 85 | inline bool IsFragmentShader() const { return isFragment; }
|
---|
| 86 |
|
---|
| 87 | /** Retrieves whether this shader affects vertices.
|
---|
| 88 | @return Whether this shader affects vertices. */
|
---|
| 89 | inline bool IsVertexShader() const { return !isFragment; }
|
---|
| 90 |
|
---|
| 91 | /** Retrieves the list of bindings for this shader.
|
---|
| 92 | @return The list of bindings. */
|
---|
| 93 | inline FCDEffectPassBindList& GetBindings() { return bindings; }
|
---|
| 94 | inline const FCDEffectPassBindList& GetBindings() const { return bindings; } /**< See above. */
|
---|
| 95 |
|
---|
| 96 | /** Retrieves the number of bindings for this shader.
|
---|
| 97 | @return The number of bindings. */
|
---|
| 98 | inline size_t GetBindingCount() const { return bindings.size(); }
|
---|
| 99 |
|
---|
| 100 | /** Retrieves a binding contained in this shader.
|
---|
| 101 | @param index The index of the binding.
|
---|
| 102 | @return The binding. This pointer will be NULL if the index is out-of-bounds. */
|
---|
| 103 | inline FCDEffectPassBind* GetBinding(size_t index) { FUAssert(index < GetBindingCount(), return NULL); return &bindings.at(index); }
|
---|
| 104 | inline const FCDEffectPassBind* GetBinding(size_t index) const { FUAssert(index < GetBindingCount(), return NULL); return &bindings.at(index); } /**< See above. */
|
---|
| 105 |
|
---|
| 106 | /** Adds a new binding to this shader.
|
---|
| 107 | @return The new binding. */
|
---|
| 108 | FCDEffectPassBind* AddBinding();
|
---|
| 109 |
|
---|
| 110 | /** Releases a binding contained within this shader.
|
---|
| 111 | @param binding The binding to release. */
|
---|
| 112 | void ReleaseBinding(FCDEffectPassBind* binding);
|
---|
| 113 |
|
---|
| 114 | /** Retrieves the compiler target information.
|
---|
| 115 | The validity of this string depends on the type of the profile that contains this shader.
|
---|
| 116 | @return The compiler target information string. */
|
---|
| 117 | inline const fstring& GetCompilerTarget() const { return compilerTarget; }
|
---|
| 118 |
|
---|
| 119 | /** Sets the compiler target information string.
|
---|
| 120 | The validity of this string depends on the type of the profile that contains this shader.
|
---|
| 121 | @param _compilerTarget The compiler target information. */
|
---|
| 122 | inline void SetCompilerTarget(const fstring& _compilerTarget) { compilerTarget = _compilerTarget; }
|
---|
| 123 |
|
---|
| 124 | /** Retrieves the compiler option string.
|
---|
| 125 | The validity of this string depends on the type of the profile that contains this shader.
|
---|
| 126 | @return The compiler option string. */
|
---|
| 127 | inline const fstring& GetCompilerOptions() const { return compilerOptions; }
|
---|
| 128 |
|
---|
| 129 | /** Sets the compiler option string.
|
---|
| 130 | The validity of this string depends on the type of the profile that contains this shader.
|
---|
| 131 | @param _compilerOptions The compiler option string. */
|
---|
| 132 | inline void SetCompilerOptions(const fstring& _compilerOptions) { compilerOptions = _compilerOptions; }
|
---|
| 133 |
|
---|
| 134 | /** Retrieves the sub-id of the shader.
|
---|
| 135 | @return The sub-id. */
|
---|
| 136 | inline const string& GetName() const { return name; }
|
---|
| 137 |
|
---|
| 138 | /** Sets the sub-id of the shader.
|
---|
| 139 | @param _name The sub-id. */
|
---|
| 140 | inline void SetName(const string& _name) { name = _name; }
|
---|
| 141 |
|
---|
| 142 | /** Retrieves the code inclusion that contains the code for this shader.
|
---|
| 143 | @return The code inclusion. This pointer will be NULL if this shader
|
---|
| 144 | is not yet attached to any code. */
|
---|
| 145 | inline FCDEffectCode* GetCode() { return code; }
|
---|
| 146 | inline const FCDEffectCode* GetCode() const { return code; } /**< See above. */
|
---|
| 147 |
|
---|
| 148 | /** Sets the code inclusion that contains the code for this shader.
|
---|
| 149 | @param _code The code inclusion. This pointer will be NULL to detach
|
---|
| 150 | a shader from its code. */
|
---|
| 151 | inline void SetCode(FCDEffectCode* _code) { code = _code; }
|
---|
| 152 |
|
---|
| 153 | /** [INTERNAL] Clones this shader. You must manually delete the clone.
|
---|
| 154 | @param newParent The effect pass that will contain the clone.
|
---|
| 155 | @return The cloned shader. */
|
---|
| 156 | FCDEffectPassShader* Clone(FCDEffectPass* newParent) const;
|
---|
| 157 |
|
---|
| 158 | /** [INTERNAL] Reads in the pass shader from a given COLLADA XML tree node.
|
---|
| 159 | @param shaderNode The COLLADA XML tree node.
|
---|
| 160 | @return The status of the import. If the status is not successful,
|
---|
| 161 | it may be dangerous to extract information from the shader.*/
|
---|
| 162 | FUStatus LoadFromXML(xmlNode* shaderNode);
|
---|
| 163 |
|
---|
| 164 | /** [INTERNAL] Writes out the pass shader to the given COLLADA XML tree node.
|
---|
| 165 | @param parentNode The COLLADA XML parent node in which to insert the effect profile.
|
---|
| 166 | @return The created element XML tree node. */
|
---|
| 167 | xmlNode* WriteToXML(xmlNode* parentNode) const;
|
---|
| 168 | };
|
---|
| 169 |
|
---|
| 170 | #endif // _FCD_EFFECT_PASS_SHADER_H_
|
---|