program_object.h
1 /*
2 ** ClanLib SDK
3 ** Copyright (c) 1997-2013 The ClanLib Team
4 **
5 ** This software is provided 'as-is', without any express or implied
6 ** warranty. In no event will the authors be held liable for any damages
7 ** arising from the use of this software.
8 **
9 ** Permission is granted to anyone to use this software for any purpose,
10 ** including commercial applications, and to alter it and redistribute it
11 ** freely, subject to the following restrictions:
12 **
13 ** 1. The origin of this software must not be misrepresented; you must not
14 ** claim that you wrote the original software. If you use this software
15 ** in a product, an acknowledgment in the product documentation would be
16 ** appreciated but is not required.
17 ** 2. Altered source versions must be plainly marked as such, and must not be
18 ** misrepresented as being the original software.
19 ** 3. This notice may not be removed or altered from any source distribution.
20 **
21 ** Note: Some of the libraries ClanLib may link to may have additional
22 ** requirements or restrictions.
23 **
24 ** File Author(s):
25 **
26 ** Magnus Norddahl
27 ** Harry Storbacka
28 ** Kenneth Gangstoe
29 */
30 
31 
32 #pragma once
33 
34 #include "../api_display.h"
35 #include <memory>
36 #include "../../Core/IOData/file_system.h"
37 #include "graphic_context.h"
38 #include "uniform_vector.h"
39 
40 namespace clan
41 {
44 
45 class ShaderObject;
46 class ProgramObject_Impl;
47 class GraphicContext;
48 class GraphicContextProvider;
49 class XMLResourceDocument;
50 class ProgramObjectProvider;
51 
70 class CL_API_DISPLAY ProgramObject
71 {
74 public:
76  ProgramObject();
77 
82 
87 
92 
100  static ProgramObject load(GraphicContext &gc, const std::string &resource_id, const XMLResourceDocument &resman);
101 
109  static ProgramObject load(GraphicContext &gc, const std::string &vertex_fullname, const std::string &fragment_fullname);
110 
119  static ProgramObject load(GraphicContext &gc, const std::string &vertex_fullname, const std::string &geometry_fullname, const std::string &fragment_fullname);
120 
129  static ProgramObject load(GraphicContext &gc, const std::string &vertex_filename, const std::string &fragment_filename, const FileSystem &fs);
130 
140  static ProgramObject load(GraphicContext &gc, const std::string &vertex_filename, const std::string &geometry_filename, const std::string &fragment_filename, const FileSystem &fs);
141 
149  static ProgramObject load(GraphicContext &gc, IODevice &vertex_file, IODevice &fragment_file);
150 
159  static ProgramObject load(GraphicContext &gc, IODevice &vertex_file, IODevice &geometry_file, IODevice &fragment_file);
160 
168  static ProgramObject load_and_link(GraphicContext &gc, const std::string &vertex_fullname, const std::string &fragment_fullname);
169 
178  static ProgramObject load_and_link(GraphicContext &gc, const std::string &vertex_fullname, const std::string &geometry_fullname, const std::string &fragment_fullname);
179 
188  static ProgramObject load_and_link(GraphicContext &gc, const std::string &vertex_filename, const std::string &fragment_filename, const FileSystem &fs);
189 
199  static ProgramObject load_and_link(GraphicContext &gc, const std::string &vertex_filename, const std::string &geometry_filename, const std::string &fragment_filename, const FileSystem &fs);
200 
208  static ProgramObject load_and_link(GraphicContext &gc, IODevice &vertex_file, IODevice &fragment_file);
209 
218  static ProgramObject load_and_link(GraphicContext &gc, IODevice &vertex_file, IODevice &geometry_file, IODevice &fragment_file);
219 
220  virtual ~ProgramObject();
222 
225 public:
227  bool is_null() const { return !impl; }
228 
230  void throw_if_null() const;
231 
233  ProgramObjectProvider *get_provider() const;
234 
236  unsigned int get_handle() const;
237 
239  std::vector<ShaderObject> get_shaders() const;
240 
242  std::string get_info_log() const;
243 
247  int get_attribute_location(const std::string &name) const;
248 
252  int get_uniform_location(const std::string &name) const;
253 
259  int get_uniform_buffer_size(const std::string &block_name) const;
260 
262  int get_uniform_buffer_size(int block_index) const;
263 
267  int get_uniform_buffer_index(const std::string &block_name) const;
268 
272  int get_storage_buffer_index(const std::string &name) const;
274 
277 public:
279  bool operator==(const ProgramObject &other) const;
280 
282  void attach(const ShaderObject &obj);
283 
285  void detach(const ShaderObject &obj);
286 
288 
289  void bind_attribute_location(int index, const std::string &name);
290 
292 
293  void bind_frag_data_location(int color_number, const std::string &name);
294 
296 
297  bool link();
298 
300 
301  bool validate();
302 
303  void set_uniform1i(int location, int value_a);
304  void set_uniform2i(int location, int value_a, int value_b);
305  void set_uniform3i(int location, int value_a, int value_b, int value_c);
306  void set_uniform4i(int location, int value_a, int value_b, int value_c, int value_d);
307  void set_uniformiv(int location, int size, int count, const int *data);
308  void set_uniform2i(int location, const Vec2i &vec) {set_uniform2i(location, vec.x, vec.y);}
309  void set_uniform3i(int location, const Vec3i &vec) {set_uniform3i(location, vec.x, vec.y, vec.z);}
310  void set_uniform4i(int location, const Vec4i &vec) {set_uniform4i(location, vec.x, vec.y, vec.z, vec.w);}
311  void set_uniform2s(int location, const Vec2s &vec) {set_uniform2i(location, vec.x, vec.y);}
312  void set_uniform3s(int location, const Vec3s &vec) {set_uniform3i(location, vec.x, vec.y, vec.z);}
313  void set_uniform4s(int location, const Vec4s &vec) {set_uniform4i(location, vec.x, vec.y, vec.z, vec.w);}
314  void set_uniform2b(int location, const Vec2b &vec) {set_uniform2i(location, vec.x, vec.y);}
315  void set_uniform3b(int location, const Vec3b &vec) {set_uniform3i(location, vec.x, vec.y, vec.z);}
316  void set_uniform4b(int location, const Vec4b &vec) {set_uniform4i(location, vec.x, vec.y, vec.z, vec.w);}
317  void set_uniformiv(int location, int count, const Vec2i *data) {set_uniformiv(location, 2, count, &data->x);}
318  void set_uniformiv(int location, int count, const Vec3i *data) {set_uniformiv(location, 3, count, &data->x);}
319  void set_uniformiv(int location, int count, const Vec4i *data) {set_uniformiv(location, 4, count, &data->x);}
320  void set_uniform1f(int location, float value_a);
321  void set_uniform2f(int location, float value_a, float value_b);
322  void set_uniform3f(int location, float value_a, float value_b, float value_c);
323  void set_uniform4f(int location, float value_a, float value_b, float value_c, float value_d);
324  void set_uniformfv(int location, int size, int count, const float *data);
325  void set_uniform2f(int location, const Vec2f &vec) {set_uniform2f(location, vec.x, vec.y);}
326  void set_uniform3f(int location, const Vec3f &vec) {set_uniform3f(location, vec.x, vec.y, vec.z);}
327  void set_uniform4f(int location, const Vec4f &vec) {set_uniform4f(location, vec.x, vec.y, vec.z, vec.w);}
328  void set_uniformfv(int location, int count, const Vec2f *data) {set_uniformfv(location, 2, count, &data->x);}
329  void set_uniformfv(int location, int count, const Vec3f *data) {set_uniformfv(location, 3, count, &data->x);}
330  void set_uniformfv(int location, int count, const Vec4f *data) {set_uniformfv(location, 4, count, &data->x);}
331  void set_uniform_matrix(int location, int size, int count, bool transpose, const float *data);
332  void set_uniform_matrix(int location, const Mat2f &matrix) {set_uniform_matrix(location, 2, 1, false, matrix.matrix);}
333  void set_uniform_matrix(int location, const Mat3f &matrix) {set_uniform_matrix(location, 3, 1, false, matrix.matrix);}
334  void set_uniform_matrix(int location, const Mat4f &matrix) {set_uniform_matrix(location, 4, 1, false, matrix.matrix);}
335  void set_uniform_matrix(int location, int count, const Mat2f *matrix) {set_uniform_matrix(location, 2, count, false, matrix->matrix);}
336  void set_uniform_matrix(int location, int count, const Mat3f *matrix) {set_uniform_matrix(location, 3, count, false, matrix->matrix);}
337  void set_uniform_matrix(int location, int count, const Mat4f *matrix) {set_uniform_matrix(location, 4, count, false, matrix->matrix);}
338 
339  void set_uniform1i(const std::string &name, int value_a) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform1i(loc, value_a); }
340  void set_uniform2i(const std::string &name, int value_a, int value_b) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform2i(loc, value_a, value_b); }
341  void set_uniform3i(const std::string &name, int value_a, int value_b, int value_c) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform3i(loc, value_a, value_b, value_c); }
342  void set_uniform4i(const std::string &name, int value_a, int value_b, int value_c, int value_d) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform4i(loc, value_a, value_b, value_c, value_d); }
343  void set_uniformiv(const std::string &name, int size, int count, const int *data) { int loc = get_uniform_location(name); if (loc >= 0) set_uniformiv(loc, size, count, data); }
344  void set_uniform2i(const std::string &name, const Vec2i &vec) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform2i(loc, vec); }
345  void set_uniform3i(const std::string &name, const Vec3i &vec) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform3i(loc, vec); }
346  void set_uniform4i(const std::string &name, const Vec4i &vec) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform4i(loc, vec); }
347  void set_uniform2s(const std::string &name, const Vec2s &vec) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform2s(loc, vec); }
348  void set_uniform3s(const std::string &name, const Vec3s &vec) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform3s(loc, vec); }
349  void set_uniform4s(const std::string &name, const Vec4s &vec) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform4s(loc, vec); }
350  void set_uniform2b(const std::string &name, const Vec2b &vec) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform2b(loc, vec); }
351  void set_uniform3b(const std::string &name, const Vec3b &vec) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform3b(loc, vec); }
352  void set_uniform4b(const std::string &name, const Vec4b &vec) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform4b(loc, vec); }
353  void set_uniformiv(const std::string &name, int count, const Vec2i *data) { int loc = get_uniform_location(name); if (loc >= 0) set_uniformiv(loc, count, data); }
354  void set_uniformiv(const std::string &name, int count, const Vec3i *data) { int loc = get_uniform_location(name); if (loc >= 0) set_uniformiv(loc, count, data); }
355  void set_uniformiv(const std::string &name, int count, const Vec4i *data) { int loc = get_uniform_location(name); if (loc >= 0) set_uniformiv(loc, count, data); }
356  void set_uniform1f(const std::string &name, float value_a) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform1f(loc, value_a); }
357  void set_uniform2f(const std::string &name, float value_a, float value_b) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform2f(loc, value_a, value_b); }
358  void set_uniform3f(const std::string &name, float value_a, float value_b, float value_c) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform3f(loc, value_a, value_b, value_c); }
359  void set_uniform4f(const std::string &name, float value_a, float value_b, float value_c, float value_d) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform4f(loc, value_a, value_b, value_c, value_d); }
360  void set_uniformfv(const std::string &name, int size, int count, const float *data) { int loc = get_uniform_location(name); if (loc >= 0) set_uniformfv(loc, size, count, data); }
361  void set_uniform2f(const std::string &name, const Vec2f &vec) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform2f(loc, vec); }
362  void set_uniform3f(const std::string &name, const Vec3f &vec) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform3f(loc, vec); }
363  void set_uniform4f(const std::string &name, const Vec4f &vec) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform4f(loc, vec); }
364  void set_uniformfv(const std::string &name, int count, const Vec2f *data) { int loc = get_uniform_location(name); if (loc >= 0) set_uniformfv(loc, count, data); }
365  void set_uniformfv(const std::string &name, int count, const Vec3f *data) { int loc = get_uniform_location(name); if (loc >= 0) set_uniformfv(loc, count, data); }
366  void set_uniformfv(const std::string &name, int count, const Vec4f *data) { int loc = get_uniform_location(name); if (loc >= 0) set_uniformfv(loc, count, data); }
367  void set_uniform_matrix(const std::string &name, int size, int count, bool transpose, const float *data) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform_matrix(loc, size, count, transpose, data); }
368  void set_uniform_matrix(const std::string &name, const Mat2f &matrix) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform_matrix(loc, matrix); }
369  void set_uniform_matrix(const std::string &name, const Mat3f &matrix) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform_matrix(loc, matrix); }
370  void set_uniform_matrix(const std::string &name, const Mat4f &matrix) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform_matrix(loc, matrix); }
371  void set_uniform_matrix(const std::string &name, int count, const Mat2f *matrix) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform_matrix(loc, count, matrix); }
372  void set_uniform_matrix(const std::string &name, int count, const Mat3f *matrix) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform_matrix(loc, count, matrix); }
373  void set_uniform_matrix(const std::string &name, int count, const Mat4f *matrix) { int loc = get_uniform_location(name); if (loc >= 0) set_uniform_matrix(loc, count, matrix); }
374 
376  void set_uniform_buffer_index(const std::string &block_name, int bind_index);
377 
379  void set_uniform_buffer_index(int block_index, int bind_index);
380 
382  void set_storage_buffer_index(const std::string &block_name, int bind_index);
383 
385  void set_storage_buffer_index(int block_index, int bind_index);
387 
390 private:
391  std::shared_ptr<ProgramObject_Impl> impl;
393 };
394 
395 }
396 
Shader Object.
Definition: shader_object.h:69
Type x
Definition: vec3.h:81
void set_uniformfv(int location, int count, const Vec4f *data)
Definition: program_object.h:330
Program Object provider.
Definition: program_object_provider.h:43
Type y
Definition: vec3.h:82
Type z
Definition: vec4.h:83
I/O Device interface.
Definition: iodevice.h:51
Interface for implementing a GraphicContext target.
Definition: graphic_context_provider.h:87
void set_uniform4i(int location, const Vec4i &vec)
Definition: program_object.h:310
void set_uniform4b(const std::string &name, const Vec4b &vec)
Definition: program_object.h:352
void set_uniform2b(const std::string &name, const Vec2b &vec)
Definition: program_object.h:350
void set_uniform3s(int location, const Vec3s &vec)
Definition: program_object.h:312
void set_uniform3s(const std::string &name, const Vec3s &vec)
Definition: program_object.h:348
void set_uniform2b(int location, const Vec2b &vec)
Definition: program_object.h:314
void set_uniform_matrix(int location, int count, const Mat2f *matrix)
Definition: program_object.h:335
bool is_null() const
Returns true if this object is invalid.
Definition: program_object.h:227
void set_uniform4i(const std::string &name, int value_a, int value_b, int value_c, int value_d)
Definition: program_object.h:342
void set_uniformiv(int location, int count, const Vec2i *data)
Definition: program_object.h:317
void set_uniform2i(const std::string &name, int value_a, int value_b)
Definition: program_object.h:340
void set_uniform4b(int location, const Vec4b &vec)
Definition: program_object.h:316
void set_uniform2f(int location, const Vec2f &vec)
Definition: program_object.h:325
void set_uniform_matrix(int location, const Mat4f &matrix)
Definition: program_object.h:334
Type x
Definition: vec2.h:82
Type matrix[4]
Definition: mat2.h:183
void set_uniformfv(const std::string &name, int size, int count, const float *data)
Definition: program_object.h:360
void set_uniform4i(const std::string &name, const Vec4i &vec)
Definition: program_object.h:346
void set_uniformiv(int location, int count, const Vec4i *data)
Definition: program_object.h:319
void set_uniform_matrix(const std::string &name, int size, int count, bool transpose, const float *data)
Definition: program_object.h:367
Virtual File System (VFS).
Definition: file_system.h:48
void set_uniform3f(const std::string &name, float value_a, float value_b, float value_c)
Definition: program_object.h:358
void set_uniform_matrix(int location, const Mat3f &matrix)
Definition: program_object.h:333
2D matrix
Definition: mat2.h:46
void set_uniform_matrix(int location, const Mat2f &matrix)
Definition: program_object.h:332
void set_uniform1f(const std::string &name, float value_a)
Definition: program_object.h:356
void set_uniformfv(const std::string &name, int count, const Vec4f *data)
Definition: program_object.h:366
void set_uniformiv(const std::string &name, int size, int count, const int *data)
Definition: program_object.h:343
3D matrix
Definition: mat2.h:49
void set_uniform3f(int location, const Vec3f &vec)
Definition: program_object.h:326
void set_uniform_matrix(int location, int count, const Mat3f *matrix)
Definition: program_object.h:336
void set_uniformfv(int location, int count, const Vec3f *data)
Definition: program_object.h:329
void set_uniformiv(const std::string &name, int count, const Vec2i *data)
Definition: program_object.h:353
void set_uniformfv(const std::string &name, int count, const Vec3f *data)
Definition: program_object.h:365
void set_uniform3b(const std::string &name, const Vec3b &vec)
Definition: program_object.h:351
3D vector
Definition: line_ray.h:49
void set_uniform2f(const std::string &name, float value_a, float value_b)
Definition: program_object.h:357
Type y
Definition: vec4.h:82
void set_uniform2i(const std::string &name, const Vec2i &vec)
Definition: program_object.h:344
Interface to drawing graphics.
Definition: graphic_context.h:257
void set_uniform1i(const std::string &name, int value_a)
Definition: program_object.h:339
void set_uniformfv(int location, int count, const Vec2f *data)
Definition: program_object.h:328
void set_uniform3i(const std::string &name, const Vec3i &vec)
Definition: program_object.h:345
void set_uniform4f(int location, const Vec4f &vec)
Definition: program_object.h:327
void set_uniform3i(const std::string &name, int value_a, int value_b, int value_c)
Definition: program_object.h:341
void set_uniform3b(int location, const Vec3b &vec)
Definition: program_object.h:315
Type w
Definition: vec4.h:84
Program Object.
Definition: program_object.h:70
void set_uniform_matrix(const std::string &name, const Mat2f &matrix)
Definition: program_object.h:368
void set_uniform_matrix(const std::string &name, int count, const Mat2f *matrix)
Definition: program_object.h:371
void set_uniform_matrix(const std::string &name, int count, const Mat3f *matrix)
Definition: program_object.h:372
void set_uniform_matrix(const std::string &name, int count, const Mat4f *matrix)
Definition: program_object.h:373
void set_uniformiv(int location, int count, const Vec3i *data)
Definition: program_object.h:318
XML Resource Document.
Definition: xml_resource_document.h:49
void set_uniform_matrix(int location, int count, const Mat4f *matrix)
Definition: program_object.h:337
4D matrix
Definition: mat2.h:52
void set_uniform_matrix(const std::string &name, const Mat4f &matrix)
Definition: program_object.h:370
void set_uniform4f(const std::string &name, float value_a, float value_b, float value_c, float value_d)
Definition: program_object.h:359
void set_uniform2i(int location, const Vec2i &vec)
Definition: program_object.h:308
Type matrix[16]
The matrix (in column-major format)
Definition: mat4.h:353
void set_uniform3i(int location, const Vec3i &vec)
Definition: program_object.h:309
Type x
Definition: vec4.h:81
void set_uniformiv(const std::string &name, int count, const Vec4i *data)
Definition: program_object.h:355
4D vector
Definition: size.h:48
Type matrix[9]
Definition: mat3.h:226
void set_uniform_matrix(const std::string &name, const Mat3f &matrix)
Definition: program_object.h:369
void set_uniform4f(const std::string &name, const Vec4f &vec)
Definition: program_object.h:363
void set_uniform4s(const std::string &name, const Vec4s &vec)
Definition: program_object.h:349
void set_uniform2s(const std::string &name, const Vec2s &vec)
Definition: program_object.h:347
void set_uniformiv(const std::string &name, int count, const Vec3i *data)
Definition: program_object.h:354
void set_uniform3f(const std::string &name, const Vec3f &vec)
Definition: program_object.h:362
void set_uniformfv(const std::string &name, int count, const Vec2f *data)
Definition: program_object.h:364
Type z
Definition: vec3.h:83
void set_uniform2f(const std::string &name, const Vec2f &vec)
Definition: program_object.h:361
Type y
Definition: vec2.h:83
void set_uniform2s(int location, const Vec2s &vec)
Definition: program_object.h:311
void set_uniform4s(int location, const Vec4s &vec)
Definition: program_object.h:313