Moved some OpenGL utilities into OOOpenGL.

git-svn-id: http://svn.berlios.de/svnroot/repos/oolite-linux/trunk@976 127b21dd-08f5-0310-b4b7-95ae10353056
This commit is contained in:
Jens Ayton 2007-05-20 15:13:22 +00:00
parent 97f91f6a18
commit 55f832da66
14 changed files with 357 additions and 382 deletions

View File

@ -305,6 +305,7 @@
1A472917096B5454000E78D8 /* CoreAudio.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A472916096B5454000E78D8 /* CoreAudio.framework */; };
1A472921096B5468000E78D8 /* AudioToolbox.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A47291F096B5468000E78D8 /* AudioToolbox.framework */; };
1A472922096B5468000E78D8 /* AudioUnit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A472920096B5468000E78D8 /* AudioUnit.framework */; };
1A5AA3230C0098AF0029C78A /* OOOpenGL.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A5AA3220C0098AF0029C78A /* OOOpenGL.m */; };
1A5DB1EA0BBD8F0000D57389 /* OOConstToString.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A5DB1E80BBD8F0000D57389 /* OOConstToString.h */; };
1A5DB1EB0BBD8F0000D57389 /* OOConstToString.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A5DB1E90BBD8F0000D57389 /* OOConstToString.m */; };
1A5DBAA60BC000DC00D57389 /* OOJavaScriptEngine.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A5DBA9A0BC000DC00D57389 /* OOJavaScriptEngine.h */; };
@ -1115,6 +1116,7 @@
1A472916096B5454000E78D8 /* CoreAudio.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudio.framework; path = /System/Library/Frameworks/CoreAudio.framework; sourceTree = "<absolute>"; };
1A47291F096B5468000E78D8 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = /System/Library/Frameworks/AudioToolbox.framework; sourceTree = "<absolute>"; };
1A472920096B5468000E78D8 /* AudioUnit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioUnit.framework; path = /System/Library/Frameworks/AudioUnit.framework; sourceTree = "<absolute>"; };
1A5AA3220C0098AF0029C78A /* OOOpenGL.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OOOpenGL.m; sourceTree = "<group>"; };
1A5BF2720916D47300BF238F /* Oolite-importer.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = "Oolite-importer.xcodeproj"; path = "Oolite-importer/Oolite-importer.xcodeproj"; sourceTree = "<group>"; };
1A5DB1E80BBD8F0000D57389 /* OOConstToString.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OOConstToString.h; sourceTree = "<group>"; };
1A5DB1E90BBD8F0000D57389 /* OOConstToString.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OOConstToString.m; sourceTree = "<group>"; };
@ -1692,6 +1694,7 @@
isa = PBXGroup;
children = (
25F3E63A0994F08A002F25FD /* OOOpenGL.h */,
1A5AA3220C0098AF0029C78A /* OOOpenGL.m */,
1A2A1DEA0BD2A28E00152975 /* OOMacroOpenGL.h */,
1A43234A0BCFC9BB00F65914 /* OOOpenGLExtensionManager.h */,
1A43234B0BCFC9BB00F65914 /* OOOpenGLExtensionManager.m */,
@ -2569,6 +2572,7 @@
1A2A1B170BD2774300152975 /* OODrawable.m in Sources */,
1A2A1B2D0BD277D800152975 /* OOSelfDrawingEntity.m in Sources */,
1A2A1CAD0BD2914F00152975 /* OOMesh.m in Sources */,
1A5AA3230C0098AF0029C78A /* OOOpenGL.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};

View File

@ -186,7 +186,7 @@ MA 02110-1301, USA.
glDisable(GL_FOG);
}
//
CheckOpenGLErrors([NSString stringWithFormat:@"DustEntity after drawing %@", self]);
CheckOpenGLErrors(@"DustEntity after drawing %@", self);
//
}

View File

@ -30,7 +30,6 @@ MA 02110-1301, USA.
#import "OOOpenGLExtensionManager.h"
static NSString * const kOOLogOpenGLStateDump = @"rendering.opengl.stateDump";
static NSString * const kOOLogEntityDataNotFound = @"entity.loadMesh.failed.fileNotFound";
static NSString * const kOOLogEntityTooManyVertices = @"entity.loadMesh.failed.tooManyVertices";
static NSString * const kOOLogEntityTooManyFaces = @"entity.loadMesh.failed.tooManyFaces";
@ -222,7 +221,7 @@ static NSString * const kOOLogEntityTooManyFaces = @"entity.loadMesh.failed.to
}
}
if (!isSmoothShaded) glShadeModel(GL_SMOOTH);
CheckOpenGLErrors([NSString stringWithFormat:@"Entity after drawing %@", self]);
CheckOpenGLErrors(@"OOSelfDrawingEntity after drawing %@", self);
brokenInRender = NO;
NS_HANDLER
if (!brokenInRender)
@ -354,9 +353,6 @@ static NSString * const kOOLogEntityTooManyFaces = @"entity.loadMesh.failed.to
glNewList(displayListName, GL_COMPILE);
[self drawEntity:YES:NO]; // immediate YES translucent NO
glEndList();
//
CheckOpenGLErrors([NSString stringWithFormat:@"Entity after generateDisplayList for %@", self]);
//
}
}

View File

@ -1543,12 +1543,11 @@ static Vector circleVertex[65]; // holds vector coordinates for a unit circle
break;
default :
// NSLog(@"drawParticle immediate:%@ translucent:%@", immediate? @"YES":@"NO", translucent? @"YES":@"NO");
[self drawParticle];
break;
}
}
CheckOpenGLErrors([NSString stringWithFormat:@"ParticleEntity after drawing %@ %@", self, debug_type]);
CheckOpenGLErrors(@"ParticleEntity after drawing %@ %@", self, debug_type);
}
- (void) drawSubEntity:(BOOL) immediate :(BOOL) translucent

View File

@ -1493,7 +1493,7 @@ void setUpSinTable()
break;
}
glFrontFace(GL_CCW); // face culling - front faces are AntiClockwise!
CheckOpenGLErrors([NSString stringWithFormat:@"PlanetEntity after drawing %@", self]);
CheckOpenGLErrors(@"PlanetEntity after drawing %@", self);
}
void drawBall (double radius, int step, double z_distance)

View File

@ -2081,8 +2081,6 @@ double scoopSoundPlayTime = 0.0;
return; // don't draw
[super drawEntity: immediate : translucent];
CheckOpenGLErrors([NSString stringWithFormat:@"after drawing PlayerEntity %@", self]);
}
- (BOOL) massLocked

View File

@ -151,7 +151,7 @@ Ringdata ringentity;
}
}
glEnable(GL_LIGHTING);
CheckOpenGLErrors([NSString stringWithFormat:@"RingEntity after drawing %@", self]);
CheckOpenGLErrors(@"RingEntity after drawing %@", self);
}
- (BOOL) canCollide

View File

@ -242,7 +242,7 @@ static OOTexture *sStarTexture, *sBlobTexture;
glEnable(GL_DEPTH_TEST); // read the depth buffer
glDepthMask(GL_TRUE); // restore write to depth buffer
}
CheckOpenGLErrors([NSString stringWithFormat:@"SkyEntity after drawing %@", self]);
CheckOpenGLErrors(@"SkyEntity after drawing %@", self);
}
@end
@ -478,8 +478,6 @@ static OOTexture *sStarTexture, *sBlobTexture;
glNewList(displayListName, GL_COMPILE);
[self drawEntity:YES:NO]; // immediate YES translucent NO
glEndList();
CheckOpenGLErrors([NSString stringWithFormat:@"Entity after generateDisplayList for %@", self]);
}
}

View File

@ -263,7 +263,7 @@ MA 02110-1301, USA.
glEnable(GL_CULL_FACE); // face culling
}
CheckOpenGLErrors(@"after drawing WormholeEntity.");
CheckOpenGLErrors(@"WormholeEntity after drawing %@", self);
}
void drawWormholeCorona (double inner_radius, double outer_radius, int step, double z_distance, GLfloat* col4v1)

View File

@ -316,7 +316,7 @@ float char_widths[128] = {
NSLog(@"DEBUG HeadUpDisplay does not respond to '%@'",[info objectForKey:SELECTOR_KEY]);
}
//
CheckOpenGLErrors([NSString stringWithFormat:@"HeadUpDisplay after drawHUDItem %@", info]);
CheckOpenGLErrors(@"HeadUpDisplay after drawHUDItem %@", info);
//
}

View File

@ -136,22 +136,6 @@ shaderBindingTarget:(id<OOWeakReferenceSupport>)object;
@end
// TODO: move this stuff to OOOpenGL
// keep track of various OpenGL states
void my_glEnable(GLenum gl_state);
void my_glDisable(GLenum gl_state);
// log a list of current states
//
void LogOpenGLState();
// check for OpenGL errors, reporting them if where is not nil
//
BOOL CheckOpenGLErrors(NSString* where);
#import "OOCacheManager.h"
@interface OOCacheManager (Octree)

View File

@ -35,8 +35,6 @@ MA 02110-1301, USA.
#import "OOOpenGLExtensionManager.h"
static NSString * const kOOLogOpenGLExtensionsVAR = @"rendering.opengl.extensions.var";
static NSString * const kOOLogOpenGLStateDump = @"rendering.opengl.stateDump";
static NSString * const kOOLogMeshDataNotFound = @"mesh.load.failed.fileNotFound";
static NSString * const kOOLogMeshTooManyVertices = @"mesh.load.failed.tooManyVertices";
static NSString * const kOOLogMeshTooManyFaces = @"mesh.load.failed.tooManyFaces";
@ -249,7 +247,7 @@ shaderBindingTarget:(id<OOWeakReferenceSupport>)object
#endif
[OOMaterial applyNone];
CheckOpenGLErrors([NSString stringWithFormat:@"OOMesh after drawing %@", self]);
CheckOpenGLErrors(@"OOMesh after drawing %@", self);
glPopAttrib();
}
@ -274,7 +272,7 @@ shaderBindingTarget:(id<OOWeakReferenceSupport>)object
- (Geometry *)geometry
{
Geometry *result = [(Geometry *)[Geometry alloc] initWithCapacity:faceCount];
Geometry *result = [[Geometry alloc] initWithCapacity:faceCount];
int i;
for (i = 0; i < faceCount; i++)
{
@ -1237,350 +1235,6 @@ shaderBindingTarget:(id<OOWeakReferenceSupport>)target
@end
// log a list of current states
//
// we need to report on the material properties
GLfloat stored_mat_ambient[4];
GLfloat stored_mat_diffuse[4];
GLfloat stored_mat_emission[4];
GLfloat stored_mat_specular[4];
GLfloat stored_mat_shininess[1];
//
GLfloat stored_current_color[4];
//
GLint stored_gl_shade_model[1];
//
GLint stored_gl_texture_env_mode[1];
//
GLint stored_gl_cull_face_mode[1];
//
GLint stored_gl_front_face[1];
//
GLint stored_gl_blend_src[1];
GLint stored_gl_blend_dst[1];
//
GLenum stored_errCode;
//
void LogOpenGLState()
{
if (!OOLogWillDisplayMessagesInClass(kOOLogOpenGLStateDump)) return;
// we need to report on the material properties
GLfloat mat_ambient[4];
GLfloat mat_diffuse[4];
GLfloat mat_emission[4];
GLfloat mat_specular[4];
GLfloat mat_shininess[1];
//
GLfloat current_color[4];
//
GLint gl_shade_model[1];
//
GLint gl_texture_env_mode[1];
NSString* tex_env_mode_string = nil;
//
GLint gl_cull_face_mode[1];
NSString* cull_face_mode_string = nil;
//
GLint gl_front_face[1];
NSString* front_face_string = nil;
//
GLint gl_blend_src[1];
NSString* blend_src_string = nil;
GLint gl_blend_dst[1];
NSString* blend_dst_string = nil;
//
GLenum errCode;
const GLubyte *errString;
glGetMaterialfv( GL_FRONT, GL_AMBIENT, mat_ambient);
glGetMaterialfv( GL_FRONT, GL_DIFFUSE, mat_diffuse);
glGetMaterialfv( GL_FRONT, GL_EMISSION, mat_emission);
glGetMaterialfv( GL_FRONT, GL_SPECULAR, mat_specular);
glGetMaterialfv( GL_FRONT, GL_SHININESS, mat_shininess);
//
glGetFloatv( GL_CURRENT_COLOR, current_color);
//
glGetIntegerv( GL_SHADE_MODEL, gl_shade_model);
//
glGetIntegerv( GL_BLEND_SRC, gl_blend_src);
switch (gl_blend_src[0])
{
case GL_ZERO:
blend_src_string = @"GL_ZERO";
break;
case GL_ONE:
blend_src_string = @"GL_ONE";
break;
case GL_DST_COLOR:
blend_src_string = @"GL_DST_COLOR";
break;
case GL_SRC_COLOR:
blend_src_string = @"GL_SRC_COLOR";
break;
case GL_ONE_MINUS_DST_COLOR:
blend_src_string = @"GL_ONE_MINUS_DST_COLOR";
break;
case GL_ONE_MINUS_SRC_COLOR:
blend_src_string = @"GL_ONE_MINUS_SRC_COLOR";
break;
case GL_SRC_ALPHA:
blend_src_string = @"GL_SRC_ALPHA";
break;
case GL_DST_ALPHA:
blend_src_string = @"GL_DST_ALPHA";
break;
case GL_ONE_MINUS_SRC_ALPHA:
blend_src_string = @"GL_ONE_MINUS_SRC_ALPHA";
break;
case GL_ONE_MINUS_DST_ALPHA:
blend_src_string = @"GL_ONE_MINUS_DST_ALPHA";
break;
case GL_SRC_ALPHA_SATURATE:
blend_src_string = @"GL_SRC_ALPHA_SATURATE";
break;
default:
break;
}
//
glGetIntegerv( GL_BLEND_DST, gl_blend_dst);
switch (gl_blend_dst[0])
{
case GL_ZERO:
blend_dst_string = @"GL_ZERO";
break;
case GL_ONE:
blend_dst_string = @"GL_ONE";
break;
case GL_DST_COLOR:
blend_dst_string = @"GL_DST_COLOR";
break;
case GL_SRC_COLOR:
blend_dst_string = @"GL_SRC_COLOR";
break;
case GL_ONE_MINUS_DST_COLOR:
blend_dst_string = @"GL_ONE_MINUS_DST_COLOR";
break;
case GL_ONE_MINUS_SRC_COLOR:
blend_dst_string = @"GL_ONE_MINUS_SRC_COLOR";
break;
case GL_SRC_ALPHA:
blend_dst_string = @"GL_SRC_ALPHA";
break;
case GL_DST_ALPHA:
blend_dst_string = @"GL_DST_ALPHA";
break;
case GL_ONE_MINUS_SRC_ALPHA:
blend_dst_string = @"GL_ONE_MINUS_SRC_ALPHA";
break;
case GL_ONE_MINUS_DST_ALPHA:
blend_dst_string = @"GL_ONE_MINUS_DST_ALPHA";
break;
case GL_SRC_ALPHA_SATURATE:
blend_dst_string = @"GL_SRC_ALPHA_SATURATE";
break;
default:
break;
}
//
glGetIntegerv( GL_CULL_FACE_MODE, gl_cull_face_mode);
switch (gl_cull_face_mode[0])
{
case GL_BACK:
cull_face_mode_string = @"GL_BACK";
break;
case GL_FRONT:
cull_face_mode_string = @"GL_FRONT";
break;
default:
break;
}
//
glGetIntegerv( GL_FRONT_FACE, gl_front_face);
switch (gl_front_face[0])
{
case GL_CCW:
front_face_string = @"GL_CCW";
break;
case GL_CW:
front_face_string = @"GL_CW";
break;
default:
break;
}
//
glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, gl_texture_env_mode);
switch (gl_texture_env_mode[0])
{
case GL_DECAL:
tex_env_mode_string = @"GL_DECAL";
break;
case GL_REPLACE:
tex_env_mode_string = @"GL_REPLACE";
break;
case GL_MODULATE:
tex_env_mode_string = @"GL_MODULATE";
break;
case GL_BLEND:
tex_env_mode_string = @"GL_BLEND";
break;
default:
break;
}
//
if ((errCode =glGetError()) != GL_NO_ERROR)
{
errString = gluErrorString(errCode);
OOLog(kOOLogOpenGLError, @"OpenGL error: '%s' (%u) in: %@", errString, errCode);
}
/*-- MATERIALS --*/
if ((stored_mat_ambient[0] != mat_ambient[0])||(stored_mat_ambient[1] != mat_ambient[1])||(stored_mat_ambient[2] != mat_ambient[2])||(stored_mat_ambient[3] != mat_ambient[2]))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_AMBIENT ( %.2ff, %.2ff, %.2ff, %.2ff)",
mat_ambient[0], mat_ambient[1], mat_ambient[2], mat_ambient[3]);
if ((stored_mat_diffuse[0] != mat_diffuse[0])||(stored_mat_diffuse[1] != mat_diffuse[1])||(stored_mat_diffuse[2] != mat_diffuse[2])||(stored_mat_diffuse[3] != mat_diffuse[2]))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_DIFFUSE ( %.2ff, %.2ff, %.2ff, %.2ff)",
mat_diffuse[0], mat_diffuse[1], mat_diffuse[2], mat_diffuse[3]);
if ((stored_mat_emission[0] != mat_emission[0])||(stored_mat_emission[1] != mat_emission[1])||(stored_mat_emission[2] != mat_emission[2])||(stored_mat_emission[3] != mat_emission[2]))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_EMISSION ( %.2ff, %.2ff, %.2ff, %.2ff)",
mat_emission[0], mat_emission[1], mat_emission[2], mat_emission[3]);
if ((stored_mat_specular[0] != mat_specular[0])||(stored_mat_specular[1] != mat_specular[1])||(stored_mat_specular[2] != mat_specular[2])||(stored_mat_specular[3] != mat_specular[2]))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_SPECULAR ( %.2ff, %.2ff, %.2ff, %.2ff)",
mat_specular[0], mat_specular[1], mat_specular[2], mat_specular[3]);
if (stored_mat_shininess[0] != mat_shininess[0])
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_SHININESS ( %.2ff)", mat_shininess[0]);
stored_mat_ambient[0] = mat_ambient[0]; stored_mat_ambient[1] = mat_ambient[1]; stored_mat_ambient[2] = mat_ambient[2]; stored_mat_ambient[3] = mat_ambient[3];
stored_mat_diffuse[0] = mat_diffuse[0]; stored_mat_diffuse[1] = mat_diffuse[1]; stored_mat_diffuse[2] = mat_diffuse[2]; stored_mat_diffuse[3] = mat_diffuse[3];
stored_mat_emission[0] = mat_emission[0]; stored_mat_emission[1] = mat_emission[1]; stored_mat_emission[2] = mat_emission[2]; stored_mat_emission[3] = mat_emission[3];
stored_mat_specular[0] = mat_specular[0]; stored_mat_specular[1] = mat_specular[1]; stored_mat_specular[2] = mat_specular[2]; stored_mat_specular[3] = mat_specular[3];
stored_mat_shininess[0] = mat_shininess[0];
/*-- MATERIALS --*/
//
/*-- LIGHTS --*/
if (glIsEnabled(GL_LIGHTING))
{
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHTING :ENABLED:");
if (glIsEnabled(GL_LIGHT0))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT0 :ENABLED:");
if (glIsEnabled(GL_LIGHT1))
{
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT1 :ENABLED:");
GLfloat light_ambient[4];
GLfloat light_diffuse[4];
GLfloat light_specular[4];
glGetLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient);
glGetLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse);
glGetLightfv(GL_LIGHT1, GL_SPECULAR, light_specular);
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT1 GL_AMBIENT ( %.2ff, %.2ff, %.2ff, %.2ff)",
light_ambient[0], light_ambient[1], light_ambient[2], light_ambient[3]);
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT1 GL_DIFFUSE ( %.2ff, %.2ff, %.2ff, %.2ff)",
light_diffuse[0], light_diffuse[1], light_diffuse[2], light_diffuse[3]);
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT1 GL_SPECULAR ( %.2ff, %.2ff, %.2ff, %.2ff)",
light_specular[0], light_specular[1], light_specular[2], light_specular[3]);
}
if (glIsEnabled(GL_LIGHT2))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT2 :ENABLED:");
if (glIsEnabled(GL_LIGHT3))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT3 :ENABLED:");
if (glIsEnabled(GL_LIGHT4))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT4 :ENABLED:");
if (glIsEnabled(GL_LIGHT5))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT5 :ENABLED:");
if (glIsEnabled(GL_LIGHT6))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT6 :ENABLED:");
if (glIsEnabled(GL_LIGHT7))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT7 :ENABLED:");
}
/*-- LIGHTS --*/
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_CURRENT_COLOR ( %.2ff, %.2ff, %.2ff, %.2ff)",
current_color[0], current_color[1], current_color[2], current_color[3]);
//
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_TEXTURE_ENV_MODE :%@:", tex_env_mode_string);
//
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_SHADEMODEL :%@:", (gl_shade_model[0] == GL_SMOOTH)? @"GL_SMOOTH": @"GL_FLAT");
//
if (glIsEnabled(GL_FOG))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_FOG :ENABLED:");
//
if (glIsEnabled(GL_COLOR_MATERIAL))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_COLOR_MATERIAL :ENABLED:");
//
if (glIsEnabled(GL_BLEND))
{
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_BLEND :ENABLED:");
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_BLEND_FUNC (:%@:, :%@:)", blend_src_string, blend_dst_string);
}
//
if (glIsEnabled(GL_CULL_FACE))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_CULL_FACE :ENABLED:");
//
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_CULL_FACE_MODE :%@:", cull_face_mode_string);
//
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_FRONT_FACE :%@:", front_face_string);
}
// check for OpenGL errors, reporting them if where is not nil
//
BOOL CheckOpenGLErrors(NSString* where)
{
GLenum errCode;
const GLubyte *errString = NULL;
BOOL errorOccurred = NO;
// Short-circut here, because glGetError() is quite expensive.
if (OOLogWillDisplayMessagesInClass(kOOLogOpenGLError))
{
errCode = glGetError();
if (errCode != GL_NO_ERROR)
{
errorOccurred = YES;
errString = gluErrorString(errCode);
if (where == nil) where = @"<unknown>";
OOLog(kOOLogOpenGLError, @"OpenGL error: '%s' (%u) in: %@", errString, errCode, where);
}
}
return errorOccurred;
}
// keep track of various OpenGL states
//
static BOOL mygl_texture_2d;
void my_glEnable(GLenum gl_state)
{
switch (gl_state)
{
case GL_TEXTURE_2D:
if (mygl_texture_2d)
return;
mygl_texture_2d = YES;
break;
default:
break;
}
glEnable(gl_state);
}
//
void my_glDisable(GLenum gl_state)
{
switch (gl_state)
{
case GL_TEXTURE_2D:
if (!mygl_texture_2d)
return;
mygl_texture_2d = NO;
break;
default:
break;
}
glDisable(gl_state);
}
static NSString * const kOOCacheMeshes = @"OOMesh";
@implementation OOCacheManager (OOMesh)
@ -1602,7 +1256,6 @@ static NSString * const kOOCacheMeshes = @"OOMesh";
@end
static NSString * const kOOCacheOctrees = @"octrees";
@implementation OOCacheManager (Octree)

