Roi Atalla avatar Roi Atalla committed cfffbbd

Example 8.3 ported.

Comments (0)

Files changed (19)

src/main/java/com/ra4king/opengl/arcsynthesis/gl33/chapter6/example1/Example6_1.java

 		cameraToClipMatrix.put(11,-1);
 		
 		program.begin();
-		glUniformMatrix4(cameraToClipMatrixUniform, false, cameraToClipMatrix.getBuffer());
+		glUniformMatrix4(cameraToClipMatrixUniform, false, cameraToClipMatrix.toBuffer());
 		program.end();
 		
 		int vbo1 = glGenBuffers();
 		cameraToClipMatrix.put(0,frustumScale / ((float)getWidth() / getHeight()));
 		
 		program.begin();
-		glUniformMatrix4(cameraToClipMatrixUniform, false, cameraToClipMatrix.getBuffer());
+		glUniformMatrix4(cameraToClipMatrixUniform, false, cameraToClipMatrix.toBuffer());
 		program.end();
 	}
 	
 		glBindVertexArray(vao);
 		
 		for(Matrix4 m : modelToCameraMatrices) {
-			glUniformMatrix4(modelToCameraMatrixUniform, false, m.getBuffer());
+			glUniformMatrix4(modelToCameraMatrixUniform, false, m.toBuffer());
 			glDrawElements(GL_TRIANGLES, indices.length, GL_UNSIGNED_SHORT, 0);
 		}
 		

src/main/java/com/ra4king/opengl/arcsynthesis/gl33/chapter6/example2/Example6_2.java

 		cameraToClipMatrix.put(11,-1);
 		
 		program.begin();
-		glUniformMatrix4(cameraToClipMatrixUniform, false, cameraToClipMatrix.getBuffer());
+		glUniformMatrix4(cameraToClipMatrixUniform, false, cameraToClipMatrix.toBuffer());
 		program.end();
 		
 		int vbo1 = glGenBuffers();
 		cameraToClipMatrix.put(0,frustumScale / ((float)getWidth() / getHeight()));
 		
 		program.begin();
-		glUniformMatrix4(cameraToClipMatrixUniform, false, cameraToClipMatrix.getBuffer());
+		glUniformMatrix4(cameraToClipMatrixUniform, false, cameraToClipMatrix.toBuffer());
 		program.end();
 	}
 	
 		glBindVertexArray(vao);
 		
 		for(Matrix4 m : modelToCameraMatrices) {
-			glUniformMatrix4(modelToCameraMatrixUniform, false, m.getBuffer());
+			glUniformMatrix4(modelToCameraMatrixUniform, false, m.toBuffer());
 			glDrawElements(GL_TRIANGLES, indices.length, GL_UNSIGNED_SHORT, 0);
 		}
 		

src/main/java/com/ra4king/opengl/arcsynthesis/gl33/chapter6/example3/Example6_3.java

 		cameraToClipMatrix.put(11,-1);
 		
 		program.begin();
-		glUniformMatrix4(cameraToClipMatrixUniform, false, cameraToClipMatrix.getBuffer());
+		glUniformMatrix4(cameraToClipMatrixUniform, false, cameraToClipMatrix.toBuffer());
 		program.end();
 		
 		int vbo1 = glGenBuffers();
 		cameraToClipMatrix.put(0,frustumScale / ((float)getWidth() / getHeight()));
 		
 		program.begin();
-		glUniformMatrix4(cameraToClipMatrixUniform, false, cameraToClipMatrix.getBuffer());
+		glUniformMatrix4(cameraToClipMatrixUniform, false, cameraToClipMatrix.toBuffer());
 		program.end();
 	}
 	
 		glBindVertexArray(vao);
 		
 		for(Matrix4 m : modelToCameraMatrices) {
-			glUniformMatrix4(modelToCameraMatrixUniform, false, m.getBuffer());
+			glUniformMatrix4(modelToCameraMatrixUniform, false, m.toBuffer());
 			glDrawElements(GL_TRIANGLES, indices.length, GL_UNSIGNED_SHORT, 0);
 		}
 		

src/main/java/com/ra4king/opengl/arcsynthesis/gl33/chapter6/example4/Example6_4.java

 		super.resized();
 		
 		program.begin();
-		glUniformMatrix4(cameraToClipMatrixUniform, false, cameraToClipMatrix.clearToPerspective(45*(float)Math.PI/180, getWidth(), getHeight(), 1, 100).getBuffer());
+		glUniformMatrix4(cameraToClipMatrixUniform, false, cameraToClipMatrix.clearToPerspective(45*(float)Math.PI/180, getWidth(), getHeight(), 1, 100).toBuffer());
 		program.end();
 	}
 	
 				modelToCameraStack.pushMatrix();
 				modelToCameraStack.getTop().translate(posBaseLeft);
 				modelToCameraStack.getTop().scale(new Vector3(1,1,scaleBaseZ));
-				glUniformMatrix4(modelToCameraMatrixUniform, false, modelToCameraStack.getTop().getBuffer());
+				glUniformMatrix4(modelToCameraMatrixUniform, false, modelToCameraStack.getTop().toBuffer());
 				glDrawElements(GL_TRIANGLES, indices.length, GL_UNSIGNED_SHORT, 0);
 				modelToCameraStack.popMatrix();
 			}
 				modelToCameraStack.pushMatrix();
 				modelToCameraStack.getTop().translate(posBaseRight);
 				modelToCameraStack.getTop().scale(new Vector3(1,1,scaleBaseZ));
-				glUniformMatrix4(modelToCameraMatrixUniform, false, modelToCameraStack.getTop().getBuffer());
+				glUniformMatrix4(modelToCameraMatrixUniform, false, modelToCameraStack.getTop().toBuffer());
 				glDrawElements(GL_TRIANGLES, indices.length, GL_UNSIGNED_SHORT, 0);
 				modelToCameraStack.popMatrix();
 			}
 			modelToCameraStack.pushMatrix();
 			modelToCameraStack.getTop().translate(new Vector3(0,0,lenFinger/2));
 			modelToCameraStack.getTop().scale(new Vector3(widthFinger/2,widthFinger/2,lenFinger/2));
-			glUniformMatrix4(modelToCameraMatrixUniform,false,modelToCameraStack.getTop().getBuffer());
+			glUniformMatrix4(modelToCameraMatrixUniform,false,modelToCameraStack.getTop().toBuffer());
 			glDrawElements(GL_TRIANGLES, indices.length, GL_UNSIGNED_SHORT, 0);
 			modelToCameraStack.popMatrix();
 			
 				modelToCameraStack.pushMatrix();
 				modelToCameraStack.getTop().translate(new Vector3(0,0,lenFinger/2));
 				modelToCameraStack.getTop().scale(new Vector3(widthFinger/2,widthFinger/2,lenFinger/2));
-				glUniformMatrix4(modelToCameraMatrixUniform,false,modelToCameraStack.getTop().getBuffer());
+				glUniformMatrix4(modelToCameraMatrixUniform,false,modelToCameraStack.getTop().toBuffer());
 				glDrawElements(GL_TRIANGLES, indices.length, GL_UNSIGNED_SHORT, 0);
 				modelToCameraStack.popMatrix();
 				
 			modelToCameraStack.pushMatrix();
 			modelToCameraStack.getTop().translate(new Vector3(0,0,lenFinger/2));
 			modelToCameraStack.getTop().scale(new Vector3(widthFinger/2,widthFinger/2,lenFinger/2));
-			glUniformMatrix4(modelToCameraMatrixUniform,false,modelToCameraStack.getTop().getBuffer());
+			glUniformMatrix4(modelToCameraMatrixUniform,false,modelToCameraStack.getTop().toBuffer());
 			glDrawElements(GL_TRIANGLES, indices.length, GL_UNSIGNED_SHORT, 0);
 			modelToCameraStack.popMatrix();
 			
 				modelToCameraStack.pushMatrix();
 				modelToCameraStack.getTop().translate(new Vector3(0,0,lenFinger/2));
 				modelToCameraStack.getTop().scale(new Vector3(widthFinger/2,widthFinger/2,lenFinger/2));
-				glUniformMatrix4(modelToCameraMatrixUniform,false,modelToCameraStack.getTop().getBuffer());
+				glUniformMatrix4(modelToCameraMatrixUniform,false,modelToCameraStack.getTop().toBuffer());
 				glDrawElements(GL_TRIANGLES, indices.length, GL_UNSIGNED_SHORT, 0);
 				modelToCameraStack.popMatrix();
 				
 			
 			modelToCameraStack.pushMatrix();
 			modelToCameraStack.getTop().scale(new Vector3(widthWrist/2,widthWrist/2,lenWrist/2));
-			glUniformMatrix4(modelToCameraMatrixUniform,false,modelToCameraStack.getTop().getBuffer());
+			glUniformMatrix4(modelToCameraMatrixUniform,false,modelToCameraStack.getTop().toBuffer());
 			glDrawElements(GL_TRIANGLES,indices.length,GL_UNSIGNED_SHORT,0);
 			modelToCameraStack.popMatrix();
 			
 			modelToCameraStack.pushMatrix();
 			modelToCameraStack.getTop().translate(new Vector3(0,0,lenLowerArm/2));
 			modelToCameraStack.getTop().scale(new Vector3(widthLowerArm/2,widthLowerArm/2,lenLowerArm/2));
-			glUniformMatrix4(modelToCameraMatrixUniform,false,modelToCameraStack.getTop().getBuffer());
+			glUniformMatrix4(modelToCameraMatrixUniform,false,modelToCameraStack.getTop().toBuffer());
 			glDrawElements(GL_TRIANGLES,indices.length,GL_UNSIGNED_SHORT,0);
 			modelToCameraStack.popMatrix();
 			
 				modelToCameraStack.pushMatrix();
 				modelToCameraStack.getTop().translate(new Vector3(0,0,(sizeUpperArm/2)-1));
 				modelToCameraStack.getTop().scale(new Vector3(1,1,sizeUpperArm/2));
