Cleaned up and commented mesh cache generation code as first step in debugging. Not really exciting enough to be revision 1000.

git-svn-id: http://svn.berlios.de/svnroot/repos/oolite-linux/trunk@1000 127b21dd-08f5-0310-b4b7-95ae10353056
This commit is contained in:
Jens Ayton 2007-06-05 10:46:28 +00:00
parent beedfd7d98
commit 2edf174248
2 changed files with 40 additions and 14 deletions

View File

@ -43,7 +43,6 @@ MA 02110-1301, USA.
enum enum
{ {
kOOMeshMaxVertices = 500, kOOMeshMaxVertices = 500,
kOOMeshMaxFaces = 800, kOOMeshMaxFaces = 800,
kOOMeshMaxMaterials = 8, kOOMeshMaxMaterials = 8,

View File

@ -490,6 +490,7 @@ shaderBindingTarget:(id<OOWeakReferenceSupport>)target
NSArray *mtlKeys = nil; NSArray *mtlKeys = nil;
NSNumber *smooth = nil; NSNumber *smooth = nil;
// Prepare cache data elements.
vertCnt = [NSNumber numberWithUnsignedInt:vertexCount]; vertCnt = [NSNumber numberWithUnsignedInt:vertexCount];
faceCnt = [NSNumber numberWithUnsignedInt:faceCount]; faceCnt = [NSNumber numberWithUnsignedInt:faceCount];
@ -500,8 +501,19 @@ shaderBindingTarget:(id<OOWeakReferenceSupport>)target
mtlKeys = [NSArray arrayWithObjects:materialKeys count:materialCount]; mtlKeys = [NSArray arrayWithObjects:materialKeys count:materialCount];
smooth = [NSNumber numberWithBool:isSmoothShaded]; smooth = [NSNumber numberWithBool:isSmoothShaded];
if (vertCnt == nil || faceCnt == nil || vertData == nil || normData == nil || faceData == nil || mtlKeys == nil || smooth == nil) return nil; // Ensure we have all thr required data elements.
if (vertCnt == nil ||
faceCnt == nil ||
vertData == nil ||
normData == nil ||
faceData == nil ||
mtlKeys == nil ||
smooth == nil)
{
return nil;
}
// All OK; stick 'em in a dictionary.
return [NSDictionary dictionaryWithObjectsAndKeys: return [NSDictionary dictionaryWithObjectsAndKeys:
vertCnt, @"vertex count", vertCnt, @"vertex count",
vertData, @"vertex data", vertData, @"vertex data",
@ -523,37 +535,52 @@ shaderBindingTarget:(id<OOWeakReferenceSupport>)target
*faceData = nil; *faceData = nil;
NSArray *mtlKeys = nil; NSArray *mtlKeys = nil;
NSNumber *smooth = nil; NSNumber *smooth = nil;
id key = nil; NSString *key = nil;
unsigned i; unsigned i;
if (dict == nil) return NO; if (dict == nil || ![dict isKindOfClass:[NSDictionary class]]) return NO;
vertCnt = [dict objectForKey:@"vertex count"]; // Read data elements from dictionary.
faceCnt = [dict objectForKey:@"face count"]; vertCnt = [dict objectOfClass:[NSNumber class] forKey:@"vertex count"];
faceCnt = [dict objectOfClass:[NSNumber class] forKey:@"face count"];
vertData = [dict dataForKey:@"vertex data"]; vertData = [dict dataForKey:@"vertex data"];
normData = [dict dataForKey:@"normal data"]; normData = [dict dataForKey:@"normal data"];
faceData = [dict dataForKey:@"face data"]; faceData = [dict dataForKey:@"face data"];
mtlKeys = [dict arrayForKey:@"material keys"]; mtlKeys = [dict arrayForKey:@"material keys"];
smooth = [dict objectForKey:@"smooth"]; smooth = [dict objectOfClass:[NSNumber class] forKey:@"smooth"];
if (vertCnt == nil || faceCnt == nil || vertData == nil || normData == nil || faceData == nil || mtlKeys == nil || smooth == nil) return NO; // Ensure we have all thr required data elements.
if (![vertCnt respondsToSelector:@selector(unsignedIntValue)]) return NO; if (vertCnt == nil ||
if (![faceCnt respondsToSelector:@selector(unsignedIntValue)]) return NO; faceCnt == nil ||
if (![smooth respondsToSelector:@selector(boolValue)]) return NO; vertData == nil ||
normData == nil ||
faceData == nil ||
mtlKeys == nil ||
smooth == nil)
{
return NO;
}
vertexCount = [vertCnt unsignedIntValue]; vertexCount = [vertCnt unsignedIntValue];
faceCount = [faceCnt unsignedIntValue]; faceCount = [faceCnt unsignedIntValue];
if ([vertData length] != sizeof *vertices * vertexCount || [vertData length] > sizeof(vertices)) return NO; // Check that counts are in range.
if ([normData length] != sizeof *normals * vertexCount || [normData length] > sizeof(normals)) return NO; if (vertexCount == 0 || kOOMeshMaxVertices <= vertexCount) return NO;
if ([faceData length] != sizeof *faces * faceCount || [faceData length] > sizeof(faces)) return NO; if (faceCount == 0 || kOOMeshMaxFaces <= faceCount) return NO;
// Ensure data objects are of correct size.
if ([vertData length] != sizeof *vertices * vertexCount) return NO;
if ([normData length] != sizeof *normals * vertexCount) return NO;
if ([faceData length] != sizeof *faces * faceCount) return NO;
// Copy data.
memcpy(vertices, [vertData bytes], [vertData length]); memcpy(vertices, [vertData bytes], [vertData length]);
memcpy(normals, [normData bytes], [normData length]); memcpy(normals, [normData bytes], [normData length]);
memcpy(faces, [faceData bytes], [faceData length]); memcpy(faces, [faceData bytes], [faceData length]);
// Copy material keys.
materialCount = [mtlKeys count]; materialCount = [mtlKeys count];
for (i = 0; i != materialCount; ++i) for (i = 0; i != materialCount; ++i)
{ {