Cliff Biffle avatar Cliff Biffle committed 0351b52

Renamed KVRayFieldSpaceModel -> KVRenderer, now that it's looking like I won't have multiple implementations any time soon.

Comments (0)

Files changed (6)

 
 #import "KVDepthView.h"
 #import "KVSpaceModel.h"
-#import "KVRayFieldSpaceModel.h"
+#import "KVRenderer.h"
 #import "KVDepthRecorder.h"
 #import "trackball.h"
 #import "utility.h"
     .scale = { 0.92F, 0.92F },
   };
   
-  self.spaceModel = [[[KVRayFieldSpaceModel alloc] init] autorelease];
+  self.spaceModel = [[[KVRenderer alloc] init] autorelease];
   self.polygonMode = KVFilledPolygonMode;
 }
 

KVRayFieldSpaceModel.h

-/*
- * Copyright 2010 Cliff L. Biffle.  All Rights Reserved.
- * Use of this source code is governed by the Apache License 2.0,
- * which can be found in the LICENSE file.
- */
-
-#import <Cocoa/Cocoa.h>
-
-#import "KVSpaceModel.h"
-#import "types.h"
-
-// Projects depth and color data into 3D space, starting from
-// scratch at each frame and describing only the nearest visible
-// surfaces.
-@interface KVRayFieldSpaceModel : NSObject <KVSpaceModel> {
-  // Memoized linearization function for 12-bit depth samples.
-  float linearizationTable[2048];
-
-  // The actual scene model.  Alarmingly, gcc generates suboptimal
-  // code if we use [480][640].
-  vec3f_t rays[480 * 640];
-  
-  // Normal vectors for each vertex.
-  vec3f_t normals[480 * 640];
-  
-  // The raw RGB samples of the last color image.  These do not
-  // map one-to-one onto rays because the cameras are offset.
-  rgb_t colorImage[480][640];
-  
-  // The raw samples of the last depth image.
-  uint16_t depthImage[480][640];
-}
-
-@end
-
-extern NSString * const KVPolygonMode;
-extern NSString * const KVFilledPolygonMode;
-extern NSString * const KVWireframePolygonMode;
-extern NSString * const KVDottedPolygonMode;

KVRayFieldSpaceModel.m