-				glUniformMatrix4(modelToCameraMatrixUniform,false,modelToCameraStack.getTop().getBuffer());
+				glUniformMatrix4(modelToCameraMatrixUniform,false,modelToCameraStack.getTop().toBuffer());
 				glDrawElements(GL_TRIANGLES, indices.length, GL_UNSIGNED_SHORT, 0);
 				modelToCameraStack.popMatrix();
 			}

src/main/java/com/ra4king/opengl/arcsynthesis/gl33/chapter7/example1/Example7_1.java

 		perspectiveMatrix.clearToPerspective(45*(float)Math.PI/180, getWidth(), getHeight(), 1, 1000);
 		
 		uniformColor.program.begin();
-		glUniformMatrix4(uniformColor.cameraToClipMatrixUniform,false,perspectiveMatrix.getBuffer());
+		glUniformMatrix4(uniformColor.cameraToClipMatrixUniform,false,perspectiveMatrix.toBuffer());
 		objectColor.program.begin();
-		glUniformMatrix4(objectColor.cameraToClipMatrixUniform,false,perspectiveMatrix.getBuffer());
+		glUniformMatrix4(objectColor.cameraToClipMatrixUniform,false,perspectiveMatrix.toBuffer());
 		uniformColorTint.program.begin();
-		glUniformMatrix4(uniformColorTint.cameraToClipMatrixUniform,false,perspectiveMatrix.getBuffer());
+		glUniformMatrix4(uniformColorTint.cameraToClipMatrixUniform,false,perspectiveMatrix.toBuffer());
 		uniformColorTint.program.end();
 	}
 	
 		camMatrix.setTop(calcLookAtMatrix(camPos, camTarget, new Vector3(0,1,0)));
 		
 		uniformColor.program.begin();
-		glUniformMatrix4(uniformColor.worldToCameraMatrixUniform,false,camMatrix.getTop().getBuffer());
+		glUniformMatrix4(uniformColor.worldToCameraMatrixUniform,false,camMatrix.getTop().toBuffer());
 		objectColor.program.begin();
-		glUniformMatrix4(objectColor.worldToCameraMatrixUniform,false,camMatrix.getTop().getBuffer());
+		glUniformMatrix4(objectColor.worldToCameraMatrixUniform,false,camMatrix.getTop().toBuffer());
 		uniformColorTint.program.begin();
-		glUniformMatrix4(uniformColorTint.worldToCameraMatrixUniform,false,camMatrix.getTop().getBuffer());
+		glUniformMatrix4(uniformColorTint.worldToCameraMatrixUniform,false,camMatrix.getTop().toBuffer());
 		uniformColorTint.program.end();
 		
 		MatrixStack modelMatrix = new MatrixStack();
 			modelMatrix.getTop().scale(100, 1, 100);
 			
 			uniformColor.program.begin();
-			glUniformMatrix4(uniformColor.modelToWorldMatrixUniform,false,modelMatrix.getTop().getBuffer());
+			glUniformMatrix4(uniformColor.modelToWorldMatrixUniform,false,modelMatrix.getTop().toBuffer());
 			glUniform4f(uniformColor.baseColorUniform,0.302f,0.416f,0.0589f,1.0f);
 			planeMesh.render();
 			uniformColor.program.end();
 			modelMatrix.getTop().translate(0, 0, -new Vector3(camTarget).sub(camPos).length()).scale(1,1,1);
 			
 			objectColor.program.begin();
-			glUniformMatrix4(objectColor.modelToWorldMatrixUniform, false, modelMatrix.getTop().getBuffer());
-			glUniformMatrix4(objectColor.worldToCameraMatrixUniform, false, identity.getBuffer());
+			glUniformMatrix4(objectColor.modelToWorldMatrixUniform, false, modelMatrix.getTop().toBuffer());
+			glUniformMatrix4(objectColor.worldToCameraMatrixUniform, false, identity.toBuffer());
 			cubeColorMesh.render();
 			objectColor.program.end();
 			
 		modelMatrix.getTop().scale(1,trunkHeight,1).translate(0,0.5f,0);
 		
 		uniformColorTint.program.begin();
-		glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().getBuffer());
+		glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().toBuffer());
 		glUniform4f(uniformColorTint.baseColorUniform, 0.694f, 0.4f, 0.106f, 1);
 		cylinderMesh.render();
 		uniformColorTint.program.end();
 		modelMatrix.getTop().translate(0,trunkHeight,0).scale(3,coneHeight,3);
 		
 		uniformColorTint.program.begin();
-		glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().getBuffer());
+		glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().toBuffer());
 		glUniform4f(uniformColorTint.baseColorUniform, 0, 1, 0, 1);
 		coneMesh.render();
 		uniformColorTint.program.end();
 			modelMatrix.getTop().scale(parthenonWidth,parthenonBaseHeight,parthenonLength).translate(0,0.5f,0);
 			
 			uniformColorTint.program.begin();
-			glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().getBuffer());
+			glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().toBuffer());
 			glUniform4f(uniformColorTint.baseColorUniform, 0.9f, 0.9f, 0.9f, 0.9f);
 			cubeTintMesh.render();
 			uniformColorTint.program.end();
 								.translate(0,0.5f,0);
 			
 			uniformColorTint.program.begin();
-			glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().getBuffer());
+			glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().toBuffer());
 			glUniform4f(uniformColorTint.baseColorUniform, 0.9f, 0.9f, 0.9f, 0.9f);
 			cubeTintMesh.render();
 			uniformColorTint.program.end();
 			modelMatrix.getTop().translate(0,1,0).scale(parthenonWidth-6, parthenonColumnHeight, parthenonLength-6).translate(0,0.5f,0);
 			
 			objectColor.program.begin();
-			glUniformMatrix4(objectColor.modelToWorldMatrixUniform, false, modelMatrix.getTop().getBuffer());
+			glUniformMatrix4(objectColor.modelToWorldMatrixUniform, false, modelMatrix.getTop().toBuffer());
 			cubeColorMesh.render();
 			objectColor.program.end();
 			
 								.rotate(45*(float)Math.PI/180, 0, 1, 0);
 			
 			objectColor.program.begin();
-			glUniformMatrix4(objectColor.modelToWorldMatrixUniform, false, modelMatrix.getTop().getBuffer());
+			glUniformMatrix4(objectColor.modelToWorldMatrixUniform, false, modelMatrix.getTop().toBuffer());
 			cubeColorMesh.render();
 			objectColor.program.end();
 
 			modelMatrix.getTop().scale(1, columnBaseHeight, 1).translate(0,0.5f,0);
 			
 			uniformColorTint.program.begin();
-			glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().getBuffer());
+			glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().toBuffer());
 			glUniform4f(uniformColorTint.baseColorUniform, 1, 1, 1, 1);
 			cubeTintMesh.render();
 			uniformColorTint.program.end();
 			modelMatrix.getTop().translate(0, parthenonColumnHeight - columnBaseHeight, 0).scale(1,columnBaseHeight,1).translate(0,0.5f,0);
 			
 			uniformColorTint.program.begin();
-			glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().getBuffer());
+			glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().toBuffer());
 			glUniform4f(uniformColorTint.baseColorUniform, 0.9f, 0.9f, 0.9f, 0.9f);
 			cubeTintMesh.render();
 			uniformColorTint.program.end();
 			modelMatrix.getTop().translate(0, columnBaseHeight, 0).scale(0.8f,  parthenonColumnHeight - columnBaseHeight*2,  0.8f).translate(0,0.5f,0);
 			
 			uniformColorTint.program.begin();
-			glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().getBuffer());
+			glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().toBuffer());
 			glUniform4f(uniformColorTint.baseColorUniform, 0.9f, 0.9f, 0.9f, 0.9f);
 			cylinderMesh.render();
 			uniformColorTint.program.end();

src/main/java/com/ra4king/opengl/arcsynthesis/gl33/chapter7/example2/Example7_2.java

 		perspectiveMatrix.clearToPerspective(45*(float)Math.PI/180, getWidth(), getHeight(), 1, 1000);
 		
 		glBindBuffer(GL_UNIFORM_BUFFER, ubo);
-		glBufferSubData(GL_UNIFORM_BUFFER, 0, perspectiveMatrix.getBuffer());
+		glBufferSubData(GL_UNIFORM_BUFFER, 0, perspectiveMatrix.toBuffer());
 		glBindBuffer(GL_UNIFORM_BUFFER, 0);
 	}
 	
 		camMatrix.setTop(calcLookAtMatrix(camPos, camTarget, new Vector3(0,1,0)));
 		
 		glBindBuffer(GL_UNIFORM_BUFFER, ubo);
-		glBufferSubData(GL_UNIFORM_BUFFER, 16 * 4, camMatrix.getTop().getBuffer());
+		glBufferSubData(GL_UNIFORM_BUFFER, 16 * 4, camMatrix.getTop().toBuffer());
 		glBindBuffer(GL_UNIFORM_BUFFER, 0);
 		
 		MatrixStack modelMatrix = new MatrixStack();
 			modelMatrix.getTop().scale(100, 1, 100);
 			
 			uniformColor.program.begin();
-			glUniformMatrix4(uniformColor.modelToWorldMatrixUniform,false,modelMatrix.getTop().getBuffer());
+			glUniformMatrix4(uniformColor.modelToWorldMatrixUniform,false,modelMatrix.getTop().toBuffer());
 			glUniform4f(uniformColor.baseColorUniform,0.302f,0.416f,0.0589f,1.0f);
 			planeMesh.render();
 			uniformColor.program.end();
 			modelMatrix.getTop().translate(camTarget).scale(1,1,1);
 			
 			objectColor.program.begin();
