1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
|
/*
** ClanLib SDK
** Copyright (c) 1997-2005 The ClanLib Team
**
** This software is provided 'as-is', without any express or implied
** warranty. In no event will the authors be held liable for any damages
** arising from the use of this software.
**
** Permission is granted to anyone to use this software for any purpose,
** including commercial applications, and to alter it and redistribute it
** freely, subject to the following restrictions:
**
** 1. The origin of this software must not be misrepresented; you must not
** claim that you wrote the original software. If you use this software
** in a product, an acknowledgment in the product documentation would be
** appreciated but is not required.
** 2. Altered source versions must be plainly marked as such, and must not be
** misrepresented as being the original software.
** 3. This notice may not be removed or altered from any source distribution.
**
** Note: Some of the libraries ClanLib may link to may have additional
** requirements or restrictions.
**
** File Author(s):
**
** Magnus Norddahl
** (if your name is missing here, please add it)
*/
//! clanGL="Display 3D"
//! header=gl.h
#ifndef header_program_object
#define header_program_object
#ifdef CL_API_DLL
#ifdef CL_GL_EXPORT
#define CL_API_GL __declspec(dllexport)
#else
#define CL_API_GL __declspec(dllimport)
#endif
#else
#define CL_API_GL
#endif
#if _MSC_VER > 1000
#pragma once
#endif
#include "../Core/System/sharedptr.h"
#include <string>
#include <vector>
class CL_ResourceManager;
class CL_ShaderObject;
class CL_ProgramAttribute;
class CL_ProgramUniform;
class CL_ProgramObject_Generic;
//: OpenGL Program Object
//- <p>The shader objects that are to be used by programmable stages of
//- OpenGL are collected together to form a program object. CL_ProgramObject
//- is ClanLib's C++ interface to OpenGL program objects.</p>
//- <p>To construct a program object programatically, the procedure is
//- as follows:</p>
//- <pre>
//- CL_ShaderObject vertex_shader(cl_shadertype_vertex, vertex_glsl_sourcecode);
//- CL_ShaderObject fragment_shader(cl_shadertype_fragment, fragment_glsl_sourcecode);
//- CL_ProgramObject program;
//- program.attach(vertex_shader);
//- program.attach(fragment_shader);
//- program.link();
//- </pre>
//- <p>For more information about program objects, see the OpenGL 2.0
//- specification at <a href="http://www.opengl.org">www.opengl.org</a>. Documentation
//- about the OpenGL Shader Language (GLSL) is also available from www.opengl.org.</p>
class CL_API_GL CL_ProgramObject
{
//! Construction:
public:
//: Construct OpenGL program object.
//param resource_id: Name of probject object resource.
//param resources: Resource Manager providing resource.
CL_ProgramObject();
CL_ProgramObject(const std::string &resource_id, CL_ResourceManager *resources);
virtual ~CL_ProgramObject();
//! Attributes:
public:
//: Returns the OpenGL program object handle.
unsigned int get_handle() const;
//: Returns true if the link succeeded.
bool get_link_status() const;
//: Returns true if validation succeeded.
bool get_validate_status() const;
//: Returns the shaders attached to the program object.
std::vector<CL_ShaderObject> get_shaders() const;
//: Returns the current info log for the program object.
std::string get_info_log() const;
//: Returns the count of active attributes.
int get_attribute_count() const;
//: Returns the active attributes.
std::vector<CL_ProgramAttribute> get_attributes() const;
//: Returns the location of a named active attribute.
int get_attribute_location(const std::string &name) const;
//: Returns the count of active uniform variables.
int get_uniform_count() const;
//: Returns true if the uniform variable is present in the program.
//param name: uniform variable name
//param type: CL_FLOAT, CL_FLOAT_VEC2, CL_FLOAT_VEC3, CL_FLOAT_VEC4, CL_INT, CL_INT_VEC2, CL_INT_VEC3, CL_INT_VEC4, CL_BOOL, CL_BOOL_VEC2, CL_BOOL_VEC3, CL_BOOL_VEC4, CL_FLOAT_MAT2, CL_FLOAT_MAT3, CL_FLOAT_MAT4, CL_SAMPLER_1D, CL_SAMPLER_2D, CL_SAMPLER_3D, CL_SAMPLER_CUBE, CL_SAMPLER_1D SHADOW or CL_SAMPLER_2D_SHADOW
bool has_uniform(const std::string &name, int type) const;
//: Returns a list of the active uniforms.
std::vector<CL_ProgramUniform> get_uniforms() const;
//: Returns the location of a named uniform variable.
int get_uniform_location(const std::string &name) const;
//! Operations:
public:
//: Add shader to program object.
void attach(const CL_ShaderObject &obj);
//: Remove shader from program object.
void detach(const CL_ShaderObject &obj);
//: Bind attribute to specific location.
//- <p>This function must be called before linking.</p>
void bind_attribute_location(int index, const std::string &name);
//: Link program.
//- <p>If the linking fails, get_link_status() will return false and
//- get_info_log() will return the link log.</p>
void link();
//: Validate program.
//- <p>If the validation fails, get_validate_status() will return
//- false and get_info_log() will return the validation log.</p>
void validate();
//: Start using the shader.
void use();
//: Stop using the shader.
void disable();
//: Set uniform variable(s).
void set_uniform(const std::string &name, int);
void set_uniform(const std::string &name, int, int);
void set_uniform(const std::string &name, int, int, int);
void set_uniform(const std::string &name, int, int, int, int);
void set_uniform(const std::string &name, int size, int count, int *data);
void set_uniform(const std::string &name, float);
void set_uniform(const std::string &name, float, float);
void set_uniform(const std::string &name, float, float, float);
void set_uniform(const std::string &name, float, float, float, float);
void set_uniform(const std::string &name, int size, int count, float *data);
//: Set uniform matrices.
void set_uniform_matrix(const std::string &name, int size, int count, bool transpose, float *data);
//! Implementation:
private:
CL_SharedPtr<CL_ProgramObject_Generic> impl;
};
#endif
|