-/*
- * Copyright 2010 Cliff L. Biffle.  All Rights Reserved.
- * Use of this source code is governed by the Apache License 2.0,
- * which can be found in the LICENSE file.
- */
-
-#import "KVRayFieldSpaceModel.h"
-#import "utility.h"
-
-NSString * const KVPolygonMode = @"KVPolygonMode";
-NSString * const KVFilledPolygonMode = @"KVFilledPolygonMode";
-NSString * const KVWireframePolygonMode = @"KVWireframePolygonMode";
-NSString * const KVDottedPolygonMode = @"KVDottedPolygonMode";
-
-@interface KVRayFieldSpaceModel ()
-- (void) buildLinearizationTable;
-- (void) fillStaticComponents;
-
-@property(assign, nonatomic) double rayCastingTotal;
-@property(assign, nonatomic) NSUInteger rayCastingCount;
-
-@property(assign, nonatomic) double vertexPlacementTotal;
-@property(assign, nonatomic) NSUInteger vertexPlacementCount;
-
-@property GLuint depthTexture;
-
-- (void) renderAsPointsWithOptions: (NSDictionary *) options;
-- (void) renderAsMeshWithOptions: (NSDictionary *) options;
-- (void) renderAsSolidWithOptions: (NSDictionary *) options;
-@end
-
-@implementation KVRayFieldSpaceModel
-
-@synthesize rayCastingCount, rayCastingTotal, vertexPlacementCount, vertexPlacementTotal;
-@synthesize depthTexture;
-
-- init {
-  if ((self = [super init])) {
-    [self fillStaticComponents];
-    [self buildLinearizationTable];
-  }
-  return self;
-}
-
-#pragma mark --- Implementation of KVSpaceModel
-
-- (void) initGL {
-  glGenTextures(1, &depthTexture);
-  glBindTexture(GL_TEXTURE_2D, depthTexture);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
-}
-
-- (void) setDepthSamples: (NSData *)data {
-  NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];
-  
-  const uint16_t *sample = [data bytes];
-  memcpy(&depthImage, sample, sizeof depthImage);
-  
-  // gcc 4.2.1 is not clever enough to turn raster two-dimensional
-  // subscripting (e.g. ray[y][x]) into a single incremented induction
-  // variable -- we wind up doing integer multiplications on every
-  // use!  So, we do it by hand: thus |vidx|.
-  int vidx = 0;
-  
-  // Cast them rays
-  for (int y = 0; y < 480 - 1; y++) {
-    for (int x = 0; x < 640 - 1; x++, vidx++) {
-      rays[vidx].z = sample[vidx];
-      vec3f_t right = {
-        rays[vidx + 1].x,
-        rays[vidx + 1].y,
-        sample[vidx + 1],
-      };
-      vec3f_t down = {
-        rays[vidx + 640].x,
-        rays[vidx + 640].y,
-        sample[vidx + 640],
-      };
-      normals[vidx] = compute_normal(rays[vidx], down, right);
-    }
-  }
-  
-  NSTimeInterval end = [NSDate timeIntervalSinceReferenceDate];
-  rayCastingCount++;
-  rayCastingTotal += end - start;
-  
-  if ((rayCastingCount & 0xF) == 0) {
-    NSLog(@"Raycasting: latest %.03fµs mean %.03fµs",
-          (end - start) * 1000000.,
-          (rayCastingTotal / rayCastingCount) * 1000000.);
-  }
-}
-
-- (void) setColorSamples: (NSData *)data {
-  memcpy(&colorImage, [data bytes], sizeof colorImage);
-}
-
-- (void) drawInCurrentOpenGLContextWithOptions: (NSDictionary *) options {
-  NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];
-
-  glBindTexture(GL_TEXTURE_2D, depthTexture);
-  glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE16, 640, 480, 0, GL_LUMINANCE, GL_UNSIGNED_SHORT, &depthImage);
-  
-  id modeOption = [options valueForKey: KVPolygonMode];
-  if (modeOption == KVWireframePolygonMode) {
-    [self renderAsMeshWithOptions: options];
-  } else if (modeOption == KVDottedPolygonMode) {
-    [self renderAsPointsWithOptions: options];
-  } else {
-    [self renderAsSolidWithOptions: options];
-  }
-  
-  NSTimeInterval end = [NSDate timeIntervalSinceReferenceDate];
-  vertexPlacementCount++;
-  vertexPlacementTotal += end - start;
-  
-  if ((vertexPlacementCount & 0xF) == 0) {
-    NSLog(@"Vertex placement: latest %.03fµs mean %.03fµs",
-          (end - start) * 1000000.,
-          (vertexPlacementTotal / vertexPlacementCount) * 1000000.);
-  }
-  
-}
-
-#pragma mark --- Internals
-
-- (void) renderAsPointsWithOptions: (NSDictionary *) options {
-  glColor3f(1, 1, 1);
-  glNormal3f(0, 0, -1);
-  glEnableClientState(GL_VERTEX_ARRAY);
-  glVertexPointer(3, GL_FLOAT, 0, &rays);
-
-  glEnableClientState(GL_NORMAL_ARRAY);
-  glNormalPointer(GL_FLOAT, 0, &normals);
-  
-  glDrawArrays(GL_POINTS, 0, 640 * 480);
-  
-  glDisableClientState(GL_NORMAL_ARRAY);
-  glDisableClientState(GL_VERTEX_ARRAY);
-}
-
-- (void) renderAsSolidWithOptions: (NSDictionary *) options {
-  int jump = 2;
-  
-  glColor3f(1, 1, 1);
-  glNormal3f(0, 0, 1);
-  
-  int vidx = 0;
-  
-  for (int y = 0; y < 480 - 1; y++) {
-    BOOL inStrip = NO;
-    int lastDepth = (int) rays[vidx].z;
-    for (int x = 0; x < 640; x++, vidx++) {
-      for (int step = 0; step < 640 * 2; step += 640) {
-        int z = (int) rays[vidx + step].z;
-        int delta = z - lastDepth;
-        lastDepth = z;
-        
-        if (delta < -jump || delta > jump || z == 0 || z == 2047) {
-          if (inStrip) {
-            glEnd();
-            inStrip = NO;
-          }
-        } else {
-          if (!inStrip) {
-            glBegin(GL_TRIANGLE_STRIP);
-            inStrip = YES;
-          }
-          glNormal3fv(&normals[vidx + step].x);
-          glVertex3fv(&rays[vidx + step].x);
-        }
-        
-        if (!inStrip) break;
-      }
-    }
-    if (inStrip) glEnd();
-  }
-}
-
-- (void) renderAsMeshWithOptions: (NSDictionary *) options {
-  float jump = 0.1f;
-  
-  glBegin(GL_LINES);
-  glColor3f(1, 1, 1);
-  int vidx = 0;
-  for (int y = 0; y < 480 - 1; y++) {
-    vidx = y * 640;
-    for (int x = 0; x < 640 - 1; x++, vidx++) {
-      float cornerZ = rays[vidx].z;
-      if (cornerZ == 0.f) continue;
-      
-      float delta;
-      
-      delta = cornerZ - rays[vidx + 640].z;
-      if (delta > -jump && delta < jump && delta != cornerZ) {
-        glVertex3fv(&rays[vidx].x);
-        glVertex3fv(&rays[vidx + 640].x);
-      } 
-      
-      delta = cornerZ - rays[vidx + 1].z;
-      if (delta > -jump && delta < jump && delta != cornerZ) {
-        glVertex3fv(&rays[vidx].x);
-        glVertex3fv(&rays[vidx + 1].x);
-      } 
-    }
-  }
-  glEnd();
-}
-
-// The Kinect produces 11-bit depth samples.  Z-resolution decreases
-// with distance, following a curve that looks suspiciously like the
-// one used for perspective projection.  The ROS folks at CCNY derived
-// the equation below, for converting Kinect depth samples to meters.
-// This method memoizes the function over the entire 2048-element
-// domain.  This implies replacing a couple of floating-point constant
-// loads, an addition, and a division with an indirection to very hot
-// memory.  On my machine this eliminates 60% of time spent calculating
-// linear depths.
-- (void) buildLinearizationTable {
-  for (uint16_t depth = 0; depth < 2048; depth++) {
-    linearizationTable[depth] = -325.616F / ((GLfloat) depth + -1084.61F);
-  }
-  
-  // Simplification: when the Kinect reports "no data" for a point
-  // (typically because the IR projector is occluded) the result is
-  // a "very close" reading of nearly zero meters.  All my renderers
-  // filter out such readings, so we coerce it to exactly 0.F here
-  // to simplify that.
-  linearizationTable[0] = 0.F;
-  linearizationTable[2047] = 0.F;
-}
-
-// We pre-fill the X and Y components with distance from the center of
-// the image.  These values never make it to the rasterizer: they are
-// merely input to the vertex shader that performs perspective correction.
-- (void) fillStaticComponents {
-  int vidx = 0;
-  for (int y = 0; y < 480; y++) {
-    for (int x = 0; x < 640; x++, vidx++) {
-      rays[vidx].x = -(float) (x - 320) / 320.f;
-      rays[vidx].y = -(float) (y - 240) / 320.f;
-    }
-  }
-}
-
-@end
+/*
+ * Copyright 2010 Cliff L. Biffle.  All Rights Reserved.
+ * Use of this source code is governed by the Apache License 2.0,
+ * which can be found in the LICENSE file.
+ */
+
+#import <Cocoa/Cocoa.h>
+
+#import "KVSpaceModel.h"
+#import "types.h"
+
+// Projects depth and color data into 3D space, starting from
+// scratch at each frame and describing only the nearest visible
+// surfaces.
+@interface KVRenderer : NSObject <KVSpaceModel> {
+  // Memoized linearization function for 12-bit depth samples.
+  float linearizationTable[2048];
+
+  // The actual scene model.  Alarmingly, gcc generates suboptimal
+  // code if we use [480][640].
+  vec3f_t rays[480 * 640];
+  
+  // Normal vectors for each vertex.
+  vec3f_t normals[480 * 640];
+  
+  // The raw RGB samples of the last color image.  These do not
+  // map one-to-one onto rays because the cameras are offset.
+  rgb_t colorImage[480][640];
+  
+  // The raw samples of the last depth image.
+  uint16_t depthImage[480][640];
+}
+
+@end
+
+extern NSString * const KVPolygonMode;
+extern NSString * const KVFilledPolygonMode;
+extern NSString * const KVWireframePolygonMode;
+extern NSString * const KVDottedPolygonMode;
+/*
+ * Copyright 2010 Cliff L. Biffle.  All Rights Reserved.
+ * Use of this source code is governed by the Apache License 2.0,
+ * which can be found in the LICENSE file.
+ */
+
+#import "KVRenderer.h"
+#import "utility.h"
+
+NSString * const KVPolygonMode = @"KVPolygonMode";
+NSString * const KVFilledPolygonMode = @"KVFilledPolygonMode";
+NSString * const KVWireframePolygonMode = @"KVWireframePolygonMode";
+NSString * const KVDottedPolygonMode = @"KVDottedPolygonMode";
+
+@interface KVRenderer ()
+- (void) buildLinearizationTable;
+- (void) fillStaticComponents;
+
+@property(assign, nonatomic) double rayCastingTotal;
+@property(assign, nonatomic) NSUInteger rayCastingCount;
+
+@property(assign, nonatomic) double vertexPlacementTotal;
+@property(assign, nonatomic) NSUInteger vertexPlacementCount;
+
+@property GLuint depthTexture;
+
+- (void) renderAsPointsWithOptions: (NSDictionary *) options;
+- (void) renderAsMeshWithOptions: (NSDictionary *) options;
+- (void) renderAsSolidWithOptions: (NSDictionary *) options;
+@end
+
+@implementation KVRenderer
+
+@synthesize rayCastingCount, rayCastingTotal, vertexPlacementCount, vertexPlacementTotal;
+@synthesize depthTexture;
+
+- init {
+  if ((self = [super init])) {
+    [self fillStaticComponents];
+    [self buildLinearizationTable];
+  }
+  return self;
+}
+
+#pragma mark --- Implementation of KVSpaceModel
+
+- (void) initGL {
+  glGenTextures(1, &depthTexture);
+  glBindTexture(GL_TEXTURE_2D, depthTexture);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+}
+
+- (void) setDepthSamples: (NSData *)data {
+  NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];
+  
+  const uint16_t *sample = [data bytes];
+  memcpy(&depthImage, sample, sizeof depthImage);
+  
+  // gcc 4.2.1 is not clever enough to turn raster two-dimensional
+  // subscripting (e.g. ray[y][x]) into a single incremented induction
+  // variable -- we wind up doing integer multiplications on every
+  // use!  So, we do it by hand: thus |vidx|.
+  int vidx = 0;
+  
+  // Cast them rays
+  for (int y = 0; y < 480 - 1; y++) {
+    for (int x = 0; x < 640 - 1; x++, vidx++) {
+      rays[vidx].z = sample[vidx];
+      vec3f_t right = {
+        rays[vidx + 1].x,
+        rays[vidx + 1].y,
+        sample[vidx + 1],
+      };
+      vec3f_t down = {
+        rays[vidx + 640].x,
+        rays[vidx + 640].y,
+        sample[vidx + 640],
+      };
+      normals[vidx] = compute_normal(rays[vidx], down, right);
+    }
+  }
+  
+  NSTimeInterval end = [NSDate timeIntervalSinceReferenceDate];
+  rayCastingCount++;
+  rayCastingTotal += end - start;
+  
+  if ((rayCastingCount & 0xF) == 0) {
+    NSLog(@"Raycasting: latest %.03fµs mean %.03fµs",
+          (end - start) * 1000000.,
+          (rayCastingTotal / rayCastingCount) * 1000000.);
+  }
+}
+
+- (void) setColorSamples: (NSData *)data {
+  memcpy(&colorImage, [data bytes], sizeof colorImage);
+}
+
+- (void) drawInCurrentOpenGLContextWithOptions: (NSDictionary *) options {
+  NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate];
+
+  glBindTexture(GL_TEXTURE_2D, depthTexture);
+  glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE16, 640, 480, 0, GL_LUMINANCE, GL_UNSIGNED_SHORT, &depthImage);
+  
+  id modeOption = [options valueForKey: KVPolygonMode];
+  if (modeOption == KVWireframePolygonMode) {
+    [self renderAsMeshWithOptions: options];
+  } else if (modeOption == KVDottedPolygonMode) {
+    [self renderAsPointsWithOptions: options];
+  } else {
+    [self renderAsSolidWithOptions: options];
+  }
+  
+  NSTimeInterval end = [NSDate timeIntervalSinceReferenceDate];
+  vertexPlacementCount++;
+  vertexPlacementTotal += end - start;
+  
+  if ((vertexPlacementCount & 0xF) == 0) {
+    NSLog(@"Vertex placement: latest %.03fµs mean %.03fµs",
+          (end - start) * 1000000.,
+          (vertexPlacementTotal / vertexPlacementCount) * 1000000.);
+  }
+  
+}
+
+#pragma mark --- Internals
+
+- (void) renderAsPointsWithOptions: (NSDictionary *) options {
+  glColor3f(1, 1, 1);
+  glNormal3f(0, 0, -1);
+  glEnableClientState(GL_VERTEX_ARRAY);
+  glVertexPointer(3, GL_FLOAT, 0, &rays);
+
+  glEnableClientState(GL_NORMAL_ARRAY);
+  glNormalPointer(GL_FLOAT, 0, &normals);
+  
+  glDrawArrays(GL_POINTS, 0, 640 * 480);
+  
+  glDisableClientState(GL_NORMAL_ARRAY);
+  glDisableClientState(GL_VERTEX_ARRAY);
+}
+
+- (void) renderAsSolidWithOptions: (NSDictionary *) options {
+  int jump = 2;
+  
+  glColor3f(1, 1, 1);
+  glNormal3f(0, 0, 1);
+  
+  int vidx = 0;
+  
+  for (int y = 0; y < 480 - 1; y++) {
+    BOOL inStrip = NO;
+    int lastDepth = (int) rays[vidx].z;
+    for (int x = 0; x < 640; x++, vidx++) {
+      for (int step = 0; step < 640 * 2; step += 640) {
+        int z = (int) rays[vidx + step].z;
+        int delta = z - lastDepth;
+        lastDepth = z;
+        
+        if (delta < -jump || delta > jump || z == 0 || z == 2047) {
+          if (inStrip) {
+            glEnd();
+            inStrip = NO;
+          }
+        } else {
+          if (!inStrip) {
+            glBegin(GL_TRIANGLE_STRIP);
+            inStrip = YES;
+          }
+          glNormal3fv(&normals[vidx + step].x);
+          glVertex3fv(&rays[vidx + step].x);
+        }
+        
+        if (!inStrip) break;
+      }
+    }
+    if (inStrip) glEnd();
+  }
+}
+
+- (void) renderAsMeshWithOptions: (NSDictionary *) options {
+  float jump = 0.1f;
+  
+  glBegin(GL_LINES);
+  glColor3f(1, 1, 1);
+  int vidx = 0;
+  for (int y = 0; y < 480 - 1; y++) {
+    vidx = y * 640;
+    for (int x = 0; x < 640 - 1; x++, vidx++) {
+      float cornerZ = rays[vidx].z;
+      if (cornerZ == 0.f) continue;
+      
+      float delta;
+      
+      delta = cornerZ - rays[vidx + 640].z;
+      if (delta > -jump && delta < jump && delta != cornerZ) {
+        glVertex3fv(&rays[vidx].x);
+        glVertex3fv(&rays[vidx + 640].x);
+      } 
+      
+      delta = cornerZ - rays[vidx + 1].z;
+      if (delta > -jump && delta < jump && delta != cornerZ) {
+        glVertex3fv(&rays[vidx].x);
+        glVertex3fv(&rays[vidx + 1].x);
+      } 
+    }
+  }
+  glEnd();
+}
+
+// The Kinect produces 11-bit depth samples.  Z-resolution decreases
+// with distance, following a curve that looks suspiciously like the
+// one used for perspective projection.  The ROS folks at CCNY derived
+// the equation below, for converting Kinect depth samples to meters.
+// This method memoizes the function over the entire 2048-element
+// domain.  This implies replacing a couple of floating-point constant
+// loads, an addition, and a division with an indirection to very hot
+// memory.  On my machine this eliminates 60% of time spent calculating
+// linear depths.
+- (void) buildLinearizationTable {
+  for (uint16_t depth = 0; depth < 2048; depth++) {
+    linearizationTable[depth] = -325.616F / ((GLfloat) depth + -1084.61F);
+  }
+  
+  // Simplification: when the Kinect reports "no data" for a point
+  // (typically because the IR projector is occluded) the result is
+  // a "very close" reading of nearly zero meters.  All my renderers
+  // filter out such readings, so we coerce it to exactly 0.F here
+  // to simplify that.
+  linearizationTable[0] = 0.F;
+  linearizationTable[2047] = 0.F;
+}
+
+// We pre-fill the X and Y components with distance from the center of
+// the image.  These values never make it to the rasterizer: they are
+// merely input to the vertex shader that performs perspective correction.
+- (void) fillStaticComponents {
+  int vidx = 0;
+  for (int y = 0; y < 480; y++) {
+    for (int x = 0; x < 640; x++, vidx++) {
+      rays[vidx].x = -(float) (x - 320) / 320.f;
+      rays[vidx].y = -(float) (y - 240) / 320.f;
+    }
+  }
+}
+
+@end