-			glUniformMatrix4(objectColor.modelToWorldMatrixUniform, false, modelMatrix.getTop().getBuffer());
+			glUniformMatrix4(objectColor.modelToWorldMatrixUniform, false, modelMatrix.getTop().toBuffer());
 			cubeColorMesh.render();
 			objectColor.program.end();
 			
 		modelMatrix.getTop().scale(1,trunkHeight,1).translate(0,0.5f,0);
 		
 		uniformColorTint.program.begin();
-		glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().getBuffer());
+		glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().toBuffer());
 		glUniform4f(uniformColorTint.baseColorUniform, 0.694f, 0.4f, 0.106f, 1);
 		cylinderMesh.render();
 		uniformColorTint.program.end();
 		modelMatrix.getTop().translate(0,trunkHeight,0).scale(3,coneHeight,3);
 		
 		uniformColorTint.program.begin();
-		glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().getBuffer());
+		glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().toBuffer());
 		glUniform4f(uniformColorTint.baseColorUniform, 0, 1, 0, 1);
 		coneMesh.render();
 		uniformColorTint.program.end();
 			modelMatrix.getTop().scale(parthenonWidth,parthenonBaseHeight,parthenonLength).translate(0,0.5f,0);
 			
 			uniformColorTint.program.begin();
-			glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().getBuffer());
+			glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().toBuffer());
 			glUniform4f(uniformColorTint.baseColorUniform, 0.9f, 0.9f, 0.9f, 0.9f);
 			cubeTintMesh.render();
 			uniformColorTint.program.end();
 								.translate(0,0.5f,0);
 			
 			uniformColorTint.program.begin();
-			glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().getBuffer());
+			glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().toBuffer());
 			glUniform4f(uniformColorTint.baseColorUniform, 0.9f, 0.9f, 0.9f, 0.9f);
 			cubeTintMesh.render();
 			uniformColorTint.program.end();
 			modelMatrix.getTop().translate(0,1,0).scale(parthenonWidth-6, parthenonColumnHeight, parthenonLength-6).translate(0,0.5f,0);
 			
 			objectColor.program.begin();
-			glUniformMatrix4(objectColor.modelToWorldMatrixUniform, false, modelMatrix.getTop().getBuffer());
+			glUniformMatrix4(objectColor.modelToWorldMatrixUniform, false, modelMatrix.getTop().toBuffer());
 			cubeColorMesh.render();
 			objectColor.program.end();
 			
 								.rotate(45*(float)Math.PI/180, 0, 1, 0);
 			
 			objectColor.program.begin();
-			glUniformMatrix4(objectColor.modelToWorldMatrixUniform, false, modelMatrix.getTop().getBuffer());
+			glUniformMatrix4(objectColor.modelToWorldMatrixUniform, false, modelMatrix.getTop().toBuffer());
 			cubeColorMesh.render();
 			objectColor.program.end();
 
 			modelMatrix.getTop().scale(1, columnBaseHeight, 1).translate(0,0.5f,0);
 			
 			uniformColorTint.program.begin();
-			glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().getBuffer());
+			glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().toBuffer());
 			glUniform4f(uniformColorTint.baseColorUniform, 1, 1, 1, 1);
 			cubeTintMesh.render();
 			uniformColorTint.program.end();
 			modelMatrix.getTop().translate(0, parthenonColumnHeight - columnBaseHeight, 0).scale(1,columnBaseHeight,1).translate(0,0.5f,0);
 			
 			uniformColorTint.program.begin();
-			glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().getBuffer());
+			glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().toBuffer());
 			glUniform4f(uniformColorTint.baseColorUniform, 0.9f, 0.9f, 0.9f, 0.9f);
 			cubeTintMesh.render();
 			uniformColorTint.program.end();
 			modelMatrix.getTop().translate(0, columnBaseHeight, 0).scale(0.8f,  parthenonColumnHeight - columnBaseHeight*2,  0.8f).translate(0,0.5f,0);
 			
 			uniformColorTint.program.begin();
-			glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().getBuffer());
+			glUniformMatrix4(uniformColorTint.modelToWorldMatrixUniform, false, modelMatrix.getTop().toBuffer());
 			glUniform4f(uniformColorTint.baseColorUniform, 0.9f, 0.9f, 0.9f, 0.9f);
 			cylinderMesh.render();
 			uniformColorTint.program.end();

src/main/java/com/ra4king/opengl/arcsynthesis/gl33/chapter8/example1/Example8_1.java

 		cameraToClipMatrix.clearToPerspective(20*(float)Math.PI/180, getWidth(), getHeight(), 1, 600);
 		
 		program.begin();
-		glUniformMatrix4(cameraToClipMatrixUniform, false, cameraToClipMatrix.getBuffer());
+		glUniformMatrix4(cameraToClipMatrixUniform, false, cameraToClipMatrix.toBuffer());
 		program.end();
 	}
 	
 		program.begin();
 		stack.getTop().scale(3, 3, 3).rotateDeg(-90, 1, 0, 0);
 		glUniform4f(baseColorUniform, 1, 1, 1, 1);
-		glUniformMatrix4(modelToCameraMatrixUniform, false, stack.getTop().getBuffer());
+		glUniformMatrix4(modelToCameraMatrixUniform, false, stack.getTop().toBuffer());
 		ship.render("tint");
 		program.end();
 	}
 		
 		program.begin();
 		glUniform4f(baseColorUniform, r, b, g, 1);
-		glUniformMatrix4(modelToCameraMatrixUniform, false, stack.getTop().getBuffer());
+		glUniformMatrix4(modelToCameraMatrixUniform, false, stack.getTop().toBuffer());
 		gimbals[axis.ordinal()].render();
 		program.end();
 		

src/main/java/com/ra4king/opengl/arcsynthesis/gl33/chapter8/example1/example8.1.Ship.xml

 		<source attrib="1" />
 	</vao>
 	<arrays cmd="triangles" start="0" count="336" />
-</mesh>
+</mesh>

src/main/java/com/ra4king/opengl/arcsynthesis/gl33/chapter8/example2/Example8_2.java

 		super.resized();
 		
 		program.begin();
-		glUniformMatrix4(cameraToClipMatrixUniform, false, new Matrix4().clearToPerspectiveDeg(20, getWidth(), getHeight(), 1, 600).getBuffer());
+		glUniformMatrix4(cameraToClipMatrixUniform, false, new Matrix4().clearToPerspectiveDeg(20, getWidth(), getHeight(), 1, 600).toBuffer());
 		program.end();
 	}
 	
 		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 		
 		MatrixStack stack = new MatrixStack();
-		stack.getTop().translate(0, 0, -200).mult(orientation.getMatrix()).scale(3, 3, 3).rotateDeg(-90, 1, 0, 0);
+		stack.getTop().translate(0, 0, -200).mult(orientation.toMatrix()).scale(3, 3, 3).rotateDeg(-90, 1, 0, 0);
 		
 		program.begin();
 		glUniform4f(baseColorUniform, 1, 1, 1, 1);
-		glUniformMatrix4(modelToClipMatrixUniform, false, stack.getTop().getBuffer());
+		glUniformMatrix4(modelToClipMatrixUniform, false, stack.getTop().toBuffer());
 		ship.render("tint");
 		program.end();
 	}

src/main/java/com/ra4king/opengl/arcsynthesis/gl33/chapter8/example2/example8.2.Ship.xml

 		<source attrib="1" />
 	</vao>
 	<arrays cmd="triangles" start="0" count="336" />
-</mesh>
+</mesh>

src/main/java/com/ra4king/opengl/arcsynthesis/gl33/chapter8/example3/Example8_3.java

 package com.ra4king.opengl.arcsynthesis.gl33.chapter8.example3;
 
+import static org.lwjgl.opengl.GL11.*;
+import static org.lwjgl.opengl.GL20.*;
+
+import org.lwjgl.input.Keyboard;
+
 import com.ra4king.opengl.GLProgram;