View File

@ -4,6 +4,9 @@ OOOpenGL.h
Do whatever is appropriate to get gl.h, glu.h and glext.h included.
Also declares OpenGL-related utility functions.
Oolite
Copyright (C) 2004-2007 Giles C Williams and contributors
@ -74,3 +77,18 @@ typedef uintptr_t OOOpenGLContext; // Opaque context identifier
#define NULL_SHADER ((GLhandleARB)0)
/* CheckOpenGLErrors()
Check for and log OpenGL errors, and returns YES if an error occurred.
NOTE: this is controlled by the log message class rendering.opengl.error.
If logging is disabled, no error checking will occur. This is done
because glGetError() is quite expensive, requiring a full OpenGL
state sync.
*/
BOOL CheckOpenGLErrors(NSString *format, ...);
/* LogOpenGLState()
Write a bunch of OpenGL state information to the log.
*/
void LogOpenGLState(void);

325
src/Core/OOOpenGL.m Normal file
View File

@ -0,0 +1,325 @@
/*
OOOpenGL.m
Oolite
Copyright (C) 2004-2007 Giles C Williams and contributors
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
MA 02110-1301, USA.
*/
#import "OOOpenGL.h"
#import "OOLogging.h"
static NSString * const kOOLogOpenGLStateDump = @"rendering.opengl.stateDump";
BOOL CheckOpenGLErrors(NSString *format, ...)
{
GLenum errCode;
const GLubyte *errString = NULL;
BOOL errorOccurred = NO;
va_list args;
// Short-circut here, because glGetError() is quite expensive.
if (OOLogWillDisplayMessagesInClass(kOOLogOpenGLError))
{
errCode = glGetError();
if (errCode != GL_NO_ERROR)
{
errorOccurred = YES;
errString = gluErrorString(errCode);
if (format == nil) format = @"<unknown>";
va_start(args, format);
format = [[NSString alloc] initWithFormat:format arguments:args];
va_end(args);
OOLog(kOOLogOpenGLError, @"OpenGL error: \"%s\" (%u), context: %@", errString, errCode, format);
}
}
return errorOccurred;
}
static GLfloat stored_mat_ambient[4];
static GLfloat stored_mat_diffuse[4];
static GLfloat stored_mat_emission[4];
static GLfloat stored_mat_specular[4];
static GLfloat stored_mat_shininess[1];
void LogOpenGLState()
{
if (!OOLogWillDisplayMessagesInClass(kOOLogOpenGLStateDump)) return;
// we need to report on the material properties
GLfloat mat_ambient[4];
GLfloat mat_diffuse[4];
GLfloat mat_emission[4];
GLfloat mat_specular[4];
GLfloat mat_shininess[1];
//
GLfloat current_color[4];
//
GLint gl_shade_model[1];
//
GLint gl_texture_env_mode[1];
NSString* tex_env_mode_string = nil;
//
GLint gl_cull_face_mode[1];
NSString* cull_face_mode_string = nil;
//
GLint gl_front_face[1];
NSString* front_face_string = nil;
//
GLint gl_blend_src[1];
NSString* blend_src_string = nil;
GLint gl_blend_dst[1];
NSString* blend_dst_string = nil;
//
GLenum errCode;
const GLubyte *errString;
glGetMaterialfv( GL_FRONT, GL_AMBIENT, mat_ambient);
glGetMaterialfv( GL_FRONT, GL_DIFFUSE, mat_diffuse);
glGetMaterialfv( GL_FRONT, GL_EMISSION, mat_emission);
glGetMaterialfv( GL_FRONT, GL_SPECULAR, mat_specular);
glGetMaterialfv( GL_FRONT, GL_SHININESS, mat_shininess);
//
glGetFloatv( GL_CURRENT_COLOR, current_color);
//
glGetIntegerv( GL_SHADE_MODEL, gl_shade_model);
//
glGetIntegerv( GL_BLEND_SRC, gl_blend_src);
switch (gl_blend_src[0])
{
case GL_ZERO:
blend_src_string = @"GL_ZERO";
break;
case GL_ONE:
blend_src_string = @"GL_ONE";
break;
case GL_DST_COLOR:
blend_src_string = @"GL_DST_COLOR";
break;
case GL_SRC_COLOR:
blend_src_string = @"GL_SRC_COLOR";
break;
case GL_ONE_MINUS_DST_COLOR:
blend_src_string = @"GL_ONE_MINUS_DST_COLOR";
break;
case GL_ONE_MINUS_SRC_COLOR:
blend_src_string = @"GL_ONE_MINUS_SRC_COLOR";
break;
case GL_SRC_ALPHA:
blend_src_string = @"GL_SRC_ALPHA";
break;
case GL_DST_ALPHA:
blend_src_string = @"GL_DST_ALPHA";
break;
case GL_ONE_MINUS_SRC_ALPHA:
blend_src_string = @"GL_ONE_MINUS_SRC_ALPHA";
break;
case GL_ONE_MINUS_DST_ALPHA:
blend_src_string = @"GL_ONE_MINUS_DST_ALPHA";
break;
case GL_SRC_ALPHA_SATURATE:
blend_src_string = @"GL_SRC_ALPHA_SATURATE";
break;
default:
break;
}
//
glGetIntegerv( GL_BLEND_DST, gl_blend_dst);
switch (gl_blend_dst[0])
{
case GL_ZERO:
blend_dst_string = @"GL_ZERO";
break;
case GL_ONE:
blend_dst_string = @"GL_ONE";
break;
case GL_DST_COLOR:
blend_dst_string = @"GL_DST_COLOR";
break;
case GL_SRC_COLOR:
blend_dst_string = @"GL_SRC_COLOR";
break;
case GL_ONE_MINUS_DST_COLOR:
blend_dst_string = @"GL_ONE_MINUS_DST_COLOR";
break;
case GL_ONE_MINUS_SRC_COLOR:
blend_dst_string = @"GL_ONE_MINUS_SRC_COLOR";
break;
case GL_SRC_ALPHA:
blend_dst_string = @"GL_SRC_ALPHA";
break;
case GL_DST_ALPHA:
blend_dst_string = @"GL_DST_ALPHA";
break;
case GL_ONE_MINUS_SRC_ALPHA:
blend_dst_string = @"GL_ONE_MINUS_SRC_ALPHA";
break;
case GL_ONE_MINUS_DST_ALPHA:
blend_dst_string = @"GL_ONE_MINUS_DST_ALPHA";
break;
case GL_SRC_ALPHA_SATURATE:
blend_dst_string = @"GL_SRC_ALPHA_SATURATE";
break;
default:
break;
}
//
glGetIntegerv( GL_CULL_FACE_MODE, gl_cull_face_mode);
switch (gl_cull_face_mode[0])
{
case GL_BACK:
cull_face_mode_string = @"GL_BACK";
break;
case GL_FRONT:
cull_face_mode_string = @"GL_FRONT";
break;
default:
break;
}
//
glGetIntegerv( GL_FRONT_FACE, gl_front_face);
switch (gl_front_face[0])
{
case GL_CCW:
front_face_string = @"GL_CCW";
break;
case GL_CW:
front_face_string = @"GL_CW";
break;
default:
break;
}
//
glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, gl_texture_env_mode);
switch (gl_texture_env_mode[0])
{
case GL_DECAL:
tex_env_mode_string = @"GL_DECAL";
break;
case GL_REPLACE:
tex_env_mode_string = @"GL_REPLACE";
break;
case GL_MODULATE:
tex_env_mode_string = @"GL_MODULATE";
break;
case GL_BLEND:
tex_env_mode_string = @"GL_BLEND";
break;
default:
break;
}
//
if ((errCode =glGetError()) != GL_NO_ERROR)
{
errString = gluErrorString(errCode);
OOLog(kOOLogOpenGLError, @"OpenGL error: '%s' (%u) in: %@", errString, errCode);
}
/*-- MATERIALS --*/
if ((stored_mat_ambient[0] != mat_ambient[0])||(stored_mat_ambient[1] != mat_ambient[1])||(stored_mat_ambient[2] != mat_ambient[2])||(stored_mat_ambient[3] != mat_ambient[2]))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_AMBIENT ( %.2ff, %.2ff, %.2ff, %.2ff)",
mat_ambient[0], mat_ambient[1], mat_ambient[2], mat_ambient[3]);
if ((stored_mat_diffuse[0] != mat_diffuse[0])||(stored_mat_diffuse[1] != mat_diffuse[1])||(stored_mat_diffuse[2] != mat_diffuse[2])||(stored_mat_diffuse[3] != mat_diffuse[2]))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_DIFFUSE ( %.2ff, %.2ff, %.2ff, %.2ff)",
mat_diffuse[0], mat_diffuse[1], mat_diffuse[2], mat_diffuse[3]);
if ((stored_mat_emission[0] != mat_emission[0])||(stored_mat_emission[1] != mat_emission[1])||(stored_mat_emission[2] != mat_emission[2])||(stored_mat_emission[3] != mat_emission[2]))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_EMISSION ( %.2ff, %.2ff, %.2ff, %.2ff)",
mat_emission[0], mat_emission[1], mat_emission[2], mat_emission[3]);
if ((stored_mat_specular[0] != mat_specular[0])||(stored_mat_specular[1] != mat_specular[1])||(stored_mat_specular[2] != mat_specular[2])||(stored_mat_specular[3] != mat_specular[2]))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_SPECULAR ( %.2ff, %.2ff, %.2ff, %.2ff)",
mat_specular[0], mat_specular[1], mat_specular[2], mat_specular[3]);
if (stored_mat_shininess[0] != mat_shininess[0])
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_SHININESS ( %.2ff)", mat_shininess[0]);
stored_mat_ambient[0] = mat_ambient[0]; stored_mat_ambient[1] = mat_ambient[1]; stored_mat_ambient[2] = mat_ambient[2]; stored_mat_ambient[3] = mat_ambient[3];
stored_mat_diffuse[0] = mat_diffuse[0]; stored_mat_diffuse[1] = mat_diffuse[1]; stored_mat_diffuse[2] = mat_diffuse[2]; stored_mat_diffuse[3] = mat_diffuse[3];
stored_mat_emission[0] = mat_emission[0]; stored_mat_emission[1] = mat_emission[1]; stored_mat_emission[2] = mat_emission[2]; stored_mat_emission[3] = mat_emission[3];
stored_mat_specular[0] = mat_specular[0]; stored_mat_specular[1] = mat_specular[1]; stored_mat_specular[2] = mat_specular[2]; stored_mat_specular[3] = mat_specular[3];
stored_mat_shininess[0] = mat_shininess[0];
/*-- MATERIALS --*/
//
/*-- LIGHTS --*/
if (glIsEnabled(GL_LIGHTING))
{
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHTING :ENABLED:");
if (glIsEnabled(GL_LIGHT0))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT0 :ENABLED:");
if (glIsEnabled(GL_LIGHT1))
{
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT1 :ENABLED:");
GLfloat light_ambient[4];
GLfloat light_diffuse[4];
GLfloat light_specular[4];
glGetLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient);
glGetLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse);
glGetLightfv(GL_LIGHT1, GL_SPECULAR, light_specular);
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT1 GL_AMBIENT ( %.2ff, %.2ff, %.2ff, %.2ff)",
light_ambient[0], light_ambient[1], light_ambient[2], light_ambient[3]);
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT1 GL_DIFFUSE ( %.2ff, %.2ff, %.2ff, %.2ff)",
light_diffuse[0], light_diffuse[1], light_diffuse[2], light_diffuse[3]);
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT1 GL_SPECULAR ( %.2ff, %.2ff, %.2ff, %.2ff)",
light_specular[0], light_specular[1], light_specular[2], light_specular[3]);
}
if (glIsEnabled(GL_LIGHT2))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT2 :ENABLED:");
if (glIsEnabled(GL_LIGHT3))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT3 :ENABLED:");
if (glIsEnabled(GL_LIGHT4))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT4 :ENABLED:");
if (glIsEnabled(GL_LIGHT5))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT5 :ENABLED:");
if (glIsEnabled(GL_LIGHT6))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT6 :ENABLED:");
if (glIsEnabled(GL_LIGHT7))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_LIGHT7 :ENABLED:");
}
/*-- LIGHTS --*/
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_CURRENT_COLOR ( %.2ff, %.2ff, %.2ff, %.2ff)",
current_color[0], current_color[1], current_color[2], current_color[3]);
//
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_TEXTURE_ENV_MODE :%@:", tex_env_mode_string);
//
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_SHADEMODEL :%@:", (gl_shade_model[0] == GL_SMOOTH)? @"GL_SMOOTH": @"GL_FLAT");
//
if (glIsEnabled(GL_FOG))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_FOG :ENABLED:");
//
if (glIsEnabled(GL_COLOR_MATERIAL))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_COLOR_MATERIAL :ENABLED:");
//
if (glIsEnabled(GL_BLEND))
{
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_BLEND :ENABLED:");
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_BLEND_FUNC (:%@:, :%@:)", blend_src_string, blend_dst_string);
}
//
if (glIsEnabled(GL_CULL_FACE))
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_CULL_FACE :ENABLED:");
//
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_CULL_FACE_MODE :%@:", cull_face_mode_string);
//
OOLog(kOOLogOpenGLStateDump, @"OPENGL_DEBUG GL_FRONT_FACE :%@:", front_face_string);
}