* some small cleanup
[LazOpenGLCore.git] / uglcShader.pas
index bebe142..634d57f 100644 (file)
@@ -2,7 +2,55 @@ unit uglcShader;
 
 { Package:      OpenGLCore
   Prefix:       glc - OpenGL Core
-  Beschreibung: diese Unit enthält eine Klassen-Kapselung der OpenGL Shader Objekte }
+  Beschreibung: diese Unit enthält eine Klassen-Kapselung der OpenGL Shader Objekte
+  Beispiel:
+    var
+      shader: TglcShaderProgram;
+
+    //write log message to console
+    //    @param aSender: object that send the message
+    //    @param aMsg:    message to write to console
+    procedure LogMessage(aSender: TObject; const aMsg: String);
+    begin
+      writeln(Format('[%p]: %s', [aSender, aMsg]);
+    end;
+
+    //load shader object from file and add it to 'shader'
+    //    @param aFilename: name of file to load shader code from
+    //    @param aType:     type of shader object to create
+    procedure LoadShaderObject(const aFilename: String; const aType: TglcShaderType);
+    var
+      sl: TStringList;
+      so: TglcShaderObject;
+    begin
+      sl := TStringList.Create;
+      try
+        sl.LoadFromFile(aFileName);
+        so := TglcShaderObject.Create(aType);
+        shader.add(so);
+      finally
+        FreeAndNil(sl, @LogMessage);
+      end;
+    end;
+
+    shader := TglcShaderProgram.Create(@LogMessage);
+    try
+      // load shader objects
+      LoadShaderObject('./test_shader.vert', TglcShaderType.stVertex);
+      LoadShaderObject('./test_shader.frag', TglcShaderType.stFragment);
+
+      // compile shader
+      shader.Compile;
+
+      // use shader
+      shader.Enable;
+      shader.Uniform1f('uTest', 0.1234);
+      // do normal rendering
+      shader.Disable;
+
+    finally
+      FreeAndNil(shader);
+    end; }
 
 {$mode objfpc}{$H+}
 
@@ -51,9 +99,6 @@ type
     fProgramObj: GLHandle;
     fOnLog: TglcShaderLogEvent;
     fFilename: String;
-    fGeometryInputType: GLint;
-    fGeometryOutputType: GLint;
-    fGeometryVerticesOut: GLint;
 
     function GetUniformLocation(const aName: String; out aPos: glInt): Boolean;
     function GetInfoLog(Obj: GLHandle): String;
@@ -69,9 +114,6 @@ type
     property Compiled:   Boolean            read GetCompiled;
     property Linked:     Boolean            read GetLinked;
     property OnLog:      TglcShaderLogEvent read fOnLog               write fOnLog;
-    property GeometryInputType:   GLint     read fGeometryInputType   write fGeometryInputType;
-    property GeometryOutputType:  GLint     read fGeometryOutputType  write fGeometryOutputType;
-    property GeometryVerticesOut: GLint     read fGeometryVerticesOut write fGeometryVerticesOut;
 
     procedure Compile;
     procedure Enable;
@@ -110,7 +152,7 @@ type
     procedure SaveToFile(const aFilename: String);
     procedure SaveToStream(const aStream: TStream);
 
-    constructor Create(aLogEvent: TglcShaderLogEvent = nil);
+    constructor Create(const aLogEvent: TglcShaderLogEvent = nil);
     destructor Destroy; override;
   end;
 
@@ -133,13 +175,14 @@ const
 function TglcShaderObject.GetInfoLog(aObj: GLHandle): String;
 var
   Msg: PChar;
-  bLen, sLen: GLint;
+  bLen: GLint;
+  sLen: GLsizei;
 begin
   bLen := 0;
   glGetShaderiv(aObj, GL_INFO_LOG_LENGTH, @bLen);
   if bLen > 1 then begin
     GetMem(Msg, bLen * SizeOf(Char));
-    glGetShaderInfoLog(aObj, bLen, sLen{%H-}, Msg);
+    glGetShaderInfoLog(aObj, bLen, @sLen, Msg);
     result := PChar(Msg);
     Dispose(Msg);
   end;
@@ -253,13 +296,14 @@ end;
 function TglcShaderProgram.GetInfoLog(Obj: GLHandle): String;
 var
   Msg: PChar;
-  bLen, sLen: GLint;
+  bLen: GLint;
+  sLen: GLsizei;
 begin
   bLen := 0;
   glGetProgramiv(Obj, GL_INFO_LOG_LENGTH, @bLen);
   if bLen > 1 then begin
     GetMem(Msg, bLen * SizeOf(Char));
-    glGetProgramInfoLog(Obj, bLen, sLen{%H-}, Msg);
+    glGetProgramInfoLog(Obj, bLen, @sLen, Msg);
     result := PChar(Msg);
     Dispose(Msg);
   end;
@@ -910,7 +954,7 @@ end;
 //@LogEvent: Event zum loggen von Fehlern und Ereignissen;
 //@raise: EglcShader wenn OpenGL nicht initialisiert werden konnte;
 //@raise:
-constructor TglcShaderProgram.Create(aLogEvent: TglcShaderLogEvent);
+constructor TglcShaderProgram.Create(const aLogEvent: TglcShaderLogEvent);
 begin
   inherited Create;
   fOnLog      := aLogEvent;