+import com.ra4king.opengl.util.Mesh;
+import com.ra4king.opengl.util.ShaderProgram;
+import com.ra4king.opengl.util.math.Matrix4;
+import com.ra4king.opengl.util.math.MatrixStack;
+import com.ra4king.opengl.util.math.Quaternion;
+import com.ra4king.opengl.util.math.Vector3;
 
 public class Example8_3 extends GLProgram {
 	public static void main(String[] args) {
 		new Example8_3().run(true);
 	}
 	
+	private enum OffsetRelative {
+		MODEL_RELATIVE,
+		WORLD_RELATIVE,
+		CAMERA_RELATIVE
+	}
+	
+	private ShaderProgram program;
+	
+	private int modelToCameraMatrixUniform;
+	private int cameraToClipMatrixUniform;
+	private int baseColorUniform;
+	
+	private Mesh ship, plane;
+	
+	private Quaternion orientation;
+	private Vector3 camTarget, sphereCamRelPos;
+	
+	private OffsetRelative offsetRelative = OffsetRelative.MODEL_RELATIVE;
+	
 	public Example8_3() {
 		super("Example 8.3", 500, 500, true);
 	}
 	
 	@Override
 	public void init() {
+		glClearColor(0,0,0,0);
+		glClearDepth(1);
 		
+		program = new ShaderProgram(readFromFile("example8.3.vert"), readFromFile("example8.3.frag"));
+		
+		modelToCameraMatrixUniform = glGetUniformLocation(program.getProgram(), "modelToCameraMatrix");
+		cameraToClipMatrixUniform = glGetUniformLocation(program.getProgram(), "cameraToClipMatrix");
+		baseColorUniform = glGetUniformLocation(program.getProgram(), "baseColor");
+		
+		try {
+			ship = new Mesh(getClass().getResource("example8.3.Ship.xml"));
+			plane = new Mesh(getClass().getResource("example8.3.plane.xml"));
+		}
+		catch(Exception exc) {
+			exc.printStackTrace();
+			destroy();
+		}
+		
+		orientation = new Quaternion();
+		camTarget = new Vector3(0, 10, 0);
+		sphereCamRelPos = new Vector3(90, 0, 66);
+		
+		glEnable(GL_CULL_FACE);
+		glCullFace(GL_BACK);
+		glFrontFace(GL_CW);
+		
+		glEnable(GL_DEPTH_TEST);
+		glDepthMask(true);
+		glDepthFunc(GL_LEQUAL);
+		glDepthRange(0, 1);
 	}
 	
 	@Override
 	public void resized() {
 		super.resized();
 		
+		program.begin();
+		glUniformMatrix4(cameraToClipMatrixUniform, false, new Matrix4().clearToPerspectiveDeg(20, getWidth(), getHeight(), 1, 600).toBuffer());
+		program.end();
+	}
+	
+	private void offsetOrientation(Vector3 axis, float angle) {
+		angle = angle * (float)Math.PI / 180;
 		
+		axis.normalize().mult((float)Math.sin(angle/2));
+		
+		Quaternion offset = new Quaternion(axis.x(), axis.y(), axis.z(), (float)Math.cos(angle/2));
+		
+		switch(offsetRelative) {
+			case MODEL_RELATIVE:
+				orientation.mult(offset);
+				break;
+			case WORLD_RELATIVE:
+				orientation = offset.mult(orientation);
+				break;
+			case CAMERA_RELATIVE:
+				Matrix4 camMat = calcLookAtMatrix(resolveCamPosition(), camTarget, new Vector3(0,1,0));
+				Quaternion viewQuat = camMat.toQuaternion();
+				orientation = new Quaternion(viewQuat).conjugate().mult(offset).mult(viewQuat).mult(orientation);
+				break;
+		}
+		
+		orientation.normalize();
+	}
+	
+	private float clamp(float value, float low, float high) {
+		return Math.min(Math.max(value, low), high);
+	}
+	
+	@Override
+	public void update(long deltaTime) {
+		float speed = 90 * deltaTime / (float)1e9;
+		
+		if(Keyboard.isKeyDown(Keyboard.KEY_W))
+			offsetOrientation(new Vector3(1, 0, 0), speed);
+		if(Keyboard.isKeyDown(Keyboard.KEY_S))
+			offsetOrientation(new Vector3(1, 0, 0), -speed);
+		
+		if(Keyboard.isKeyDown(Keyboard.KEY_A))
+			offsetOrientation(new Vector3(0, 0, 1), speed);
+		if(Keyboard.isKeyDown(Keyboard.KEY_D))
+			offsetOrientation(new Vector3(0, 0, 1), -speed);
+		
+		if(Keyboard.isKeyDown(Keyboard.KEY_Q))
+			offsetOrientation(new Vector3(0, 1, 0), speed);
+		if(Keyboard.isKeyDown(Keyboard.KEY_E))
+			offsetOrientation(new Vector3(0, 1, 0), -speed);
+		
+		speed = (Keyboard.isKeyDown(Keyboard.KEY_LSHIFT) ? 11.25f : 112.5f) * deltaTime / (float)1e9;
+		
+		if(Keyboard.isKeyDown(Keyboard.KEY_I))
+			sphereCamRelPos.sub(0, speed, 0);
+		if(Keyboard.isKeyDown(Keyboard.KEY_K))
+			sphereCamRelPos.add(0, speed, 0);
+		if(Keyboard.isKeyDown(Keyboard.KEY_J))
+			sphereCamRelPos.sub(speed, 0, 0);
+		if(Keyboard.isKeyDown(Keyboard.KEY_L))
+			sphereCamRelPos.add(speed, 0, 0);
+		
+		sphereCamRelPos.y(clamp(sphereCamRelPos.y(), -78.75f, 10));
+	}
+	
+	private Vector3 resolveCamPosition() {
+		float phi = sphereCamRelPos.x() * (float)Math.PI / 180;
+		float theta = (sphereCamRelPos.y() + 90) * (float)Math.PI / 180;
+		
+		float sinTheta = (float)Math.sin(theta);
+		float cosTheta = (float)Math.cos(theta);
+		float cosPhi = (float)Math.cos(phi);
+		float sinPhi = (float)Math.sin(phi);
+		
+		return new Vector3(sinTheta * cosPhi, cosTheta, sinTheta * sinPhi).mult(sphereCamRelPos.z()).add(camTarget);
+	}
+	
+	private Matrix4 calcLookAtMatrix(Vector3 cameraPoint, Vector3 lookPoint, Vector3 upPoint) {
+		Vector3 lookDir = new Vector3(lookPoint).sub(cameraPoint).normalize();
+		Vector3 upDir = upPoint.normalize();
+		
+		Vector3 rightDir = lookDir.cross(upDir).normalize();
+		Vector3 perpUpDir = rightDir.cross(lookDir);
+		
+		Matrix4 rotMat = new Matrix4().clearToIdentity();
+		rotMat.put(0, rightDir);
+		rotMat.put(1, perpUpDir);
+		rotMat.put(2, lookDir.mult(-1));
+		
+		return rotMat.transpose().translate(cameraPoint.mult(-1));
 	}
 	
 	@Override
 	public void render() {
+		glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 		
+		MatrixStack stack = new MatrixStack();
+		stack.setTop(calcLookAtMatrix(resolveCamPosition(), camTarget, new Vector3(0,1,0)));
+		
+		program.begin();
+		
+		{
+			stack.pushMatrix();
+			stack.getTop().scale(100, 1, 100);
+			
+			glUniform4f(baseColorUniform, 0.2f, 0.5f, 0.2f, 1);
+			glUniformMatrix4(modelToCameraMatrixUniform, false, stack.getTop().toBuffer());
+			
+			plane.render();
+			
+			stack.popMatrix();
+		}
+		
+		{
+			stack.pushMatrix();
+			stack.getTop().translate(camTarget).mult(orientation.toMatrix()).rotateDeg(-90, 1, 0, 0);
+			
+			glUniform4f(baseColorUniform, 1, 1, 1, 1);
+			glUniformMatrix4(modelToCameraMatrixUniform, false, stack.getTop().toBuffer());
+			
+			ship.render("tint");
+			
+			stack.popMatrix();
+		}
+		
+		program.end();
 	}
 }

src/main/java/com/ra4king/opengl/arcsynthesis/gl33/chapter8/example3/example8.3.Plane.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<?oxygen RNGSchema="../../Documents/meshFormat.rnc" type="compact"?>
+
+<mesh xmlns="http://www.arcsynthesis.com/gltut/mesh" >
+	<attribute index="0" type="float" size="3" > 
+		0.5 0 -0.5
+		0.5 0 0.5
+		-0.5 0 0.5
+		-0.5 0 -0.5
+	</attribute>
+	<attribute index="1" type="float" size="4" > 
+		1 1 1 1
+		1 1 1 1
+		1 1 1 1
+		1 1 1 1
+	</attribute>
+	<indices cmd="triangles" type="ushort" > 
+		0 1 2
+		0 2 1
+		2 3 0
+		2 0 3
+	</indices>
+</mesh>

src/main/java/com/ra4king/opengl/arcsynthesis/gl33/chapter8/example3/example8.3.Ship.xml

