121 {$ENDIF} |
121 {$ENDIF} |
122 |
122 |
123 var VertexBuffer : array [0 ..59] of TVertex2f; |
123 var VertexBuffer : array [0 ..59] of TVertex2f; |
124 TextureBuffer: array [0 .. 7] of TVertex2f; |
124 TextureBuffer: array [0 .. 7] of TVertex2f; |
125 LastTint: LongWord = 0; |
125 LastTint: LongWord = 0; |
|
126 {$IFNDEF GL2} |
126 LastColorPointer , LastTexCoordPointer , LastVertexPointer : Pointer; |
127 LastColorPointer , LastTexCoordPointer , LastVertexPointer : Pointer; |
127 {$IFDEF GL2} |
|
128 LastColorPointerN, LastTexCoordPointerN, LastVertexPointerN: Integer; |
|
129 {$ENDIF} |
128 {$ENDIF} |
130 |
129 |
131 {$IFDEF USE_S3D_RENDERING} |
130 {$IFDEF USE_S3D_RENDERING} |
132 // texture/vertex buffers for left/right/default eye modes |
131 // texture/vertex buffers for left/right/default eye modes |
133 texLRDtb, texLvb, texRvb: array [0..3] of TVertex2f; |
132 texLRDtb, texLvb, texRvb: array [0..3] of TVertex2f; |
294 |
294 |
295 WriteLnToConsole('Compiling shader: ' + cPathz[ptShaders] + '/' + shaderFile); |
295 WriteLnToConsole('Compiling shader: ' + cPathz[ptShaders] + '/' + shaderFile); |
296 |
296 |
297 sourceA:=PChar(source); |
297 sourceA:=PChar(source); |
298 lengthA:=Length(source); |
298 lengthA:=Length(source); |
|
299 WriteLnToConsole('Length: ' + inttostr(Length(source))); |
299 |
300 |
300 shader:=glCreateShader(shaderType); |
301 shader:=glCreateShader(shaderType); |
301 glShaderSource(shader, 1, @sourceA, @lengthA); |
302 glShaderSource(shader, 1, @sourceA, @lengthA); |
302 glCompileShader(shader); |
303 glCompileShader(shader); |
303 glGetShaderiv(shader, GL_COMPILE_STATUS, @compileResult); |
304 glGetShaderiv(shader, GL_COMPILE_STATUS, @compileResult); |
738 glDisableVertexAttribArray(aTexCoord); |
739 glDisableVertexAttribArray(aTexCoord); |
739 glEnableVertexAttribArray(aColor); |
740 glEnableVertexAttribArray(aColor); |
740 {$ELSE} |
741 {$ELSE} |
741 glDisableClientState(GL_TEXTURE_COORD_ARRAY); |
742 glDisableClientState(GL_TEXTURE_COORD_ARRAY); |
742 glEnableClientState(GL_COLOR_ARRAY); |
743 glEnableClientState(GL_COLOR_ARRAY); |
|
744 LastTexCoordPointer:= nil; |
743 {$ENDIF} |
745 {$ENDIF} |
744 LastTexCoordPointer:= nil; |
|
745 end |
746 end |
746 else |
747 else |
747 begin |
748 begin |
748 {$IFDEF GL2} |
749 {$IFDEF GL2} |
749 glDisableVertexAttribArray(aColor); |
750 glDisableVertexAttribArray(aColor); |
750 glEnableVertexAttribArray(aTexCoord); |
751 glEnableVertexAttribArray(aTexCoord); |
751 {$ELSE} |
752 {$ELSE} |
752 glDisableClientState(GL_COLOR_ARRAY); |
753 glDisableClientState(GL_COLOR_ARRAY); |
753 glEnableClientState(GL_TEXTURE_COORD_ARRAY); |
754 glEnableClientState(GL_TEXTURE_COORD_ARRAY); |
|
755 LastColorPointer:= nil; |
754 {$ENDIF} |
756 {$ENDIF} |
755 LastColorPointer:= nil; |
|
756 end; |
757 end; |
757 EnableTexture(not b); |
758 EnableTexture(not b); |
758 end; |
759 end; |
759 |
760 |
760 procedure UpdateModelviewProjection(); inline; |
761 procedure UpdateModelviewProjection(); inline; |
773 end; |
774 end; |
774 |
775 |
775 procedure SetTexCoordPointer(p: Pointer; n: Integer); inline; |
776 procedure SetTexCoordPointer(p: Pointer; n: Integer); inline; |
776 begin |
777 begin |
777 {$IFDEF GL2} |
778 {$IFDEF GL2} |
778 if (p = LastTexCoordPointer) and (n = LastTexCoordPointerN) then |
|
779 exit; |
|
780 glBindBuffer(GL_ARRAY_BUFFER, tBuffer); |
779 glBindBuffer(GL_ARRAY_BUFFER, tBuffer); |
781 glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * n * 2, p, GL_STATIC_DRAW); |
780 glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * n * 2, p, GL_STATIC_DRAW); |
782 glEnableVertexAttribArray(aTexCoord); |
781 glEnableVertexAttribArray(aTexCoord); |
783 glVertexAttribPointer(aTexCoord, 2, GL_FLOAT, GL_FALSE, 0, pointer(0)); |
782 glVertexAttribPointer(aTexCoord, 2, GL_FLOAT, GL_FALSE, 0, pointer(0)); |
784 LastTexCoordPointerN:= n; |
|
785 {$ELSE} |
783 {$ELSE} |
786 if p = LastTexCoordPointer then |
784 if p = LastTexCoordPointer then |
787 exit; |
785 exit; |
788 n:= n; |
786 n:= n; |
789 glTexCoordPointer(2, GL_FLOAT, 0, p); |
787 glTexCoordPointer(2, GL_FLOAT, 0, p); |
790 {$ENDIF} |
|
791 LastTexCoordPointer:= p; |
788 LastTexCoordPointer:= p; |
|
789 {$ENDIF} |
792 end; |
790 end; |
793 |
791 |
794 procedure SetVertexPointer(p: Pointer; n: Integer); inline; |
792 procedure SetVertexPointer(p: Pointer; n: Integer); inline; |
795 begin |
793 begin |
796 {$IFDEF GL2} |
794 {$IFDEF GL2} |
797 if (p = LastVertexPointer) and (n = LastVertexPointerN) then |
|
798 exit; |
|
799 glBindBuffer(GL_ARRAY_BUFFER, vBuffer); |
795 glBindBuffer(GL_ARRAY_BUFFER, vBuffer); |
800 glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * n * 2, p, GL_STATIC_DRAW); |
796 glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat) * n * 2, p, GL_STATIC_DRAW); |
801 glEnableVertexAttribArray(aVertex); |
797 glEnableVertexAttribArray(aVertex); |
802 glVertexAttribPointer(aVertex, 2, GL_FLOAT, GL_FALSE, 0, pointer(0)); |
798 glVertexAttribPointer(aVertex, 2, GL_FLOAT, GL_FALSE, 0, pointer(0)); |
803 LastVertexPointerN:= n; |
|
804 {$ELSE} |
799 {$ELSE} |
805 if p = LastVertexPointer then |
800 if p = LastVertexPointer then |
806 exit; |
801 exit; |
807 n:= n; |
802 n:= n; |
808 glVertexPointer(2, GL_FLOAT, 0, p); |
803 glVertexPointer(2, GL_FLOAT, 0, p); |
809 {$ENDIF} |
|
810 LastVertexPointer:= p; |
804 LastVertexPointer:= p; |
|
805 {$ENDIF} |
811 end; |
806 end; |
812 |
807 |
813 procedure SetColorPointer(p: Pointer; n: Integer); inline; |
808 procedure SetColorPointer(p: Pointer; n: Integer); inline; |
814 begin |
809 begin |
815 {$IFDEF GL2} |
810 {$IFDEF GL2} |
816 if (p = LastColorPointer) and (n = LastColorPointerN) then |
|
817 exit; |
|
818 glBindBuffer(GL_ARRAY_BUFFER, cBuffer); |
811 glBindBuffer(GL_ARRAY_BUFFER, cBuffer); |
819 glBufferData(GL_ARRAY_BUFFER, n * 4, p, GL_STATIC_DRAW); |
812 glBufferData(GL_ARRAY_BUFFER, n * 4, p, GL_STATIC_DRAW); |
820 glEnableVertexAttribArray(aColor); |
813 glEnableVertexAttribArray(aColor); |
821 glVertexAttribPointer(aColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, pointer(0)); |
814 glVertexAttribPointer(aColor, 4, GL_UNSIGNED_BYTE, GL_TRUE, 0, pointer(0)); |
822 LastColorPointerN:= n; |
|
823 {$ELSE} |
815 {$ELSE} |
824 if p = LastColorPointer then |
816 if p = LastColorPointer then |
825 exit; |
817 exit; |
826 n:= n; |
818 n:= n; |
827 glColorPointer(4, GL_UNSIGNED_BYTE, 0, p); |
819 glColorPointer(4, GL_UNSIGNED_BYTE, 0, p); |
828 {$ENDIF} |
|
829 LastColorPointer:= p; |
820 LastColorPointer:= p; |
|
821 {$ENDIF} |
830 end; |
822 end; |
831 |
823 |
832 procedure EnableTexture(enable:Boolean); |
824 procedure EnableTexture(enable:Boolean); |
833 begin |
825 begin |
834 {$IFDEF GL2} |
826 {$IFDEF GL2} |
1023 |
1018 |
1024 UpdateModelviewProjection; |
1019 UpdateModelviewProjection; |
1025 |
1020 |
1026 glDrawArrays(GL_TRIANGLE_FAN, 0, 4); |
1021 glDrawArrays(GL_TRIANGLE_FAN, 0, 4); |
1027 openglPopMatrix; |
1022 openglPopMatrix; |
|
1023 |
|
1024 UpdateModelviewProjection; |
1028 end; |
1025 end; |
1029 |
1026 |
1030 procedure DrawTextureF(Texture: PTexture; Scale: GLfloat; X, Y, Frame, Dir, w, h: LongInt); |
1027 procedure DrawTextureF(Texture: PTexture; Scale: GLfloat; X, Y, Frame, Dir, w, h: LongInt); |
1031 begin |
1028 begin |
1032 DrawTextureRotatedF(Texture, Scale, 0, 0, X, Y, Frame, Dir, w, h, 0) |
1029 DrawTextureRotatedF(Texture, Scale, 0, 0, X, Y, Frame, Dir, w, h, 0) |
1169 |
1168 |
1170 // apply angle after (conditional) mirroring |
1169 // apply angle after (conditional) mirroring |
1171 if Angle <> 0 then |
1170 if Angle <> 0 then |
1172 openglRotatef(Angle, 0, 0, 1); |
1171 openglRotatef(Angle, 0, 0, 1); |
1173 |
1172 |
|
1173 UpdateModelviewProjection; |
|
1174 |
1174 DrawSprite(Sprite, -SpritesData[Sprite].Width div 2, -SpritesData[Sprite].Height div 2, Frame); |
1175 DrawSprite(Sprite, -SpritesData[Sprite].Width div 2, -SpritesData[Sprite].Height div 2, Frame); |
1175 |
1176 |
1176 openglPopMatrix; |
1177 openglPopMatrix; |
|
1178 |
|
1179 UpdateModelviewProjection; |
1177 |
1180 |
1178 end; |
1181 end; |
1179 |
1182 |
1180 procedure DrawSpritePivotedF(Sprite: TSprite; X, Y, Frame, Dir, PivotX, PivotY: LongInt; Angle: real); |
1183 procedure DrawSpritePivotedF(Sprite: TSprite; X, Y, Frame, Dir, PivotX, PivotY: LongInt; Angle: real); |
1181 begin |
1184 begin |
1340 UpdateModelviewProjection; |
1346 UpdateModelviewProjection; |
1341 |
1347 |
1342 DrawLineOnScreen(X0, Y0, X1, Y1, Width, r, g, b, a); |
1348 DrawLineOnScreen(X0, Y0, X1, Y1, Width, r, g, b, a); |
1343 |
1349 |
1344 openglPopMatrix(); |
1350 openglPopMatrix(); |
|
1351 |
|
1352 UpdateModelviewProjection; |
1345 end; |
1353 end; |
1346 |
1354 |
1347 procedure DrawLineOnScreen(X0, Y0, X1, Y1, Width: Single; r, g, b, a: Byte); |
1355 procedure DrawLineOnScreen(X0, Y0, X1, Y1, Width: Single; r, g, b, a: Byte); |
1348 begin |
1356 begin |
1349 glEnable(GL_LINE_SMOOTH); |
1357 glEnable(GL_LINE_SMOOTH); |