/OJGL/GLProgram.j

http://github.com/tartiflop/ojgl · Unknown · 139 lines · 97 code · 42 blank · 0 comment · 0 complexity · 00383313b0adc395e6a1fd9e2f4a3179 MD5 · raw file

  1. @import <Foundation/CPObject.j>
  2. GL_VERTEX_SHADER = 0;
  3. GL_FRAGMENT_SHADER = 1;
  4. @implementation GLProgram : CPObject {
  5. DOMElement _gl;
  6. int _program;
  7. CPArray _shaders;
  8. }
  9. - (id)initWithGL:(DOMElement)gl {
  10. self = [super init];
  11. if (self) {
  12. _gl = gl;
  13. // Create the program object
  14. _program = _gl.createProgram();
  15. if (!_program) {
  16. CPLog.error(@"Could not create program");
  17. return nil;
  18. }
  19. // create shader array
  20. _shaders = [[CPArray alloc] init]
  21. }
  22. return self;
  23. }
  24. - (int)glProgram {
  25. return _program;
  26. }
  27. - (void)addShaderText:(string)shaderText shaderType:(int)shaderType {
  28. var glShaderType;
  29. if (shaderType == GL_VERTEX_SHADER) {
  30. glShaderType = _gl.VERTEX_SHADER;
  31. } else if (shaderType == GL_FRAGMENT_SHADER) {
  32. glShaderType = _gl.FRAGMENT_SHADER;
  33. }
  34. var shader = [self _loadShader:shaderText shaderType:glShaderType];
  35. if (shader) {
  36. _gl.attachShader(_program, shader);
  37. }
  38. }
  39. - (void)addShaderScript:(string)shaderId {
  40. var shaderScript = document.getElementById(shaderId);
  41. if (!shaderScript) {
  42. CPLog.error(@"Error: shader script '" + shaderId + "' not found");
  43. return;
  44. }
  45. if (shaderScript.type == "x-shader/x-vertex") {
  46. var glShaderType = _gl.VERTEX_SHADER;
  47. } else if (shaderScript.type == "x-shader/x-fragment") {
  48. var glShaderType = _gl.FRAGMENT_SHADER;
  49. } else {
  50. CPLog.error(@"Error: shader script '" + shaderId + "' of undefined type '" + shaderScript.type+"'");
  51. return nil;
  52. }
  53. var shader = [self _loadShader:shaderScript.text shaderType:glShaderType];
  54. if (shader) {
  55. _gl.attachShader(_program, shader);
  56. }
  57. }
  58. - (void)linkProgram {
  59. _gl.linkProgram(_program);
  60. if (!_gl.getProgrami(_program, _gl.LINK_STATUS)) {
  61. CPLog.error(@"Error in program linking: " + _gl.getProgramInfoLog(_program));
  62. _gl.deleteProgram(_program);
  63. for (var shader in _shaders) {
  64. _gl.deleteProgram(shader);
  65. }
  66. }
  67. }
  68. - (int)getAttributeLocation:(string)attributeName {
  69. return _gl.getAttribLocation(_program, attributeName);
  70. }
  71. - (int)getUniformLocation:(string)uniformName {
  72. return _gl.getUniformLocation(_program, uniformName);
  73. }
  74. - (int)_loadShader:(string)shaderText shaderType:(int)shaderType {
  75. // Create the shader object
  76. var shader = _gl.createShader(shaderType);
  77. if (!shader) {
  78. CPLog.error(@"Error: unable to create shader '" + shaderType + "'");
  79. return nil;
  80. }
  81. // Load the shader source
  82. _gl.shaderSource(shader, shaderText);
  83. // Compile the shader
  84. _gl.compileShader(shader);
  85. // Check the compile status
  86. var compiled = _gl.getShaderi(shader, _gl.COMPILE_STATUS);
  87. if (!compiled) {
  88. // Something went wrong during compilation; get the error
  89. var error = _gl.getShaderInfoLog(shader);
  90. CPLog.error(@"Error compiling " + ((shaderType == _gl.VERTEX_SHADER) ? "vertex" : "fragment") + " shader:" + error);
  91. _gl.deleteShader(shader);
  92. return nil;
  93. }
  94. [_shaders addObject:shader];
  95. return shader;
  96. }
  97. @end