00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00033
00034 #pragma once
00035
00036 #include "../api_display.h"
00037 #include "../../Core/System/sharedptr.h"
00038 #include "../../Core/Text/string_types.h"
00039 #include "../../Core/IOData/virtual_directory.h"
00040 #include "graphic_context.h"
00041
00042 class CL_ShaderObject;
00043 class CL_ProgramAttribute;
00044 class CL_ProgramUniform;
00045 class CL_ProgramObject_Impl;
00046 class CL_GraphicContext;
00047 class CL_GraphicContextProvider;
00048 class CL_ResourceManager;
00049 class CL_ProgramObjectProvider;
00050
00070 class CL_API_DISPLAY CL_ProgramObject
00071 {
00074
00075 public:
00077 CL_ProgramObject();
00078
00082 CL_ProgramObject(CL_GraphicContext &gc);
00083
00087 CL_ProgramObject(CL_GraphicContextProvider *gc_provider);
00088
00092 CL_ProgramObject(CL_ProgramObjectProvider *provider);
00093
00101 static CL_ProgramObject load(CL_GraphicContext &gc, const CL_StringRef &resource_id, CL_ResourceManager *resman);
00102
00110 static CL_ProgramObject load(CL_GraphicContext &gc, const CL_StringRef &vertex_fullname, const CL_StringRef &fragment_fullname);
00111
00120 static CL_ProgramObject load(CL_GraphicContext &gc, const CL_StringRef &vertex_fullname, const CL_StringRef &geometry_fullname, const CL_StringRef &fragment_fullname);
00121
00130 static CL_ProgramObject load(CL_GraphicContext &gc, const CL_StringRef &vertex_filename, const CL_StringRef &fragment_filename, const CL_VirtualDirectory &directory);
00131
00141 static CL_ProgramObject load(CL_GraphicContext &gc, const CL_StringRef &vertex_filename, const CL_StringRef &geometry_filename, const CL_StringRef &fragment_filename, const CL_VirtualDirectory &directory);
00142
00150 static CL_ProgramObject load(CL_GraphicContext &gc, CL_IODevice &vertex_file, CL_IODevice &fragment_file);
00151
00160 static CL_ProgramObject load(CL_GraphicContext &gc, CL_IODevice &vertex_file, CL_IODevice &geometry_file, CL_IODevice &fragment_file);
00161
00168 static CL_ProgramObject load(CL_GraphicContext &gc, const CL_StringRef &fragment_fullname);
00169
00177 static CL_ProgramObject load(CL_GraphicContext &gc, const CL_StringRef &fragment_filename, const CL_VirtualDirectory &directory);
00178
00185 static CL_ProgramObject load(CL_GraphicContext &gc, CL_IODevice &fragment_file);
00186
00194 static CL_ProgramObject load_and_link(CL_GraphicContext &gc, const CL_StringRef &vertex_fullname, const CL_StringRef &fragment_fullname);
00195
00204 static CL_ProgramObject load_and_link(CL_GraphicContext &gc, const CL_StringRef &vertex_fullname, const CL_StringRef &geometry_fullname, const CL_StringRef &fragment_fullname);
00205
00214 static CL_ProgramObject load_and_link(CL_GraphicContext &gc, const CL_StringRef &vertex_filename, const CL_StringRef &fragment_filename, const CL_VirtualDirectory &directory);
00215
00225 static CL_ProgramObject load_and_link(CL_GraphicContext &gc, const CL_StringRef &vertex_filename, const CL_StringRef &geometry_filename, const CL_StringRef &fragment_filename, const CL_VirtualDirectory &directory);
00226
00234 static CL_ProgramObject load_and_link(CL_GraphicContext &gc, CL_IODevice &vertex_file, CL_IODevice &fragment_file);
00235
00244 static CL_ProgramObject load_and_link(CL_GraphicContext &gc, CL_IODevice &vertex_file, CL_IODevice &geometry_file, CL_IODevice &fragment_file);
00245
00252 static CL_ProgramObject load_and_link(CL_GraphicContext &gc, const CL_StringRef &fragment_fullname);
00253
00261 static CL_ProgramObject load_and_link(CL_GraphicContext &gc, const CL_StringRef &fragment_filename, const CL_VirtualDirectory &directory);
00262
00269 static CL_ProgramObject load_and_link(CL_GraphicContext &gc, CL_IODevice &fragment_file);
00270
00271 virtual ~CL_ProgramObject();
00272
00276
00277 public:
00279 bool is_null() const { return impl.is_null(); }
00280
00282 void throw_if_null() const;
00283
00285 CL_ProgramObjectProvider *get_provider() const;
00286
00288 unsigned int get_handle() const;
00289
00291 std::vector<CL_ShaderObject> get_shaders() const;
00292
00294 CL_String get_info_log() const;
00295
00297 int get_attribute_count() const;
00298
00300 std::vector<CL_ProgramAttribute> get_attributes() const;
00301
00303 int get_attribute_location(const CL_StringRef &name) const;
00304
00306 int get_uniform_count() const;
00307
00309 std::vector<CL_ProgramUniform> get_uniforms() const;
00310
00312 int get_uniform_location(const CL_StringRef &name) const;
00313
00317
00318 public:
00320 bool operator==(const CL_ProgramObject &other) const;
00321
00323 void attach(const CL_ShaderObject &obj);
00324
00326 void detach(const CL_ShaderObject &obj);
00327
00329
00330 void bind_attribute_location(int index, const CL_StringRef &name);
00331
00333
00334 bool link();
00335
00337
00338 bool validate();
00339
00344 void set_uniform1i(const CL_StringRef &name, int value_a);
00345
00351 void set_uniform2i(const CL_StringRef &name, int value_a, int value_b);
00352
00359 void set_uniform3i(const CL_StringRef &name, int value_a, int value_b, int value_c);
00360
00368 void set_uniform4i(const CL_StringRef &name, int value_a, int value_b, int value_c, int value_d);
00369
00376 void set_uniformiv(const CL_StringRef &name, int size, int count, int *data);
00377
00382 void set_uniform2i(const CL_StringRef &name, CL_Vec2i vec) {set_uniform2i(name, vec.x, vec.y);}
00383
00388 void set_uniform3i(const CL_StringRef &name, CL_Vec3i vec) {set_uniform3i(name, vec.x, vec.y, vec.z);}
00389
00394 void set_uniform4i(const CL_StringRef &name, CL_Vec4i vec) {set_uniform4i(name, vec.x, vec.y, vec.z, vec.w);}
00395
00400 void set_uniform2s(const CL_StringRef &name, CL_Vec2s vec) {set_uniform2i(name, vec.x, vec.y);}
00401
00406 void set_uniform3s(const CL_StringRef &name, CL_Vec3s vec) {set_uniform3i(name, vec.x, vec.y, vec.z);}
00407
00412 void set_uniform4s(const CL_StringRef &name, CL_Vec4s vec) {set_uniform4i(name, vec.x, vec.y, vec.z, vec.w);}
00413
00418 void set_uniform2b(const CL_StringRef &name, CL_Vec2b vec) {set_uniform2i(name, vec.x, vec.y);}
00419
00424 void set_uniform3b(const CL_StringRef &name, CL_Vec3b vec) {set_uniform3i(name, vec.x, vec.y, vec.z);}
00425
00430 void set_uniform4b(const CL_StringRef &name, CL_Vec4b vec) {set_uniform4i(name, vec.x, vec.y, vec.z, vec.w);}
00431
00437 void set_uniformiv(const CL_StringRef &name, int count, CL_Vec2i *data) {set_uniformiv(name, 2, count, *data);}
00438
00444 void set_uniformiv(const CL_StringRef &name, int count, CL_Vec3i *data) {set_uniformiv(name, 3, count, *data);}
00445
00451 void set_uniformiv(const CL_StringRef &name, int count, CL_Vec4i *data) {set_uniformiv(name, 4, count, *data);}
00452
00457 void set_uniform1f(const CL_StringRef &name, float value_a);
00458
00464 void set_uniform2f(const CL_StringRef &name, float value_a, float value_b);
00465
00472 void set_uniform3f(const CL_StringRef &name, float value_a, float value_b, float value_c);
00473
00481 void set_uniform4f(const CL_StringRef &name, float value_a, float value_b, float value_c, float value_d);
00482
00489 void set_uniformfv(const CL_StringRef &name, int size, int count, float *data);
00490
00495 void set_uniform2f(const CL_StringRef &name, CL_Vec2f vec) {set_uniform2f(name, vec.x, vec.y);}
00496
00501 void set_uniform3f(const CL_StringRef &name, CL_Vec3f vec) {set_uniform3f(name, vec.x, vec.y, vec.z);}
00502
00507 void set_uniform4f(const CL_StringRef &name, CL_Vec4f vec) {set_uniform4f(name, vec.x, vec.y, vec.z, vec.w);}
00508
00514 void set_uniformfv(const CL_StringRef &name, int count, CL_Vec2f *data) {set_uniformfv(name, 2, count, *data);}
00515
00521 void set_uniformfv(const CL_StringRef &name, int count, CL_Vec3f *data) {set_uniformfv(name, 3, count, *data);}
00522
00528 void set_uniformfv(const CL_StringRef &name, int count, CL_Vec4f *data) {set_uniformfv(name, 4, count, *data);}
00529
00531 void set_uniform_matrix(const CL_StringRef &name, int size, int count, bool transpose, float *data);
00532
00537 void set_uniform_matrix(const CL_StringRef &name, CL_Mat2f matrix) {set_uniform_matrix(name, 2, 1, false, matrix.matrix);}
00538
00543 void set_uniform_matrix(const CL_StringRef &name, CL_Mat3f matrix) {set_uniform_matrix(name, 3, 1, false, matrix.matrix);}
00544
00549 void set_uniform_matrix(const CL_StringRef &name, CL_Mat4f matrix) {set_uniform_matrix(name, 4, 1, false, matrix.matrix);}
00550
00556 void set_uniform_matrix(const CL_StringRef &name, int count, CL_Mat2f *matrix) {set_uniform_matrix(name, 2, count, false, matrix->matrix);}
00557
00563 void set_uniform_matrix(const CL_StringRef &name, int count, CL_Mat3f *matrix) {set_uniform_matrix(name, 3, count, false, matrix->matrix);}
00564
00570 void set_uniform_matrix(const CL_StringRef &name, int count, CL_Mat4f *matrix) {set_uniform_matrix(name, 4, count, false, matrix->matrix);}
00571
00575
00576 private:
00577 CL_SharedPtr<CL_ProgramObject_Impl> impl;
00579 };
00580