Files
bullet3/Extras/FCollada/FCDocument/FCDEffectPassShader.h
2006-05-25 19:18:29 +00:00

170 lines
6.8 KiB
C++

/*
Copyright (C) 2005-2006 Feeling Software Inc.
MIT License: http://www.opensource.org/licenses/mit-license.php
*/
/**
@file FCDEffectPassShader.h
This file contains the FCDEffectPassShader and the FCDEffectPassBind classes.
*/
#ifndef _FCD_EFFECT_PASS_SHADER_H_
#define _FCD_EFFECT_PASS_SHADER_H_
#include "FCDocument/FCDObject.h"
class FCDocument;
class FCDEffectCode;
/**
A COLLADA shader binding.
Binds an external symbol to a COLLADA effect parameter, by reference.
@ingroup FCDEffect
*/
class FCOLLADA_EXPORT FCDEffectPassBind
{
public:
string reference; /**< A COLLADA effect parameter reference. */
string symbol; /**< An external symbol, used within the shader code. */
};
typedef vector<FCDEffectPassBind> FCDEffectPassBindList; /**< A dynamically-sized array of shader bindings. */
/**
A COLLADA shader.
The shader abstraction level in ColladaFX is contained within the effect passes.
There are two types of shaders: vertex shaders and fragment/pixel shaders.
A COLLADA shader contains a list of bindings to attach the effect parameters to the
shader input parameters.
The shader object also contains the compiler information necessary to build
the shader: its code, the compiler target and the compiler options.
*/
class FCOLLADA_EXPORT FCDEffectPassShader : public FCDObject
{
private:
FCDEffectPass* parent;
FCDEffectPassBindList bindings;
fstring compilerTarget;
fstring compilerOptions;
string name;
bool isFragment;
FCDEffectCode* code;
public:
/** Constructor: do not use directly. Instead, use the FCDEffectPass::AddShader,
FCDEffectPass::AddVertexShader or FCDEffectPass::AddFragmentShader functions.
@param document The COLLADA document that owns this shader.
@param parent The effect pass that contains this shader. */
FCDEffectPassShader(FCDocument* document, FCDEffectPass* parent);
/** Destructor: do not use directly.
Instead, use the FCDEffectPass::ReleaseShader function. */
virtual ~FCDEffectPassShader();
/** Retrieves the effect pass that contains this shader.
@return The effect pass. */
inline FCDEffectPass* GetParent() { return parent; }
inline const FCDEffectPass* GetParent() const { return parent; } /**< See above. */
/** Sets this shader as affecting vertices.
This sets the stage of the shader to the vertex pipeline. */
inline void AffectsVertices() { isFragment = false; }
/** Sets this shader as affecting fragments/pixels.
This sets the stage of the shader to the fragment/pixel pipeline. */
inline void AffectsFragments() { isFragment = true; }
/** Retrieves whether this shader affects fragments/pixels.
@return Whether this shader affects fragments/pixels. */
inline bool IsFragmentShader() const { return isFragment; }
/** Retrieves whether this shader affects vertices.
@return Whether this shader affects vertices. */
inline bool IsVertexShader() const { return !isFragment; }
/** Retrieves the list of bindings for this shader.
@return The list of bindings. */
inline FCDEffectPassBindList& GetBindings() { return bindings; }
inline const FCDEffectPassBindList& GetBindings() const { return bindings; } /**< See above. */
/** Retrieves the number of bindings for this shader.
@return The number of bindings. */
inline size_t GetBindingCount() const { return bindings.size(); }
/** Retrieves a binding contained in this shader.
@param index The index of the binding.
@return The binding. This pointer will be NULL if the index is out-of-bounds. */
inline FCDEffectPassBind* GetBinding(size_t index) { FUAssert(index < GetBindingCount(), return NULL); return &bindings.at(index); }
inline const FCDEffectPassBind* GetBinding(size_t index) const { FUAssert(index < GetBindingCount(), return NULL); return &bindings.at(index); } /**< See above. */
/** Adds a new binding to this shader.
@return The new binding. */
FCDEffectPassBind* AddBinding();
/** Releases a binding contained within this shader.
@param binding The binding to release. */
void ReleaseBinding(FCDEffectPassBind* binding);
/** Retrieves the compiler target information.
The validity of this string depends on the type of the profile that contains this shader.
@return The compiler target information string. */
inline const fstring& GetCompilerTarget() const { return compilerTarget; }
/** Sets the compiler target information string.
The validity of this string depends on the type of the profile that contains this shader.
@param _compilerTarget The compiler target information. */
inline void SetCompilerTarget(const fstring& _compilerTarget) { compilerTarget = _compilerTarget; }
/** Retrieves the compiler option string.
The validity of this string depends on the type of the profile that contains this shader.
@return The compiler option string. */
inline const fstring& GetCompilerOptions() const { return compilerOptions; }
/** Sets the compiler option string.
The validity of this string depends on the type of the profile that contains this shader.
@param _compilerOptions The compiler option string. */
inline void SetCompilerOptions(const fstring& _compilerOptions) { compilerOptions = _compilerOptions; }
/** Retrieves the sub-id of the shader.
@return The sub-id. */
inline const string& GetName() const { return name; }
/** Sets the sub-id of the shader.
@param _name The sub-id. */
inline void SetName(const string& _name) { name = _name; }
/** Retrieves the code inclusion that contains the code for this shader.
@return The code inclusion. This pointer will be NULL if this shader
is not yet attached to any code. */
inline FCDEffectCode* GetCode() { return code; }
inline const FCDEffectCode* GetCode() const { return code; } /**< See above. */
/** Sets the code inclusion that contains the code for this shader.
@param _code The code inclusion. This pointer will be NULL to detach
a shader from its code. */
inline void SetCode(FCDEffectCode* _code) { code = _code; }
/** [INTERNAL] Clones this shader. You must manually delete the clone.
@param newParent The effect pass that will contain the clone.
@return The cloned shader. */
FCDEffectPassShader* Clone(FCDEffectPass* newParent) const;
/** [INTERNAL] Reads in the pass shader from a given COLLADA XML tree node.
@param shaderNode The COLLADA XML tree node.
@return The status of the import. If the status is not successful,
it may be dangerous to extract information from the shader.*/
FUStatus LoadFromXML(xmlNode* shaderNode);
/** [INTERNAL] Writes out the pass shader to the given COLLADA XML tree node.
@param parentNode The COLLADA XML parent node in which to insert the effect profile.
@return The created element XML tree node. */
xmlNode* WriteToXML(xmlNode* parentNode) const;
};
#endif // _FCD_EFFECT_PASS_SHADER_H_