Re: Render to Framebuffer
Posted: Wed Aug 03, 2022 6:06 pm
You must replace the latest 1.91 executable. The test will not work on 1.90, since that is configured for the old style (pre- in-game setup) keyboard handling.
For information and discussion about Oolite.
https://bb.oolite.space/
Hard to tell from the examples, but would I imagine the differences in lollipops on the radar would be particularly difficult to appreciate.another_commander wrote: ↑Thu Aug 04, 2022 6:45 amWe now know how people with protanopia, deuteranopia and tritanopia see color in the game.
I found that with GL_RGBA16F the animation of the old BGS hyperspace tunnel effect is messed up, but it works with GL_RGBA. Does HDR really not work with GL_RGBA also, or do you have an idea why this shader (old bgs hyper) looks weird with RGBA16F, but not with GL_RGBA?another_commander wrote: ↑Sun Jul 31, 2022 3:18 pmI tried applying HDR the "right" way, by tone mapping and gamma correcting at the oolite-texture shader. So I removed those steps from the default shaders and added them once only in the render texture shader.
Code: Select all
// 136 instructions, 5 R-regs, 0 H-regs - 59 ALU
uniform sampler2D colorMap; // this comes from a simple RGB 8 bit PNG texture
uniform float fTime;
uniform vec4 ovSpecials, Look;
varying vec2 vTexCoord;
const float SQRT3 = 1.73205;
const float PI = 3.1415926;
vec2 repeat(vec2 p, float n){
vec2 np = p*n;
vec2 npreal = np-fract(np);
np.x += fract(npreal.y*0.5);
return fract(np)*2.0-1.0;
}
float hexDistance(vec2 ip){
vec2 p = abs(ip*vec2(SQRT3*0.5,0.75));
float d = dot(p,vec2(-0.5,0.8660254))-SQRT3*0.25;
return (d>0.0)?min(d,(SQRT3*0.5-p.x)):min(-d,p.x);
}
void main()
{
vec2 coords = vTexCoord.xy;
coords.y /= ovSpecials.z;
vec2 cen = vec2(0.5);
cen.y /= ovSpecials.z;
cen -= coords.xy;
float a = atan(cen.y,cen.x);
float angle = fract(a/PI);
float rad = length(cen);
float t = fTime+1.0;
float t1 = max(-1.0+log(t),0.0);
float t2 = max(t1*0.6-0.2,0.0);
float rrad = 1.0/rad;
// Texture
vec2 mcen = 0.07*log(rad)*normalize(cen)*t*5.0;
vec2 tem = cen*(3.0-t);
vec4 FogColor = vec4(0.06,0.05,0.1,0.1)*exp(t);
float fadeT = max(1.5-fTime*0.2,0.1);
vec4 CurrentColor = texture2D(colorMap,coords.xy+tem+mcen);
CurrentColor += texture2D(colorMap,coords.xy+mcen);
FogColor.b += ovSpecials.x*t;
CurrentColor.r *= ovSpecials.y*2.0*t;
float FogDistance = rrad*-0.01;
vec4 endColor = mix(FogColor,CurrentColor,exp(FogDistance));
if(endColor.a>3.9) discard;
// Stars
float as = angle*256.0;
float angleRnd = floor(as)+1.0;
float radDist = fract(angleRnd*fract(angleRnd*0.82657)*13.724)/SQRT3;
float adist = radDist/rad*0.1;
float bdist = (t+fract(angleRnd*fract(angleRnd*0.7235)*45.1)*10.0)*0.1+adist;
bdist = abs(fract(bdist)-0.5);
float color = (max(0.0,0.5-bdist*30.0/adist)*abs(fract(as))*5.0/adist*radDist)*(t-1.5);
endColor += color;
// Tunnel
tem = vec2(a/PI,rrad+t);
vec2 p = repeat(tem,12.0);
float d = hexDistance(p);
float grid = smoothstep(-0.1,0.26,d)/t2;
vec3 rgb = vec3(0.27,0.07,0.35)/grid;
// Glowing lines
tem *= cen-t-adist/tem.y;
float y = (0.8/abs(cos(tem.x*t1)+cos(tem.y)*sin(t))*t2)*t2;
rgb += vec3(y*rad,y*0.4,y*0.8);
// Output
gl_FragColor = endColor+vec4(rgb,1.0);
}
Code: Select all
gl_FragColor.a = 1.0;
<chortles> In the same way I liked the rainbow spacedust that a long-ago nightly once introduced?another_commander wrote: ↑Sat Aug 06, 2022 7:47 pmI have to say that I like the tripiness of the non-fixed shader, though.
[NSDictionary dictionary]
to a function, do I have to release it later to avoid memory leaks? (generally, I am not yet 100% about the resource management in objective-c)OOEnvironmentCubeMap.m
that the framebuffer is set to 0 at some point (as well as a texture and a renderbuffer). It might be better to do the same thing we've been doing here: Before doing anything store the previous bindings, and rebind them after we're done. I don't know if it would even cause a bug if we didn't change this, but I could imagine that in future this could become a bug that someone would have to search for for hours.Code: Select all
diff --git a/src/Core/OOOpenGLExtensionManager.h b/src/Core/OOOpenGLExtensionManager.h
index 9e7c246f..586d6e2a 100644
--- a/src/Core/OOOpenGLExtensionManager.h
+++ b/src/Core/OOOpenGLExtensionManager.h
@@ -247,6 +247,31 @@ PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT;
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT;
PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT;
PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT;
+PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers;
+PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer;
+PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage;
+PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers;
+PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer;
+PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer;
+PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D;
+PFNGLGENVERTEXARRAYSPROC glGenVertexArrays;
+PFNGLGENBUFFERSPROC glGenBuffers;
+PFNGLBINDVERTEXARRAYPROC glBindVertexArray;
+PFNGLBINDBUFFERPROC glBindBuffer;
+PFNGLBUFFERDATAPROC glBufferData;
+PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer;
+PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray;
+PFNGLUSEPROGRAMPROC glUseProgram;
+PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation;
+PFNGLUNIFORM1IPROC glUniform1i;
+PFNGLACTIVETEXTUREPROC glActiveTexture;
+PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate;
+PFNGLUNIFORM1FPROC glUniform1f;
+PFNGLUNIFORM2FVPROC glUniform2fv;
+PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers;
+PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers;
+PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays;
+PFNGLDELETEBUFFERSPROC glDeleteBuffers;
#endif
#endif // OOLITE_WINDOWS
diff --git a/src/Core/OOOpenGLExtensionManager.m b/src/Core/OOOpenGLExtensionManager.m
index 2b2a637a..790b5873 100644
--- a/src/Core/OOOpenGLExtensionManager.m
+++ b/src/Core/OOOpenGLExtensionManager.m
@@ -107,7 +107,32 @@ PFNGLFRAMEBUFFERTEXTURE2DEXTPROC glFramebufferTexture2DEXT = (PFNGLFRAMEBUFFER
PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)&OOBadOpenGLExtensionUsed;
PFNGLDELETEFRAMEBUFFERSEXTPROC glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)&OOBadOpenGLExtensionUsed;
PFNGLDELETERENDERBUFFERSEXTPROC glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)&OOBadOpenGLExtensionUsed;
-#endif
+PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)&OOBadOpenGLExtensionUsed;
+PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)&OOBadOpenGLExtensionUsed;
+PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)&OOBadOpenGLExtensionUsed;
+PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)&OOBadOpenGLExtensionUsed;
+PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)&OOBadOpenGLExtensionUsed;
+PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)&OOBadOpenGLExtensionUsed;
+PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)&OOBadOpenGLExtensionUsed;
+PFNGLGENVERTEXARRAYSPROC glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)&OOBadOpenGLExtensionUsed;
+PFNGLGENBUFFERSPROC glGenBuffers = (PFNGLGENBUFFERSPROC)&OOBadOpenGLExtensionUsed;
+PFNGLBINDVERTEXARRAYPROC glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)&OOBadOpenGLExtensionUsed;
+PFNGLBINDBUFFERPROC glBindBuffer = (PFNGLBINDBUFFERPROC)&OOBadOpenGLExtensionUsed;
+PFNGLBUFFERDATAPROC glBufferData = (PFNGLBUFFERDATAPROC)&OOBadOpenGLExtensionUsed;
+PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)&OOBadOpenGLExtensionUsed;
+PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)&OOBadOpenGLExtensionUsed;
+PFNGLUSEPROGRAMPROC glUseProgram = (PFNGLUSEPROGRAMPROC)&OOBadOpenGLExtensionUsed;
+PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)&OOBadOpenGLExtensionUsed;
+PFNGLUNIFORM1IPROC glUniform1i = (PFNGLUNIFORM1IPROC)&OOBadOpenGLExtensionUsed;
+PFNGLACTIVETEXTUREPROC glActiveTexture = (PFNGLACTIVETEXTUREPROC)&OOBadOpenGLExtensionUsed;
+PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)&OOBadOpenGLExtensionUsed;
+PFNGLUNIFORM1FPROC glUniform1f = (PFNGLUNIFORM1FPROC)&OOBadOpenGLExtensionUsed;
+PFNGLUNIFORM2FVPROC glUniform2fv = (PFNGLUNIFORM2FVPROC)&OOBadOpenGLExtensionUsed;
+PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)&OOBadOpenGLExtensionUsed;
+PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)&OOBadOpenGLExtensionUsed;
+PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)&OOBadOpenGLExtensionUsed;
+PFNGLDELETEBUFFERSPROC glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)&OOBadOpenGLExtensionUsed;
+#endif
#endif
@@ -625,6 +650,31 @@ static unsigned IntegerFromString(const GLubyte **ioString)
glCheckFramebufferStatusEXT = (PFNGLCHECKFRAMEBUFFERSTATUSEXTPROC)wglGetProcAddress("glCheckFramebufferStatusEXT");
glDeleteFramebuffersEXT = (PFNGLDELETEFRAMEBUFFERSEXTPROC)wglGetProcAddress("glDeleteFramebuffersEXT");
glDeleteRenderbuffersEXT = (PFNGLDELETERENDERBUFFERSEXTPROC)wglGetProcAddress("glDeleteRenderbuffersEXT");
+ glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)wglGetProcAddress("glGenRenderbuffers");
+ glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)wglGetProcAddress ("glBindRenderbuffer" );
+ glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)wglGetProcAddress ("glRenderbufferStorage" );
+ glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)wglGetProcAddress ("glGenFramebuffers" );
+ glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)wglGetProcAddress ("glBindFramebuffer" );
+ glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)wglGetProcAddress ("glFramebufferRenderbuffer" );
+ glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)wglGetProcAddress ("glFramebufferTexture2D" );
+ glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)wglGetProcAddress ("glGenVertexArrays" );
+ glGenBuffers = (PFNGLGENBUFFERSPROC)wglGetProcAddress ("glGenBuffers" );
+ glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)wglGetProcAddress ("glBindVertexArray" );
+ glBindBuffer = (PFNGLBINDBUFFERPROC)wglGetProcAddress ("glBindBuffer" );
+ glBufferData = (PFNGLBUFFERDATAPROC)wglGetProcAddress ("glBufferData" );
+ glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)wglGetProcAddress ("glVertexAttribPointer" );
+ glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)wglGetProcAddress ("glEnableVertexAttribArray" );
+ glUseProgram = (PFNGLUSEPROGRAMPROC) wglGetProcAddress ("glUseProgram" );
+ glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)wglGetProcAddress ("glGetUniformLocation" );
+ glUniform1i = (PFNGLUNIFORM1IPROC)wglGetProcAddress ("glUniform1i" );
+ glActiveTexture = (PFNGLACTIVETEXTUREPROC)wglGetProcAddress ("glActiveTexture" );
+ glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)wglGetProcAddress ("glBlendFuncSeparate" );
+ glUniform1f = (PFNGLUNIFORM1FPROC)wglGetProcAddress ("glUniform1f" );
+ glUniform2fv = (PFNGLUNIFORM2FVPROC)wglGetProcAddress ("glUniform2fv" );
+ glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)wglGetProcAddress ("glDeleteRenderbuffer" );
+ glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)wglGetProcAddress ("glDeleteFramebuffers" );
+ glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)wglGetProcAddress ("glDeleteVertexArrays" );
+ glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)wglGetProcAddress ("glDeleteBuffers" );
}
#endif
}
diff --git a/src/Core/Universe.h b/src/Core/Universe.h
index e38a5511..0195eee4 100644
--- a/src/Core/Universe.h
+++ b/src/Core/Universe.h
@@ -26,6 +26,7 @@ MA 02110-1301, USA.
#import "OOCocoa.h"
#import "OOOpenGL.h"
+#import "OOShaderProgram.h"
#import "legacy_random.h"
#import "OOMaths.h"
#import "OOColor.h"
@@ -337,6 +338,14 @@ enum
BOOL _witchspaceBreakPattern;
BOOL _dockingClearanceProtocolActive;
BOOL _doingStartUp;
+
+ GLuint targetTextureID;
+ NSSize targetFramebufferSize;
+ GLuint targetDepthBufferID;
+ GLuint targetFramebufferID;
+ OOShaderProgram *textureProgram;
+ GLuint quadTextureVBO, quadTextureVAO, quadTextureEBO;
+ GLint defaultDrawFBO;
}
- (id)initWithGameView:(MyOpenGLView *)gameView;
diff --git a/src/Core/Universe.m b/src/Core/Universe.m
index 34df6739..94134856 100644
--- a/src/Core/Universe.m
+++ b/src/Core/Universe.m
@@ -23,7 +23,6 @@ MA 02110-1301, USA.
*/
-#import "OOOpenGL.h"
#import "Universe.h"
#import "MyOpenGLView.h"
#import "GameController.h"
@@ -91,6 +90,8 @@ MA 02110-1301, USA.
#import "OOJSScript.h"
#import "OOJSFrameCallbacks.h"
#import "OOJSPopulatorDefinition.h"
+#import "OOOpenGL.h"
+#import "OOShaderProgram.h"
#if OO_LOCALIZATION_TOOLS
@@ -122,6 +123,20 @@ static NSString * const kOOLogEntityVerificationError = @"entity.linkedList.ver
static NSString * const kOOLogEntityVerificationRebuild = @"entity.linkedList.verify.rebuild";
+
+const GLfloat framebufferQuadVertices[] = {
+ // positions // texture coords
+ 1.0f, 1.0f, 1.0f, 1.0f, // top right
+ 1.0f, -1.0f, 1.0f, 0.0f, // bottom right
+ -1.0f, -1.0f, 0.0f, 0.0f, // bottom left
+ -1.0f, 1.0f, 0.0f, 1.0f // top left
+};
+const GLuint framebufferQuadIndices[] = {
+ 0, 1, 3, // first triangle
+ 1, 2, 3 // second triangle
+};
+
+
Universe *gSharedUniverse = nil;
extern Entity *gOOJSPlayerIfStale;
@@ -183,6 +198,11 @@ static OOComparisonResult comparePrice(id dict1, id dict2, void * context);
@interface Universe (OOPrivate)
+- (void) initTargetFramebufferWithViewSize:(NSSize)viewSize;
+- (void) deleteOpenGLObjects;
+- (void) resizeTargetFramebufferWithViewSize:(NSSize)viewSize;
+- (void) drawTargetTextureIntoDefaultFramebuffer;
+
- (BOOL) doRemoveEntity:(Entity *)entity;
- (void) setUpCargoPods;
- (void) setUpInitialUniverse;
@@ -251,6 +271,168 @@ static GLfloat docked_light_specular[4] = { DOCKED_ILLUM_LEVEL, DOCKED_ILLUM_LEV
// How dark the default ambient level of 1.0 will be
#define SKY_AMBIENT_ADJUSTMENT 0.0625
+- (void) initTargetFramebufferWithViewSize:(NSSize)viewSize
+{
+ // have to do this because on my machine the default framebuffer is not zero
+ glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &defaultDrawFBO);
+
+ GLint previousProgramID;
+ glGetIntegerv(GL_CURRENT_PROGRAM, &previousProgramID);
+ GLint previousTextureID;
+ glGetIntegerv(GL_TEXTURE_BINDING_2D, &previousTextureID);
+ GLint previousVAO;
+ glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &previousVAO);
+ GLint previousArrayBuffer;
+ glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &previousArrayBuffer);
+ GLint previousElementBuffer;
+ glGetIntegerv(GL_ELEMENT_ARRAY_BUFFER_BINDING, &previousElementBuffer);
+
+ // creating texture that should be rendered into
+ glGenTextures(1, &targetTextureID);
+ glBindTexture(GL_TEXTURE_2D, targetTextureID);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, viewSize.width, viewSize.height, 0, GL_RGBA, GL_FLOAT, NULL);
+
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+
+ // create necessary depth render buffer
+ glGenRenderbuffers(1, &targetDepthBufferID);
+ glBindRenderbuffer(GL_RENDERBUFFER, targetDepthBufferID);
+ glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32F, viewSize.width, viewSize.height);
+
+ // create framebuffer and attach texture and depth buffer to framebuffer
+ glGenFramebuffers(1, &targetFramebufferID);
+ glBindFramebuffer(GL_FRAMEBUFFER, targetFramebufferID);
+ glDrawBuffer(GL_COLOR_ATTACHMENT0);
+ glReadBuffer(GL_COLOR_ATTACHMENT0);
+ glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, targetDepthBufferID);
+ glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, targetTextureID, 0);
+ targetFramebufferSize = viewSize;
+
+
+ /* TODO: in OOEnvironmentCubeMap.m call these bind functions not with 0 but with "previousXxxID"s:
+ - OOGL(glBindTexture(GL_TEXTURE_CUBE_MAP, 0));
+ - OOGL(glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0));
+ - OOGL(glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, 0));
+ */
+
+ // TODO do OpenGL calls like everywhere else (OOGL(...)) and with EXT and ARB and stuff
+
+ // TODO: does passing [NSDictionary dictionary] without releasing it here cause a memory leak?:
+ // shader for drawing a textured quad
+ textureProgram = [[OOShaderProgram shaderProgramWithVertexShaderName:@"oolite-texture.vertex"
+ fragmentShaderName:@"oolite-texture.fragment"
+ prefix:@"#version 330\n"// TODO use correct version
+ attributeBindings:[NSDictionary dictionary]] retain];
+
+ glGenVertexArrays(1, &quadTextureVAO);
+ glGenBuffers(1, &quadTextureVBO);
+ glGenBuffers(1, &quadTextureEBO);
+
+ glBindVertexArray(quadTextureVAO);
+
+ glBindBuffer(GL_ARRAY_BUFFER, quadTextureVBO);
+ glBufferData(GL_ARRAY_BUFFER, sizeof(framebufferQuadVertices), framebufferQuadVertices, GL_STATIC_DRAW);
+
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, quadTextureEBO);
+ glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(framebufferQuadIndices), framebufferQuadIndices, GL_STATIC_DRAW);
+
+ // position attribute
+ glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)0);
+ glEnableVertexAttribArray(0);
+ // texture coord attribute
+ glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), (void*)(2 * sizeof(float)));
+ glEnableVertexAttribArray(1);
+
+
+ // restoring previous bindings
+ glUseProgram(previousProgramID);
+ glBindFramebuffer(GL_FRAMEBUFFER, defaultDrawFBO);
+ glBindTexture(GL_TEXTURE_2D, previousTextureID);
+ glBindVertexArray(previousVAO);
+ glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, previousElementBuffer);
+ glBindBuffer(GL_ARRAY_BUFFER, previousArrayBuffer);
+
+}
+
+
+- (void) deleteOpenGLObjects
+{
+ glDeleteTextures(1, &targetTextureID);
+ glDeleteRenderbuffers(1, &targetDepthBufferID);
+ glDeleteFramebuffers(1, &targetFramebufferID);
+ glDeleteVertexArrays(1, &quadTextureVAO);
+ glDeleteBuffers(1, &quadTextureVBO);
+ glDeleteBuffers(1, &quadTextureEBO);
+ [textureProgram release];
+}
+
+
+- (void) resizeTargetFramebufferWithViewSize:(NSSize)viewSize
+{
+ // resize color attachment
+ glBindTexture(GL_TEXTURE_2D, targetTextureID);
+ glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, viewSize.width, viewSize.height, 0, GL_RGBA, GL_FLOAT, NULL);
+ glBindTexture(GL_TEXTURE_2D, 0);
+
+ // resize depth attachment
+ glBindRenderbuffer(GL_RENDERBUFFER, targetDepthBufferID);
+ glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT32F, viewSize.width, viewSize.height);
+ glBindRenderbuffer(GL_RENDERBUFFER, 0);
+
+ targetFramebufferSize.width = viewSize.width;
+ targetFramebufferSize.height = viewSize.height;
+}
+
+
+- (void) drawTargetTextureIntoDefaultFramebuffer
+{
+ GLhandleARB program = [textureProgram program];
+ NSSize viewSize = [gameView viewSize];
+ float fboResolution[2] = {viewSize.width, viewSize.height};
+
+
+ GLint previousFBO;
+ glGetIntegerv(GL_DRAW_FRAMEBUFFER_BINDING, &previousFBO);
+ GLint previousProgramID;
+ glGetIntegerv(GL_CURRENT_PROGRAM, &previousProgramID);
+ GLint previousTextureID;
+ glGetIntegerv(GL_TEXTURE_BINDING_2D, &previousTextureID);
+ GLint previousVAO;
+ glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &previousVAO);
+ GLint previousActiveTexture;
+ glGetIntegerv(GL_ACTIVE_TEXTURE, &previousActiveTexture);
+
+
+ glBindFramebuffer(GL_FRAMEBUFFER, defaultDrawFBO);
+
+ // fixes transparency issue for some reason
+ glDisable(GL_BLEND);
+
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ glUseProgram([textureProgram program]);
+
+ glUniform1i(glGetUniformLocation(program, "image"), 0);
+ glUniform1f(glGetUniformLocation(program, "uTime"), [self getTime]);
+ glUniform2fv(glGetUniformLocation(program, "uResolution"), 1, fboResolution);
+
+ glActiveTexture(GL_TEXTURE0);
+ glBindTexture(GL_TEXTURE_2D, targetTextureID);
+
+ glBindVertexArray(quadTextureVAO);
+ glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
+
+ // restore previous bindings
+ glBindFramebuffer(GL_FRAMEBUFFER, previousFBO);
+ glEnable(GL_BLEND);
+ glUseProgram(previousProgramID);
+ glActiveTexture(previousActiveTexture);
+ glBindTexture(GL_TEXTURE_2D, previousTextureID);
+ glBindVertexArray(previousVAO);
+}
- (id) initWithGameView:(MyOpenGLView *)inGameView
{
@@ -266,6 +448,7 @@ static GLfloat docked_light_specular[4] = { DOCKED_ILLUM_LEVEL, DOCKED_ILLUM_LEV
if (self == nil) return nil;
_doingStartUp = YES;
+
OOInitReallyRandom([NSDate timeIntervalSinceReferenceDate] * 1e9);
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
@@ -285,6 +468,7 @@ static GLfloat docked_light_specular[4] = { DOCKED_ILLUM_LEVEL, DOCKED_ILLUM_LEV
// init OpenGL extension manager (must be done before any other threads might use it)
[OOOpenGLExtensionManager sharedManager];
+ [self initTargetFramebufferWithViewSize:[gameView viewSize]];
[self setDetailLevelDirectly:[prefs oo_intForKey:@"detailLevel"
defaultValue:[[OOOpenGLExtensionManager sharedManager] defaultDetailLevel]]];
@@ -469,6 +653,8 @@ static GLfloat docked_light_specular[4] = { DOCKED_ILLUM_LEVEL, DOCKED_ILLUM_LEV
#endif
#endif
[conditionScripts release];
+
+ [self deleteOpenGLObjects];
[super dealloc];
}
@@ -4351,6 +4537,13 @@ static const OOMatrix starboard_matrix =
- (void) drawUniverse
{
OOLog(@"universe.profile.draw", @"%@", @"Begin draw");
+
+ if ((int)targetFramebufferSize.width != (int)[gameView viewSize].width || (int)targetFramebufferSize.height != (int)[gameView viewSize].height)
+ {
+ [self resizeTargetFramebufferWithViewSize:[gameView viewSize]];
+ }
+
+ glBindFramebuffer(GL_FRAMEBUFFER, targetFramebufferID);
if (!no_update)
{
@try
@@ -4756,7 +4949,13 @@ static const OOMatrix starboard_matrix =
}
}
}
+ glBindFramebuffer(GL_FRAMEBUFFER, defaultDrawFBO);
OOLog(@"universe.profile.draw", @"%@", @"End drawing");
+
+
+ OOLog(@"universe.profile.secondPassDraw", @"%@", @"Begin second pass draw");
+ [self drawTargetTextureIntoDefaultFramebuffer];
+ OOLog(@"universe.profile.secondPassDraw", @"%@", @"End second pass drawing");
}
@@ -9894,9 +10093,9 @@ static OOComparisonResult comparePrice(id dict1, id dict2, void *context)
//[ResourceManager loadScripts]; // initialised inside [player setUp]!
// NOTE: Anything in the sharedCache is now trashed and must be
- // reloaded. Ideally anything using the sharedCache should
- // be aware of cache flushes so it can automatically
- // reinitialize itself - mwerle 20081107.
+ // reloaded. Ideally anything using the sharedCache should
+ // be aware of cache flushes so it can automatically
+ // reinitialize itself - mwerle 20081107.
[OOShipRegistry reload];
[[self gameController] setGamePaused:NO];
[[self gameController] setMouseInteractionModeForUIWithMouseInteraction:NO];
/* Reset for HUD drawing */
into the framebuffer, and it seems to work (e.g. only the 3D world gets grey but not the HUD) except for the spinning models on the mainscreen/F7 planet/ship library/XenonUI which are not shown at all.Is there anything else likely to need updating? The only things that immediately come to mind are some of Svengali's experiments/proofs of concept (Animator Demo? StarMap Demo?) and possibly some of the more involved missions.