+<?xml version="1.0" encoding="UTF-8"?>
+<?oxygen RNGSchema="../../Documents/meshFormat.rnc" type="compact"?>
+
+<mesh xmlns="http://www.arcsynthesis.com/gltut/mesh" >
+	<attribute index="0" type="float" size="3" >
+		0 0 5.486261 
+		0 1 4.091465 
+		0.7365548 0.7365548 4.091465 
+		-0.7365548 0.7365548 4.091465 
+		0 1 4.091465 
+		0 0 5.486261 
+		0.7365548 0.7365548 4.091465 
+		0.8 0 5.091465 
+		0 0 5.486261 
+		-0.7365548 0.7365548 4.091465 
+		0 0 5.486261 
+		-0.8 0 5.091465 
+		1 0 4.091465 
+		0.8 0 5.091465 
+		0.7365548 0.7365548 4.091465 
+		-0.7365548 0.7365548 4.091465 
+		-0.8 0 5.091465 
+		-1 0 4.091465 
+		0 0 4.091465 
+		0.8 0 5.091465 
+		1 0 4.091465 
+		-1 0 4.091465 
+		-0.8 0 5.091465 
+		0 0 4.091465 
+		0 0 4.091465 
+		0 0 5.486261 
+		0.8 0 5.091465 
+		-0.8 0 5.091465 
+		0 0 5.486261 
+		0 0 4.091465 
+		-0.7365548 0.7365548 4.091465 
+		-0.7365548 0.7365548 4.091465 
+		0 1 4.091465 
+		-0.7365548 0.7365548 4.091465 
+		-0.7365548 0.7365548 4.091465 
+		-1 0 4.091465 
+		0 1.845113 -1.908402 
+		1.188213 1.188213 -1.908402 
+		0 1 4.091465 
+		0 1 4.091465 
+		-1.188213 1.188213 -1.908402 
+		0 1.845113 -1.908402 
+		0.7365548 0.7365548 4.091465 
+		1.094106 0.5941064 1.091532 
+		1 0 4.091465 
+		-1 0 4.091465 
+		-1.094106 0.5941064 1.091532 
+		-0.7365548 0.7365548 4.091465 
+		1.516663 0.2699136 -1.908402 
+		1.094106 0.5941064 1.091532 
+		1.188213 1.188213 -1.908402 
+		-1.188213 1.188213 -1.908402 
+		-1.094106 0.5941064 1.091532 
+		-1.516663 0.2699136 -1.908402 
+		1.845113 -0.6483857 -1.908402 
+		1.422557 -0.3241928 1.091532 
+		1.516663 0.2699136 -1.908402 
+		-1.516663 0.2699136 -1.908402 
+		-1.422557 -0.3241928 1.091532 
+		-1.845113 -0.6483857 -1.908402 
+		1.094106 0.5941064 1.091532 
+		1.516663 0.2699136 -1.908402 
+		2.904993 0.4069349 -0.2403131 
+		-2.904993 0.4069349 -0.2403131 
+		-1.516663 0.2699136 -1.908402 
+		-1.094106 0.5941064 1.091532 
+		1.094106 0.5941064 1.091532 
+		2.904993 0.4069349 -0.2403131 
+		2.755336 0.5183109 1.252996 
+		-2.755336 0.5183109 1.252996 
+		-2.904993 0.4069349 -0.2403131 
+		-1.094106 0.5941064 1.091532 
+		1.516663 0.2699136 -1.908402 
+		3.05465 0.1929539 -1.733622 
+		2.904993 0.4069349 -0.2403131 
+		-2.904993 0.4069349 -0.2403131 
+		-3.05465 0.1929539 -1.733622 
+		-1.516663 0.2699136 -1.908402 
+		1.516663 0.2699136 -1.908402 
+		1.422557 -0.3241928 1.091532 
+		2.902689 -0.03290349 -0.2282143 
+		-2.902689 -0.03290349 -0.2282143 
+		-1.422557 -0.3241928 1.091532 
+		-1.516663 0.2699136 -1.908402 
+		1.516663 0.2699136 -1.908402 
+		2.902689 -0.03290349 -0.2282143 
+		3.05465 0.1929539 -1.733622 
+		-3.05465 0.1929539 -1.733622 
+		-2.902689 -0.03290349 -0.2282143 
+		-1.516663 0.2699136 -1.908402 
+		1.422557 -0.3241928 1.091532 
+		2.750729 -0.2587609 1.277193 
+		2.902689 -0.03290349 -0.2282143 
+		-2.902689 -0.03290349 -0.2282143 
+		-2.750729 -0.2587609 1.277193 
+		-1.422557 -0.3241928 1.091532 
+		1.422557 -0.3241928 1.091532 
+		1.094106 0.5941064 1.091532 
+		2.753033 0.2287188 1.265094 
+		-2.753033 0.2287188 1.265094 
+		-1.094106 0.5941064 1.091532 
+		-1.422557 -0.3241928 1.091532 
+		1.422557 -0.3241928 1.091532 
+		2.753033 0.2287188 1.265094 
+		2.750729 -0.2587609 1.277193 
+		-2.750729 -0.2587609 1.277193 
+		-2.753033 0.2287188 1.265094 
+		-1.422557 -0.3241928 1.091532 
+		1.094106 0.5941064 1.091532 
+		2.755336 0.5183109 1.252996 
+		2.753033 0.2287188 1.265094 
+		-2.753033 0.2287188 1.265094 
+		-2.755336 0.5183109 1.252996 
+		-1.094106 0.5941064 1.091532 
+		2.902689 -0.03290349 -0.2282143 
+		2.750729 -0.2587609 1.277193 
+		2.753033 0.2287188 1.265094 
+		-2.753033 0.2287188 1.265094 
+		-2.750729 -0.2587609 1.277193 
+		-2.902689 -0.03290349 -0.2282143 
+		2.904993 0.4069349 -0.2403131 
+		2.753033 0.2287188 1.265094 
+		2.755336 0.5183109 1.252996 
+		-2.755336 0.5183109 1.252996 
+		-2.753033 0.2287188 1.265094 
+		-2.904993 0.4069349 -0.2403131 
+		3.05465 0.1929539 -1.733622 
+		2.902689 -0.03290349 -0.2282143 
+		2.904993 0.4069349 -0.2403131 
+		-2.904993 0.4069349 -0.2403131 
+		-2.902689 -0.03290349 -0.2282143 
+		-3.05465 0.1929539 -1.733622 
+		4.670839 0.2244458 1.458042 
+		4.822799 0.4503033 -0.04736506 
+		4.820496 -0.03717672 -0.03526628 
+		-4.820496 -0.03717672 -0.03526628 
+		-4.822799 0.4503033 -0.04736506 
+		-4.670839 0.2244458 1.458042 
+		1.516663 0.2699136 -1.908402 
+		0 -0.6483857 -1.908402 
+		1.845113 -0.6483857 -1.908402 
+		-1.845113 -0.6483857 -1.908402 
+		0 -0.6483857 -1.908402 
+		-1.516663 0.2699136 -1.908402 
+		1.516663 0.2699136 -1.908402 
+		1.188213 1.188213 -1.908402 
+		0 1.845113 -1.908402 
+		0 1.845113 -1.908402 
+		-1.188213 1.188213 -1.908402 
+		-1.516663 0.2699136 -1.908402 
+		0 -0.6483857 -1.908402 
+		1.516663 0.2699136 -1.908402 
+		0 1.845113 -1.908402 
+		0 1.845113 -1.908402 
+		-1.516663 0.2699136 -1.908402 
+		0 -0.6483857 -1.908402 
+		0 1 4.091465 
+		0.9623838 0.9623838 1.091532 
+		0.7365548 0.7365548 4.091465 
+		-0.7365548 0.7365548 4.091465 
+		-0.9623838 0.9623838 1.091532 
+		0 1 4.091465 
+		0 1 4.091465 
+		1.188213 1.188213 -1.908402 
+		0.9623838 0.9623838 1.091532 
+		-0.9623838 0.9623838 1.091532 
+		-1.188213 1.188213 -1.908402 
+		0 1 4.091465 
+		1.094106 0.5941064 1.091532 
+		0.9623838 0.9623838 1.091532 
+		1.188213 1.188213 -1.908402 
+		-1.188213 1.188213 -1.908402 
+		-0.9623838 0.9623838 1.091532 
+		-1.094106 0.5941064 1.091532 
+		1.094106 0.5941064 1.091532 
+		0.7365548 0.7365548 4.091465 
+		0.9623838 0.9623838 1.091532 
+		-0.9623838 0.9623838 1.091532 
+		-0.7365548 0.7365548 4.091465 
+		-1.094106 0.5941064 1.091532 
+		1.845113 -0.6483857 -1.908402 
+		0.7112783 -0.4862892 -0.4084351 
+		1.422557 -0.3241928 1.091532 
+		-1.422557 -0.3241928 1.091532 
+		-0.7112783 -0.4862892 -0.4084351 
+		-1.845113 -0.6483857 -1.908402 
+		1.845113 -0.6483857 -1.908402 
+		0 -0.6483857 -1.908402 
+		0.7112783 -0.4862892 -0.4084351 
+		-0.7112783 -0.4862892 -0.4084351 
+		0 -0.6483857 -1.908402 
+		-1.845113 -0.6483857 -1.908402 
+		1.211278 -0.1620964 2.591498 
+		1.422557 -0.3241928 1.091532 
+		0.7112783 -0.4862892 -0.4084351 
+		-0.7112783 -0.4862892 -0.4084351 
+		-1.422557 -0.3241928 1.091532 
+		-1.211278 -0.1620964 2.591498 
+		0.7112783 -0.4862892 -0.4084351 
+		0.5 -0.3241928 1.091532 
+		1.211278 -0.1620964 2.591498 
+		-1.211278 -0.1620964 2.591498 
+		-0.5 -0.3241928 1.091532 
+		-0.7112783 -0.4862892 -0.4084351 
+		0.5 -0.3241928 1.091532 
+		0.7112783 -0.4862892 -0.4084351 
+		0 -0.6483857 -1.908402 
+		0 -0.6483857 -1.908402 
+		-0.7112783 -0.4862892 -0.4084351 
+		-0.5 -0.3241928 1.091532 
+		1.094106 0.5941064 1.091532 
+		1.211278 -0.1620964 2.591498 
+		1 0 4.091465 
+		-1 0 4.091465 
+		-1.211278 -0.1620964 2.591498 
+		-1.094106 0.5941064 1.091532 
+		1.094106 0.5941064 1.091532 
+		1.422557 -0.3241928 1.091532 
+		1.211278 -0.1620964 2.591498 
+		-1.211278 -0.1620964 2.591498 
+		-1.422557 -0.3241928 1.091532 
+		-1.094106 0.5941064 1.091532 
+		0.75 -0.1620964 2.591498 
+		0.5 -0.3241928 1.091532 
+		0.25 -0.1620964 2.591498 
+		-0.25 -0.1620964 2.591498 
+		-0.5 -0.3241928 1.091532 
+		-0.75 -0.1620964 2.591498 
+		0.25 -0.1620964 2.591498 
+		1 0 4.091465 
+		0.75 -0.1620964 2.591498 
+		-0.75 -0.1620964 2.591498 
+		-1 0 4.091465 
+		-0.25 -0.1620964 2.591498 
+		1.211278 -0.1620964 2.591498 
+		0.75 -0.1620964 2.591498 
+		1 0 4.091465 
+		-1 0 4.091465 
+		-0.75 -0.1620964 2.591498 
+		-1.211278 -0.1620964 2.591498 
+		1.211278 -0.1620964 2.591498 
+		0.5 -0.3241928 1.091532 
+		0.75 -0.1620964 2.591498 
+		-0.75 -0.1620964 2.591498 
+		-0.5 -0.3241928 1.091532 
+		-1.211278 -0.1620964 2.591498 
+		0.5 -0.3241928 1.091532 
+		0.125 -0.405241 0.3415482 
+		0.25 -0.1620964 2.591498 
+		-0.25 -0.1620964 2.591498 
+		-0.125 -0.405241 0.3415482 
+		-0.5 -0.3241928 1.091532 
+		0.5 -0.3241928 1.091532 
+		0 -0.6483857 -1.908402 
+		0.125 -0.405241 0.3415482 
+		-0.125 -0.405241 0.3415482 
+		0 -0.6483857 -1.908402 
+		-0.5 -0.3241928 1.091532 
+		0 -0.3241928 1.091532 
+		0.25 -0.1620964 2.591498 
+		0.125 -0.405241 0.3415482 
+		-0.125 -0.405241 0.3415482 
+		-0.25 -0.1620964 2.591498 
+		0 -0.3241928 1.091532 
+		0 -0.3241928 1.091532 
+		0.125 -0.405241 0.3415482 
+		0 -0.6483857 -1.908402 
+		0 -0.6483857 -1.908402 
+		-0.125 -0.405241 0.3415482 
+		0 -0.3241928 1.091532 
+		-2.753033 0.2287188 1.265094 
+		-2.902689 -0.03290349 -0.2282143 
+		-4.820496 -0.03717672 -0.03526628 
+		-4.670839 0.2244458 1.458042 
+		-2.753033 0.2287188 1.265094 
+		-4.820496 -0.03717672 -0.03526628 
+		4.820496 -0.03717672 -0.03526628 
+		2.902689 -0.03290349 -0.2282143 
+		2.753033 0.2287188 1.265094 
+		4.670839 0.2244458 1.458042 
+		4.820496 -0.03717672 -0.03526628 
+		2.753033 0.2287188 1.265094 
+		-4.820496 -0.03717672 -0.03526628 
+		-2.904993 0.4069349 -0.2403131 
+		-4.822799 0.4503033 -0.04736506 
+		-4.820496 -0.03717672 -0.03526628 
+		-2.902689 -0.03290349 -0.2282143 
+		-2.904993 0.4069349 -0.2403131 
+		4.820496 -0.03717672 -0.03526628 
+		2.904993 0.4069349 -0.2403131 
+		2.902689 -0.03290349 -0.2282143 
+		4.820496 -0.03717672 -0.03526628 
+		4.822799 0.4503033 -0.04736506 
+		2.904993 0.4069349 -0.2403131 
+		-2.904993 0.4069349 -0.2403131 
+		-2.753033 0.2287188 1.265094 
+		-4.670839 0.2244458 1.458042 
+		-4.822799 0.4503033 -0.04736506 
+		-2.904993 0.4069349 -0.2403131 
+		-4.670839 0.2244458 1.458042 
+		4.670839 0.2244458 1.458042 
+		2.753033 0.2287188 1.265094 
+		2.904993 0.4069349 -0.2403131 
+		4.822799 0.4503033 -0.04736506 
+		4.670839 0.2244458 1.458042 
+		2.904993 0.4069349 -0.2403131 
+		0 -0.1620964 2.591498 
+		-1 0 4.091465 
+		0 0 4.091465 
+		0 0 4.091465 
+		0.25 -0.1620964 2.591498 
+		0 -0.1620964 2.591498 
+		0.25 -0.1620964 2.591498 
+		0 0 4.091465 
+		1 0 4.091465 
+		0 -0.3241928 1.091532 
+		0 -0.1620964 2.591498 
+		0.25 -0.1620964 2.591498 
+		-1 0 4.091465 
+		0 -0.1620964 2.591498 
+		-0.25 -0.1620964 2.591498 
+		0 -0.3241928 1.091532 
+		-0.25 -0.1620964 2.591498 
+		0 -0.1620964 2.591498 
+		0.25 -0.1620964 2.591498 
+		0.25 -0.1620964 2.591498 
+		1 0 4.091465 
+		0.25 -0.1620964 2.591498 
+		0 -0.3241928 1.091532 
+		0.25 -0.1620964 2.591498 
+		-0.25 -0.1620964 2.591498 
+		-0.25 -0.1620964 2.591498 
+		0 -0.3241928 1.091532 
+		-0.25 -0.1620964 2.591498 
+		-1 0 4.091465 
+		-0.25 -0.1620964 2.591498 
+	</attribute>
+	<attribute index="2" type="float" size="3" >
+		0 0.4494766 0.8932768 
+		0 0.9706107 0.2405774 
+		0.6923124 0.6569414 0.2984405 
+		-0.5413678 0.6925871 0.4766686 
+		0 0.9706107 0.2405774 
+		0 0.4494766 0.8932768 
+		0.6923124 0.6569414 0.2984405 
+		0.7200537 -0.531663 0.4458754 
+		0 0.4494766 0.8932768 
+		-0.5413678 0.6925871 0.4766686 
+		0 0.4494766 0.8932768 
+		-0.7200537 -0.531663 0.4458754 
+		0.8036439 -0.5703299 0.1697744 
+		0.7200537 -0.531663 0.4458754 
+		0.6923124 0.6569414 0.2984405 
+		-0.5413678 0.6925871 0.4766686 
+		-0.7200537 -0.531663 0.4458754 
+		-0.568041 -0.8065432 0.1636097 
+		0 -0.9989318 0.04608291 
+		0.7200537 -0.531663 0.4458754 
+		0.8036439 -0.5703299 0.1697744 
+		-0.568041 -0.8065432 0.1636097 
+		-0.7200537 -0.531663 0.4458754 
+		0 -0.9989318 0.04608291 
+		0 -0.9989318 0.04608291 
+		0 0.4494766 0.8932768 
+		0.7200537 -0.531663 0.4458754 
+		-0.7200537 -0.531663 0.4458754 
+		0 0.4494766 0.8932768 
+		0 -0.9989318 0.04608291 
+		-0.5413678 0.6925871 0.4766686 
+		-0.8041628 0.5850704 0.1045564 
+		0 0.9706107 0.2405774 
+		-0.8041628 0.5850704 0.1045564 
+		-0.5413678 0.6925871 0.4766686 
+		-0.568041 -0.8065432 0.1636097 
+		0 0.4198431 -0.90759 
+		0.72631 0.6685995 -0.1593676 
+		0 0.9706107 0.2405774 
+		0 0.9706107 0.2405774 
+		-0.72631 0.6685995 -0.1593676 
+		0 0.4198431 -0.90759 
+		0.6923124 0.6569414 0.2984405 
+		0.7624744 0.5555894 0.3315531 
+		0.8036439 -0.5703299 0.1697744 
+		-0.568041 -0.8065432 0.1636097 
+		-0.7624744 0.5555894 0.3315531 
+		-0.8041628 0.5850704 0.1045564 
+		0.4916532 0.1722465 -0.8535722 
+		0.7624744 0.5555894 0.3315531 
+		0.72631 0.6685995 -0.1593676 
+		-0.72631 0.6685995 -0.1593676 
+		-0.7624744 0.5555894 0.3315531 
+		-0.4916532 0.1722465 -0.8535722 
+		0.4636067 -0.817774 -0.3409833 
+		0.4027222 -0.7771539 0.4835352 
+		0.4916532 0.1722465 -0.8535722 
+		-0.4916532 0.1722465 -0.8535722 
+		-0.4027222 -0.7771539 0.4835352 
+		-0.4636067 -0.817774 -0.3409833 
+		0.7624744 0.5555894 0.3315531 
+		0.4916532 0.1722465 -0.8535722 
+		0.4004639 0.8580889 -0.3213599 
+		-0.4004639 0.8580889 -0.3213599 
+		-0.4916532 0.1722465 -0.8535722 
+		-0.7624744 0.5555894 0.3315531 
+		0.7624744 0.5555894 0.3315531 
+		0.4004639 0.8580889 -0.3213599 
+		0.5471664 0.5945006 0.5891599 
+		-0.5471664 0.5945006 0.5891599 
+		-0.4004639 0.8580889 -0.3213599 
+		-0.7624744 0.5555894 0.3315531 
+		0.4916532 0.1722465 -0.8535722 
+		0.9838863 -0.001617431 -0.1786248 
+		0.4004639 0.8580889 -0.3213599 
+		-0.4004639 0.8580889 -0.3213599 
+		-0.9838863 -0.001617431 -0.1786248 
+		-0.4916532 0.1722465 -0.8535722 
+		0.4916532 0.1722465 -0.8535722 
+		0.4027222 -0.7771539 0.4835352 
+		0.4582049 -0.8560442 -0.2391125 
+		-0.4582049 -0.8560442 -0.2391125 
+		-0.4027222 -0.7771539 0.4835352 
+		-0.4916532 0.1722465 -0.8535722 
+		0.4916532 0.1722465 -0.8535722 
+		0.4582049 -0.8560442 -0.2391125 
+		0.9838863 -0.001617431 -0.1786248 
+		-0.9838863 -0.001617431 -0.1786248 
+		-0.4582049 -0.8560442 -0.2391125 
+		-0.4916532 0.1722465 -0.8535722 
+		0.4027222 -0.7771539 0.4835352 
+		0.56386 -0.5887936 0.5790887 
+		0.4582049 -0.8560442 -0.2391125 
+		-0.4582049 -0.8560442 -0.2391125 
+		-0.56386 -0.5887936 0.5790887 
+		-0.4027222 -0.7771539 0.4835352 
+		0.4027222 -0.7771539 0.4835352 
+		0.7624744 0.5555894 0.3315531 
+		0.3905149 -0.2341074 0.8903165 
+		-0.3905149 -0.2341074 0.8903165 
+		-0.7624744 0.5555894 0.3315531 
+		-0.4027222 -0.7771539 0.4835352 
+		0.4027222 -0.7771539 0.4835352 
+		0.3905149 -0.2341074 0.8903165 
+		0.56386 -0.5887936 0.5790887 
+		-0.56386 -0.5887936 0.5790887 
+		-0.3905149 -0.2341074 0.8903165 
+		-0.4027222 -0.7771539 0.4835352 
+		0.7624744 0.5555894 0.3315531 
+		0.5471664 0.5945006 0.5891599 
+		0.3905149 -0.2341074 0.8903165 
+		-0.3905149 -0.2341074 0.8903165 
+		-0.5471664 0.5945006 0.5891599 
+		-0.7624744 0.5555894 0.3315531 
+		0.4582049 -0.8560442 -0.2391125 
+		0.56386 -0.5887936 0.5790887 
+		0.3905149 -0.2341074 0.8903165 
+		-0.3905149 -0.2341074 0.8903165 
+		-0.56386 -0.5887936 0.5790887 
+		-0.4582049 -0.8560442 -0.2391125 
+		0.4004639 0.8580889 -0.3213599 
+		0.3905149 -0.2341074 0.8903165 
+		0.5471664 0.5945006 0.5891599 
+		-0.5471664 0.5945006 0.5891599 
+		-0.3905149 -0.2341074 0.8903165 
+		-0.4004639 0.8580889 -0.3213599 
+		0.9838863 -0.001617431 -0.1786248 
+		0.4582049 -0.8560442 -0.2391125 
+		0.4004639 0.8580889 -0.3213599 
+		-0.4004639 0.8580889 -0.3213599 
+		-0.4582049 -0.8560442 -0.2391125 
+		-0.9838863 -0.001617431 -0.1786248 
+		0.6358227 0.6805627 0.3640248 
+		0.6556292 0.5953856 -0.4643697 
+		0.4132511 -0.7235328 -0.5528733 
+		-0.4132511 -0.7235328 -0.5528733 
+		-0.6556292 0.5953856 -0.4643697 
+		-0.6358227 0.6805627 0.3640248 
+		0.4916532 0.1722465 -0.8535722 
+		0 -0.9301126 -0.3672292 
+		0.4636067 -0.817774 -0.3409833 
+		-0.4636067 -0.817774 -0.3409833 
+		0 -0.9301126 -0.3672292 
+		-0.4916532 0.1722465 -0.8535722 
+		0.4916532 0.1722465 -0.8535722 
+		0.72631 0.6685995 -0.1593676 
+		0 0.4198431 -0.90759 
+		0 0.4198431 -0.90759 
+		-0.72631 0.6685995 -0.1593676 
+		-0.4916532 0.1722465 -0.8535722 
+		0 -0.9301126 -0.3672292 
+		0.4916532 0.1722465 -0.8535722 
+		0 0.4198431 -0.90759 
+		0 0.4198431 -0.90759 
+		-0.4916532 0.1722465 -0.8535722 
+		0 -0.9301126 -0.3672292 
+		0 0.9706107 0.2405774 
+		0.7031159 0.7031159 0.1058382 
+		0.6923124 0.6569414 0.2984405 
+		-0.8041628 0.5850704 0.1045564 
+		-0.7031159 0.7031159 0.1058382 
+		0 0.9706107 0.2405774 
+		0 0.9706107 0.2405774 
+		0.72631 0.6685995 -0.1593676 
+		0.7031159 0.7031159 0.1058382 
+		-0.7031159 0.7031159 0.1058382 
+		-0.72631 0.6685995 -0.1593676 
+		0 0.9706107 0.2405774 
+		0.7624744 0.5555894 0.3315531 
+		0.7031159 0.7031159 0.1058382 
+		0.72631 0.6685995 -0.1593676 
+		-0.72631 0.6685995 -0.1593676 
+		-0.7031159 0.7031159 0.1058382 
+		-0.7624744 0.5555894 0.3315531 
+		0.7624744 0.5555894 0.3315531 
+		0.6923124 0.6569414 0.2984405 
+		0.7031159 0.7031159 0.1058382 
+		-0.7031159 0.7031159 0.1058382 
+		-0.8041628 0.5850704 0.1045564 
+		-0.7624744 0.5555894 0.3315531 
+		0.4636067 -0.817774 -0.3409833 
+		0 -0.9942015 0.1074251 
+		0.4027222 -0.7771539 0.4835352 
+		-0.4027222 -0.7771539 0.4835352 
+		0 -0.9942015 0.1074251 
+		-0.4636067 -0.817774 -0.3409833 
+		0.4636067 -0.817774 -0.3409833 
+		0 -0.9301126 -0.3672292 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9301126 -0.3672292 
+		-0.4636067 -0.817774 -0.3409833 
+		0.4867092 -0.8585162 0.1613208 
+		0.4027222 -0.7771539 0.4835352 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		-0.4027222 -0.7771539 0.4835352 
+		-0.4867092 -0.8585162 0.1613208 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0.4867092 -0.8585162 0.1613208 
+		-0.4867092 -0.8585162 0.1613208 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9301126 -0.3672292 
+		0 -0.9301126 -0.3672292 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0.7624744 0.5555894 0.3315531 
+		0.4867092 -0.8585162 0.1613208 
+		0.8036439 -0.5703299 0.1697744 
+		-0.568041 -0.8065432 0.1636097 
+		-0.4867092 -0.8585162 0.1613208 
+		-0.7624744 0.5555894 0.3315531 
+		0.7624744 0.5555894 0.3315531 
+		0.4027222 -0.7771539 0.4835352 
+		0.4867092 -0.8585162 0.1613208 
+		-0.4867092 -0.8585162 0.1613208 
+		-0.4027222 -0.7771539 0.4835352 
+		-0.7624744 0.5555894 0.3315531 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0.8036439 -0.5703299 0.1697744 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		-0.568041 -0.8065432 0.1636097 
+		0 -0.9942015 0.1074251 
+		0.4867092 -0.8585162 0.1613208 
+		0 -0.9942015 0.1074251 
+		0.8036439 -0.5703299 0.1697744 
+		-0.568041 -0.8065432 0.1636097 
+		0 -0.9942015 0.1074251 
+		-0.4867092 -0.8585162 0.1613208 
+		0.4867092 -0.8585162 0.1613208 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		-0.4867092 -0.8585162 0.1613208 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9301126 -0.3672292 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9301126 -0.3672292 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9301126 -0.3672292 
+		0 -0.9301126 -0.3672292 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		-0.3905149 -0.2341074 0.8903165 
+		-0.4582049 -0.8560442 -0.2391125 
+		-0.4132511 -0.7235328 -0.5528733 
+		-0.6358227 0.6805627 0.3640248 
+		-0.3905149 -0.2341074 0.8903165 
+		-0.4132511 -0.7235328 -0.5528733 
+		0.4132511 -0.7235328 -0.5528733 
+		0.4582049 -0.8560442 -0.2391125 
+		0.3905149 -0.2341074 0.8903165 
+		0.6358227 0.6805627 0.3640248 
+		0.4132511 -0.7235328 -0.5528733 
+		0.3905149 -0.2341074 0.8903165 
+		-0.4132511 -0.7235328 -0.5528733 
+		-0.4004639 0.8580889 -0.3213599 
+		-0.6556292 0.5953856 -0.4643697 
+		-0.4132511 -0.7235328 -0.5528733 
+		-0.4582049 -0.8560442 -0.2391125 
+		-0.4004639 0.8580889 -0.3213599 
+		0.4132511 -0.7235328 -0.5528733 
+		0.4004639 0.8580889 -0.3213599 
+		0.4582049 -0.8560442 -0.2391125 
+		0.4132511 -0.7235328 -0.5528733 
+		0.6556292 0.5953856 -0.4643697 
+		0.4004639 0.8580889 -0.3213599 
+		-0.4004639 0.8580889 -0.3213599 
+		-0.3905149 -0.2341074 0.8903165 
+		-0.6358227 0.6805627 0.3640248 
+		-0.6556292 0.5953856 -0.4643697 
+		-0.4004639 0.8580889 -0.3213599 
+		-0.6358227 0.6805627 0.3640248 
+		0.6358227 0.6805627 0.3640248 
+		0.3905149 -0.2341074 0.8903165 
+		0.4004639 0.8580889 -0.3213599 
+		0.6556292 0.5953856 -0.4643697 
+		0.6358227 0.6805627 0.3640248 
+		0.4004639 0.8580889 -0.3213599 
+		0 -0.9942015 0.1074251 
+		-0.568041 -0.8065432 0.1636097 
+		0 -0.9989318 0.04608291 
+		0 -0.9989318 0.04608291 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9989318 0.04608291 
+		0.8036439 -0.5703299 0.1697744 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		-0.568041 -0.8065432 0.1636097 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0.8036439 -0.5703299 0.1697744 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		0 -0.9942015 0.1074251 
+		-0.568041 -0.8065432 0.1636097 
+		0 -0.9942015 0.1074251 
+	</attribute>
+	<attribute index="1" type="float" size="3" >
+		0.6705883 0.7607843 0.7607843 
+		0.6666667 0.7607843 0.7647059 
+		0.6666667 0.7607843 0.7647059 
+		0.6666667 0.7607843 0.7647059 
+		0.6666667 0.7607843 0.7647059 
+		0.6705883 0.7607843 0.7607843 
+		0.6666667 0.7607843 0.7647059 
+		0.682353 0.772549 0.7411765 
+		0.6705883 0.7607843 0.7607843 
+		0.6666667 0.7607843 0.7647059 
+		0.6705883 0.7607843 0.7607843 
+		0.682353 0.772549 0.7411765 
+		0.6666667 0.7607843 0.7647059 
+		0.6666667 0.7607843 0.7647059 
+		0.6666667 0.7607843 0.7647059 
+		0.6666667 0.7607843 0.7647059 
+		0.6666667 0.7607843 0.7647059 
+		0.6666667 0.7607843 0.7647059 
+		0.3843137 0.4392157 0.4431372 
+		0.4117647 0.4666666 0.4705882 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.4117647 0.4666666 0.4705882 
+		0.3843137 0.4392157 0.4431372 
+		0.3843137 0.4392157 0.4431372 
+		0.3843137 0.4352941 0.4352941 
+		0.4117647 0.4666666 0.4705882 
+		0.4117647 0.4666666 0.4705882 
+		0.3843137 0.4352941 0.4352941 
+		0.3843137 0.4392157 0.4431372 
+		1 1 1 
+		1 1 1 
+		1 1 1 
+		1 1 1 
+		1 1 1 
+		1 1 1 
+		0.6352941 0.7215687 0.6941177 
+		0.7019608 0.772549 0.627451 
+		0.6666667 0.7607843 0.7647059 
+		0.6666667 0.7607843 0.7647059 
+		0.7019608 0.772549 0.627451 
+		0.6352941 0.7215687 0.6941177 
+		0.6666667 0.7607843 0.7647059 
+		0.6392157 0.7215687 0.7098039 
+		0.6666667 0.7607843 0.7647059 
+		0.6666667 0.7607843 0.7647059 
+		0.6392157 0.7215687 0.7098039 
+		0.6666667 0.7607843 0.7647059 
+		0.7411765 0.8 0.4941176 
+		0.6235294 0.7137255 0.7137255 
+		0.7019608 0.772549 0.627451 
+		0.7019608 0.772549 0.627451 
+		0.6235294 0.7137255 0.7137255 
+		0.7411765 0.8 0.4941176 
+		0.3686274 0.4156863 0.4196078 
+		0.3215686 0.3647059 0.3686274 
+		0.4627451 0.5411765 0.5215687 
+		0.4627451 0.5411765 0.5215687 
+		0.3215686 0.3647059 0.3686274 
+		0.3686274 0.4156863 0.4196078 
+		0.6235294 0.7137255 0.7137255 
+		0.7411765 0.8 0.4941176 
+		0.8666667 0.854902 0.6745098 
+		0.8666667 0.854902 0.6745098 
+		0.7411765 0.8 0.4941176 
+		0.6235294 0.7137255 0.7137255 
+		0.6235294 0.7137255 0.7137255 
+		0.8666667 0.854902 0.6745098 
+		0.8666667 0.854902 0.682353 
+		0.8666667 0.854902 0.682353 
+		0.8666667 0.854902 0.6745098 
+		0.6235294 0.7137255 0.7137255 
+		0.7411765 0.8 0.4941176 
+		0.5647059 0.6627451 0.6196079 
+		0.8666667 0.854902 0.6745098 
+		0.8666667 0.854902 0.6745098 
+		0.5647059 0.6627451 0.6196079 
+		0.7411765 0.8 0.4941176 
+		0.372549 0.4156863 0.3803921 
+		0.3215686 0.3647059 0.3686274 
+		0.882353 0.8705883 0.6588236 
+		0.882353 0.8705883 0.6588236 
+		0.3215686 0.3647059 0.3686274 
+		0.372549 0.4156863 0.3803921 
+		0.372549 0.4156863 0.3803921 
+		0.882353 0.8705883 0.6588236 
+		0.8784314 0.8627451 0.6784314 
+		0.8784314 0.8627451 0.6784314 
+		0.882353 0.8705883 0.6588236 
+		0.372549 0.4156863 0.3803921 
+		0.3215686 0.3647059 0.3686274 
+		0.8901961 0.8784314 0.6392157 
+		0.882353 0.8705883 0.6588236 
+		0.882353 0.8705883 0.6588236 
+		0.8901961 0.8784314 0.6392157 
+		0.3215686 0.3647059 0.3686274 
+		0.6156863 0.7019608 0.7058824 
+		0.6392157 0.7215687 0.7098039 
+		0.8392157 0.8431373 0.6941177 
+		0.8392157 0.8431373 0.6941177 
+		0.6392157 0.7215687 0.7098039 
+		0.6156863 0.7019608 0.7058824 
+		0.6156863 0.7019608 0.7058824 
+		0.827451 0.8392157 0.6980392 
+		0.7529412 0.8196079 0.6470589 
+		0.7529412 0.8196079 0.6470589 
+		0.827451 0.8392157 0.6980392 
+		0.6156863 0.7019608 0.7058824 
+		0.6196079 0.7098039 0.7137255 
+		0.8666667 0.854902 0.682353 
+		0.8431373 0.8431373 0.6941177 
+		0.8431373 0.8431373 0.6941177 
+		0.8666667 0.854902 0.682353 
+		0.6196079 0.7098039 0.7137255 
+		0.882353 0.8705883 0.6588236 
+		0.8627451 0.854902 0.6745098 
+		0.8470588 0.8431373 0.6862745 
+		0.8470588 0.8431373 0.6862745 
+		0.8627451 0.854902 0.6745098 
+		0.882353 0.8705883 0.6588236 
+		0.8431373 0.8431373 0.6588236 
+		0.8431373 0.8431373 0.6941177 
+		0.8666667 0.854902 0.682353 
+		0.8666667 0.854902 0.682353 
+		0.8431373 0.8431373 0.6941177 
+		0.8431373 0.8431373 0.6588236 
+		0.5568628 0.6588236 0.6392157 
+		0.8745098 0.8588235 0.6784314 
+		0.8431373 0.8470588 0.6627451 
+		0.8431373 0.8470588 0.6627451 
+		0.8745098 0.8588235 0.6784314 
+		0.5568628 0.6588236 0.6392157 
+		0.6078432 0.6431373 0.6470589 
+		0.6196079 0.654902 0.6588236 
+		0.6156863 0.6509804 0.654902 
+		0.6156863 0.6509804 0.654902 
+		0.6196079 0.654902 0.6588236 
+		0.6078432 0.6431373 0.6470589 
+		0.7411765 0.8 0.4941176 
+		0.9960784 1 0.317647 
+		0.9960784 1 0.317647 
+		0.9960784 1 0.317647 
+		0.9960784 1 0.317647 
+		0.7411765 0.8 0.4941176 
+		0.7411765 0.8 0.4941176 
+		0.9960784 1 0.317647 
+		0.9960784 1 0.317647 
+		0.9960784 1 0.317647 
+		0.9960784 1 0.317647 
+		0.7411765 0.8 0.4941176 
+		0.9960784 1 0.317647 
+		0.7411765 0.8 0.4941176 
+		0.9960784 1 0.317647 
+		0.9960784 1 0.317647 
+		0.7411765 0.8 0.4941176 
+		0.9960784 1 0.317647 
+		0.6666667 0.7607843 0.7647059 
+		0.6235294 0.7137255 0.7176471 
+		0.6666667 0.7607843 0.7647059 
+		0.6666667 0.7607843 0.7647059 
+		0.6235294 0.7137255 0.7176471 
+		0.6666667 0.7607843 0.7647059 
+		0.6666667 0.7607843 0.7647059 
+		0.7019608 0.772549 0.627451 
+		0.6235294 0.7137255 0.7176471 
+		0.6235294 0.7137255 0.7176471 
+		0.7019608 0.772549 0.627451 
+		0.6666667 0.7607843 0.7647059 
+		0.6392157 0.7215687 0.7098039 
+		0.7137255 0.7647059 0.7019608 
+		0.7019608 0.772549 0.627451 
+		0.7019608 0.772549 0.627451 
+		0.7137255 0.7647059 0.7019608 
+		0.6392157 0.7215687 0.7098039 
+		0.6392157 0.7215687 0.7098039 
+		0.6666667 0.7607843 0.7647059 
+		0.7137255 0.7647059 0.7019608 
+		0.7137255 0.7647059 0.7019608 
+		0.6666667 0.7607843 0.7647059 
+		0.6392157 0.7215687 0.7098039 
+		0.3686274 0.4156863 0.4196078 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3686274 0.4156863 0.4196078 
+		0.3686274 0.4156863 0.4196078 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3686274 0.4156863 0.4196078 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.6392157 0.7215687 0.7098039 
+		0.6039216 0.6901961 0.6941177 
+		0.6666667 0.7607843 0.7647059 
+		0.6666667 0.7607843 0.7647059 
+		0.6039216 0.6901961 0.6941177 
+		0.6392157 0.7215687 0.7098039 
+		0.6392157 0.7215687 0.7098039 
+		0.6980392 0.7529412 0.6980392 
+		0.6039216 0.6901961 0.6941177 
+		0.6039216 0.6901961 0.6941177 
+		0.6980392 0.7529412 0.6980392 
+		0.6392157 0.7215687 0.7098039 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.3215686 0.3647059 0.3686274 
+		0.7568628 0.8039216 0.6235294 
+		0.882353 0.8705883 0.6588236 
+		0.7058824 0.7450981 0.7450981 
+		0.6313726 0.6666667 0.6705883 
+		0.7568628 0.8039216 0.6235294 
+		0.7058824 0.7450981 0.7450981 
+		0.7058824 0.7450981 0.7450981 
+		0.882353 0.8705883 0.6588236 
+		0.7568628 0.8039216 0.6235294 
+		0.6313726 0.6666667 0.6705883 
+		0.7058824 0.7450981 0.7450981 
+		0.7568628 0.8039216 0.6235294 
+		0.6352941 0.6627451 0.6470589 
+		0.8 0.827451 0.6352941 
+		0.6313726 0.6666667 0.6509804 
+		0.6352941 0.6627451 0.6470589 
+		0.8705883 0.8588235 0.6784314 
+		0.8 0.827451 0.6352941 
+		0.6352941 0.6627451 0.6470589 
+		0.8 0.827451 0.6352941 
+		0.8705883 0.8588235 0.6784314 
+		0.6352941 0.6627451 0.6470589 
+		0.6313726 0.6666667 0.6509804 
+		0.8 0.827451 0.6352941 
+		0.8666667 0.854902 0.6745098 
+		0.8431373 0.8431373 0.6941177 
+		0.6117647 0.6509804 0.6509804 
+		0.6313726 0.6705883 0.6745098 
+		0.8666667 0.854902 0.6745098 
+		0.6117647 0.6509804 0.6509804 
+		0.6117647 0.6509804 0.6509804