#pragma once #include "GfxCore/Shader.h" #include #include struct IDirect3DVertexShader9; struct IDirect3DPixelShader9; namespace RBX { namespace Graphics { struct UniformD3D9 { enum RegisterSet { Register_Float, Register_Bool, Register_Int, Register_Count }; std::string name; RegisterSet registerSet; unsigned int registerIndex; unsigned int registerCount; }; class VertexShaderD3D9: public VertexShader { public: VertexShaderD3D9(Device* device, const std::vector& bytecode); ~VertexShaderD3D9(); virtual void reloadBytecode(const std::vector& bytecode); IDirect3DVertexShader9* getObject() const { return object; } int getRegisterWorldMatrix() const { return registerWorldMatrix; } int getRegisterWorldMatrixArray() const { return registerWorldMatrixArray; } unsigned int getMaxWorldTransforms() const { return maxWorldTransforms; } const std::vector& getUniforms() const { return uniforms; } private: IDirect3DVertexShader9* object; int registerWorldMatrix; int registerWorldMatrixArray; unsigned int maxWorldTransforms; std::vector uniforms; }; class FragmentShaderD3D9: public FragmentShader { public: FragmentShaderD3D9(Device* device, const std::vector& bytecode); ~FragmentShaderD3D9(); virtual void reloadBytecode(const std::vector& bytecode); IDirect3DPixelShader9* getObject() const { return object; } unsigned int getSamplerMask() const { return samplerMask; } const std::vector& getUniforms() const { return uniforms; } private: IDirect3DPixelShader9* object; unsigned int samplerMask; std::vector uniforms; }; class ShaderProgramD3D9: public ShaderProgram { public: ShaderProgramD3D9(Device* device, const shared_ptr& vertexShader, const shared_ptr& fragmentShader); ~ShaderProgramD3D9(); virtual int getConstantHandle(const char* name) const; virtual unsigned int getMaxWorldTransforms() const; virtual unsigned int getSamplerMask() const; void bind(); void setWorldTransforms4x3(const float* data, size_t matrixCount); void setConstant(int handle, const float* data, size_t vectorCount); static std::string createShaderSource(const std::string& path, const std::string& defines, boost::function fileCallback); static std::vector createShaderBytecode(const std::string& source, const std::string& target, const std::string& entrypoint); }; class ShaderProgramFFPD3D9: public ShaderProgram { public: ShaderProgramFFPD3D9(Device* device); ~ShaderProgramFFPD3D9(); virtual int getConstantHandle(const char* name) const; virtual unsigned int getMaxWorldTransforms() const; virtual unsigned int getSamplerMask() const; }; } }