KinectViewer.xcodeproj/project.pbxproj

 		C70E66AA129C9024004A44B3 /* libusb.h in Headers */ = {isa = PBXBuildFile; fileRef = C70E6690129C8FD5004A44B3 /* libusb.h */; };
 		C70E66BB129C906C004A44B3 /* libdriver.a in Frameworks */ = {isa = PBXBuildFile; fileRef = C70E669F129C9005004A44B3 /* libdriver.a */; };
 		C70E66CA129C9121004A44B3 /* libusb-1.0.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = C70E66C9129C9121004A44B3 /* libusb-1.0.dylib */; };
-		C758083412A4C46700391C33 /* KVRayFieldSpaceModel.m in Sources */ = {isa = PBXBuildFile; fileRef = C758083312A4C46700391C33 /* KVRayFieldSpaceModel.m */; };
+		C758083412A4C46700391C33 /* KVRenderer.m in Sources */ = {isa = PBXBuildFile; fileRef = C758083312A4C46700391C33 /* KVRenderer.m */; };
 		C7759B4612A8B2D3003479EF /* KVKinectHardware.m in Sources */ = {isa = PBXBuildFile; fileRef = C7759B4512A8B2D3003479EF /* KVKinectHardware.m */; };
 		C7759C0712A97873003479EF /* KVDepthRecorder.m in Sources */ = {isa = PBXBuildFile; fileRef = C7759C0612A97873003479EF /* KVDepthRecorder.m */; };
 		C7759C1012A97A3B003479EF /* KVDepthPlayer.m in Sources */ = {isa = PBXBuildFile; fileRef = C7759C0F12A97A3B003479EF /* KVDepthPlayer.m */; };
 		C70E669F129C9005004A44B3 /* libdriver.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libdriver.a; sourceTree = BUILT_PRODUCTS_DIR; };
 		C70E66C9129C9121004A44B3 /* libusb-1.0.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = "libusb-1.0.dylib"; path = "usr/local/lib/libusb-1.0.dylib"; sourceTree = SDKROOT; };
 		C758081A12A4C22400391C33 /* KVSpaceModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KVSpaceModel.h; sourceTree = "<group>"; };
-		C758083212A4C46700391C33 /* KVRayFieldSpaceModel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KVRayFieldSpaceModel.h; sourceTree = "<group>"; };
-		C758083312A4C46700391C33 /* KVRayFieldSpaceModel.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KVRayFieldSpaceModel.m; sourceTree = "<group>"; };
+		C758083212A4C46700391C33 /* KVRenderer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KVRenderer.h; sourceTree = "<group>"; };
+		C758083312A4C46700391C33 /* KVRenderer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KVRenderer.m; sourceTree = "<group>"; };
 		C7759B3F12A8B1EB003479EF /* KVDataSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KVDataSource.h; sourceTree = "<group>"; };
 		C7759B4412A8B2D3003479EF /* KVKinectHardware.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = KVKinectHardware.h; sourceTree = "<group>"; };
 		C7759B4512A8B2D3003479EF /* KVKinectHardware.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = KVKinectHardware.m; sourceTree = "<group>"; };
 			isa = PBXGroup;
 			children = (
 				C758081A12A4C22400391C33 /* KVSpaceModel.h */,
-				C758083212A4C46700391C33 /* KVRayFieldSpaceModel.h */,
-				C758083312A4C46700391C33 /* KVRayFieldSpaceModel.m */,
+				C758083212A4C46700391C33 /* KVRenderer.h */,
+				C758083312A4C46700391C33 /* KVRenderer.m */,
 			);
 			name = Model;
 			sourceTree = "<group>";
 				C70E62AF129C5055004A44B3 /* KVDepthView.m in Sources */,
 				C70E635F129C63BE004A44B3 /* trackball.c in Sources */,
 				C70E6691129C8FD5004A44B3 /* KFKinect.m in Sources */,
-				C758083412A4C46700391C33 /* KVRayFieldSpaceModel.m in Sources */,
+				C758083412A4C46700391C33 /* KVRenderer.m in Sources */,
 				C7759B4612A8B2D3003479EF /* KVKinectHardware.m in Sources */,
 				C7759C0712A97873003479EF /* KVDepthRecorder.m in Sources */,
 				C7759C1012A97A3B003479EF /* KVDepthPlayer.m in Sources */,
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.