diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..5171c540
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+node_modules
+npm-debug.log
\ No newline at end of file
diff --git a/README.md b/README.md
index fad423fa..dd433027 100644
--- a/README.md
+++ b/README.md
@@ -1,45 +1,24 @@
# Project 4: Shape Grammar
-For this assignment you'll be building directly off of Project 3. To make things easier to keep track of, please fork and clone this repository [https://github.com/CIS700-Procedural-Graphics/Project4-Shape-Grammar](https://github.com/CIS700-Procedural-Graphics/Project4-Shape-Grammar) and copy your Project 3 code to start.
-
-**Goal:** to model an urban environment using a shape grammar.
-
-**Note:** We’re well aware that a nice-looking procedural city is a lot of work for a single week. Focus on designing a nice building grammar. The city layout strategies outlined in class (the extended l-systems) are complex and not expected. We will be satisfied with something reasonably simple, just not a uniform grid!
-
-## Symbol Node (5 points)
-Modify your symbol node class to include attributes necessary for rendering, such as
-- Associated geometry instance
-- Position
-- Scale
-- Anything else you may need
-
-## Grammar design (55 points)
-- Design at least five shape grammar rules for producing procedural buildings. Your buildings should vary in geometry and decorative features (beyond just differently-scaled cubes!). At least some of your rules should create child geometry that is in some way dependent on its parent’s state. (20 points)
- - Eg. A building may be subdivided along the x, y, or z axis into two smaller buildings
- - Some of your rules must be designed to use some property about its location. (10 points)
- - Your grammar should have some element of variation so your buildings are non-deterministic. Eg. your buildings sometimes subdivide along the x axis, and sometimes the y. (10 points)
-- Write a renderer that will interpret the results of your shape grammar parser and adds the appropriate geometry to your scene for each symbol in your set. (10 points)
-
-## Create a city (30 points)
-- Add a ground plane or some other base terrain to your scene (0 points, come on now)
-- Using any strategy you’d like, procedurally generate features that demarcate your city into different areas in an interesting and plausible way (Just a uniform grid is neither interesting nor plausible). (20 points)
- - Suggestions: roads, rivers, lakes, parks, high-population density
- - Note, these features don’t have to be directly visible, like high-population density, but they should somehow be visible in the appearance or arrangement of your buildings. Eg. High population density is more likely to generate taller buildings
-- Generate buildings throughout your city, using information about your city’s features. Color your buildings with a method that uses some aspect of its state. Eg. Color buildings by height, by population density, by number of rules used to generate it. (5 points)
-- Document your grammar rules and general approach in the readme. (5 points)
-- ???
-- Profit.
-
-## Make it interesting (10)
-Experiment! Make your city a work of art.
-
-
-## Warnings:
-You can very easily blow up three.js with this assignment. With a very simple grammar, our medium quality machine was able to handle 100 buildings with 6 generations each, but be careful if you’re doing this all CPU-side.
-
-## Suggestions for the overachievers:
-Go for a very high level of decorative detail!
-Place buildings with a strategy such that buildings have doors and windows that are always accessible.
-Generate buildings with coherent interiors
-If dividing your city into lots, generate odd-shaped lots and create building meshes that match their shape ie. rather than working with cubes, extrude upwards from the building footprints you find to generate a starting mesh to subdivide rather than starting with platonic geometry.
+[MINIS-TIRITH](https://mccannd.github.io/Project4-Shape-Grammar/)
+
+Mini-Minas Tirith!
+
+Controls:
+-Iterate to advance the shape grammar stage
+-Clear to completely reset the city.
+-Volume to adjust the music
+
+Grammar rules:
+-Each floor / tier will distribute houses radially according to a 'population map' which coincidentally modeled by perlin noise
+-Walls can spawn towers and emplacements
+-Emplacements can spawn more houses
+-Houses can subdivide into more houses or halt with a roof
+-The city will boost by one tier each iteration
+
+Other notes:
+- Light is using shadow-mapping a directional light, and a hemisphere light. No custom shaders until I can figure out how to access the map
+- Merging all of the meshes into one call is very helpful
+- The mountain terrain is procedurally generated as well
+- Once the city reaches its full height, a particular movie scene plays...
\ No newline at end of file
diff --git a/deploy.js b/deploy.js
new file mode 100644
index 00000000..9defe7c3
--- /dev/null
+++ b/deploy.js
@@ -0,0 +1,38 @@
+var colors = require('colors');
+var path = require('path');
+var git = require('simple-git')(__dirname);
+var deploy = require('gh-pages-deploy');
+var packageJSON = require('require-module')('./package.json');
+
+var success = 1;
+git.fetch('origin', 'master', function(err) {
+ if (err) throw err;
+ git.status(function(err, status) {
+ if (err) throw err;
+ if (!status.isClean()) {
+ success = 0;
+ console.error('Error: You have uncommitted changes! Please commit them first'.red);
+ }
+
+ if (status.current !== 'master') {
+ success = 0;
+ console.warn('Warning: Please deploy from the master branch!'.yellow)
+ }
+
+ git.diffSummary(['origin/master'], function(err, diff) {
+ if (err) throw err;
+
+ if (diff.files.length || diff.insertions || diff.deletions) {
+ success = 0;
+ console.error('Error: Current branch is different from origin/master! Please push all changes first'.red)
+ }
+
+ if (success) {
+ var cfg = packageJSON['gh-pages-deploy'] || {};
+ var buildCmd = deploy.getFullCmd(cfg);
+ deploy.displayCmds(deploy.getFullCmd(cfg));
+ deploy.execBuild(buildCmd, cfg);
+ }
+ })
+ })
+})
\ No newline at end of file
diff --git a/index.html b/index.html
new file mode 100644
index 00000000..46609dd5
--- /dev/null
+++ b/index.html
@@ -0,0 +1,19 @@
+
+
+
+ HW4: ShapeGrammars
+
+
+
+
+
+
diff --git a/package.json b/package.json
new file mode 100644
index 00000000..be683fcb
--- /dev/null
+++ b/package.json
@@ -0,0 +1,31 @@
+{
+ "scripts": {
+ "start": "webpack-dev-server --hot --inline",
+ "build": "webpack",
+ "deploy": "node deploy.js"
+ },
+ "gh-pages-deploy": {
+ "prep": [
+ "build"
+ ],
+ "noprompt": true
+ },
+ "dependencies": {
+ "dat-gui": "^0.5.0",
+ "gl-matrix": "^2.3.2",
+ "stats-js": "^1.0.0-alpha1",
+ "three": "^0.82.1",
+ "three-orbit-controls": "^82.1.0"
+ },
+ "devDependencies": {
+ "babel-core": "^6.18.2",
+ "babel-loader": "^6.2.8",
+ "babel-preset-es2015": "^6.18.0",
+ "colors": "^1.1.2",
+ "gh-pages-deploy": "^0.4.2",
+ "simple-git": "^1.65.0",
+ "webpack": "^1.13.3",
+ "webpack-dev-server": "^1.16.2",
+ "webpack-glsl-loader": "^1.0.1"
+ }
+}
diff --git a/resources/angleroof.obj b/resources/angleroof.obj
new file mode 100644
index 00000000..5fcac4b0
--- /dev/null
+++ b/resources/angleroof.obj
@@ -0,0 +1,438 @@
+# This file uses centimeters as units for non-parametric coordinates.
+
+mtllib angleroof.mtl
+g default
+v -0.447104 0.051801 0.447104
+v -0.057687 0.051801 0.447104
+v 0.057687 0.051801 0.447104
+v 0.447104 0.051801 0.447104
+v -0.447104 0.111262 0.447104
+v -0.057687 0.387130 0.447104
+v 0.057687 0.387130 0.447104
+v 0.447104 0.111262 0.447104
+v -0.447104 0.111262 -0.447104
+v -0.057687 0.387130 -0.447104
+v 0.057687 0.387130 -0.447104
+v 0.447104 0.111262 -0.447104
+v -0.447104 0.051801 -0.447104
+v -0.057687 0.051801 -0.447104
+v 0.057687 0.051801 -0.447104
+v 0.447104 0.051801 -0.447104
+v -0.360501 0.084505 0.447104
+v -0.037003 0.084505 0.447104
+v -0.037003 0.358230 0.447104
+v -0.360501 0.129887 0.447104
+v 0.037003 0.084505 0.447104
+v 0.037003 0.358230 0.447104
+v 0.360501 0.084505 0.447104
+v 0.360501 0.129887 0.447104
+v -0.360501 0.129887 -0.447104
+v -0.037003 0.358230 -0.447104
+v -0.037003 0.084505 -0.447104
+v -0.360501 0.084505 -0.447104
+v 0.037003 0.358230 -0.447104
+v 0.037003 0.084505 -0.447104
+v 0.360501 0.129887 -0.447104
+v 0.360501 0.084505 -0.447104
+v -0.360501 0.084505 0.380060
+v -0.037003 0.084505 0.380060
+v -0.037003 0.358230 0.380060
+v -0.360501 0.129887 0.380060
+v 0.037003 0.084505 0.380060
+v 0.037003 0.358230 0.380060
+v 0.360501 0.084505 0.380060
+v 0.360501 0.129887 0.380060
+v -0.360501 0.129887 -0.380060
+v -0.037003 0.358230 -0.380060
+v -0.037003 0.084505 -0.380060
+v -0.360501 0.084505 -0.380060
+v 0.037003 0.358230 -0.380060
+v 0.037003 0.084505 -0.380060
+v 0.360501 0.129887 -0.380060
+v 0.360501 0.084505 -0.380060
+v -0.493198 0.054143 -0.493198
+v -0.063635 0.054143 -0.493198
+v -0.063635 0.004038 -0.493198
+v -0.493198 0.004038 -0.493198
+v -0.493198 0.054143 0.493198
+v -0.063635 0.054143 0.493198
+v -0.493198 0.004038 0.493198
+v -0.063635 0.004038 0.493198
+v 0.063635 0.054143 -0.493198
+v 0.063635 0.004038 -0.493198
+v 0.063635 0.054143 0.493198
+v 0.063635 0.004038 0.493198
+v 0.493198 0.054143 -0.493198
+v 0.493198 0.004038 -0.493198
+v 0.493198 0.054143 0.493198
+v 0.493198 0.004038 0.493198
+vt 0.375000 0.000000
+vt 0.458333 0.000000
+vt 0.541667 0.000000
+vt 0.625000 0.000000
+vt 0.375000 0.250000
+vt 0.458333 0.250000
+vt 0.541667 0.250000
+vt 0.625000 0.250000
+vt 0.375000 0.500000
+vt 0.458333 0.500000
+vt 0.541667 0.500000
+vt 0.625000 0.500000
+vt 0.375000 0.750000
+vt 0.458333 0.750000
+vt 0.541667 0.750000
+vt 0.625000 0.750000
+vt 0.375000 1.000000
+vt 0.458333 1.000000
+vt 0.541667 1.000000
+vt 0.625000 1.000000
+vt 0.875000 0.000000
+vt 0.875000 0.250000
+vt 0.125000 0.000000
+vt 0.125000 0.250000
+vt 0.375000 0.000000
+vt 0.458333 0.000000
+vt 0.458333 0.250000
+vt 0.375000 0.250000
+vt 0.541667 0.000000
+vt 0.541667 0.250000
+vt 0.625000 0.000000
+vt 0.625000 0.250000
+vt 0.375000 0.500000
+vt 0.458333 0.500000
+vt 0.458333 0.750000
+vt 0.375000 0.750000
+vt 0.541667 0.500000
+vt 0.541667 0.750000
+vt 0.625000 0.500000
+vt 0.625000 0.750000
+vt 0.375000 0.000000
+vt 0.458333 0.000000
+vt 0.458333 0.250000
+vt 0.375000 0.250000
+vt 0.541667 0.000000
+vt 0.541667 0.250000
+vt 0.625000 0.000000
+vt 0.625000 0.250000
+vt 0.375000 0.500000
+vt 0.458333 0.500000
+vt 0.458333 0.750000
+vt 0.375000 0.750000
+vt 0.541667 0.500000
+vt 0.541667 0.750000
+vt 0.625000 0.500000
+vt 0.625000 0.750000
+vt 0.375000 0.750000
+vt 0.458333 0.750000
+vt 0.458333 0.750000
+vt 0.375000 0.750000
+vt 0.458333 1.000000
+vt 0.375000 1.000000
+vt 0.375000 1.000000
+vt 0.458333 1.000000
+vt 0.541667 0.750000
+vt 0.541667 0.750000
+vt 0.541667 1.000000
+vt 0.541667 1.000000
+vt 0.625000 0.750000
+vt 0.625000 0.750000
+vt 0.625000 1.000000
+vt 0.625000 1.000000
+vn -0.000000 0.000000 1.000000
+vn -0.000000 0.000000 1.000000
+vn -0.000000 0.000000 1.000000
+vn -0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -0.578061 0.815994 0.000000
+vn -0.578061 0.815994 0.000000
+vn -0.578061 0.815994 0.000000
+vn -0.578061 0.815994 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.578061 0.815994 0.000000
+vn 0.578061 0.815994 0.000000
+vn 0.578061 0.815994 0.000000
+vn 0.578061 0.815994 0.000000
+vn -0.000000 0.000000 -1.000000
+vn -0.000000 0.000000 -1.000000
+vn -0.000000 0.000000 -1.000000
+vn -0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -0.000000 0.000000 1.000000
+vn -0.000000 0.000000 1.000000
+vn -0.000000 0.000000 1.000000
+vn -0.000000 0.000000 1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn -0.000000 0.000000 -1.000000
+vn -0.000000 0.000000 -1.000000
+vn -0.000000 0.000000 -1.000000
+vn -0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.576668 -0.816979 0.000000
+vn 0.576668 -0.816979 0.000000
+vn 0.576668 -0.816979 0.000000
+vn 0.576668 -0.816979 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -0.576668 -0.816978 0.000000
+vn -0.576668 -0.816978 0.000000
+vn -0.576668 -0.816978 0.000000
+vn -0.576668 -0.816978 0.000000
+vn 0.576668 -0.816979 0.000000
+vn 0.576668 -0.816979 0.000000
+vn 0.576668 -0.816979 0.000000
+vn 0.576668 -0.816979 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn -0.576668 -0.816978 0.000000
+vn -0.576668 -0.816978 0.000000
+vn -0.576668 -0.816978 0.000000
+vn -0.576668 -0.816978 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.998712 0.050730
+vn 0.000000 0.998712 0.050730
+vn 0.000000 0.998712 0.050730
+vn 0.000000 0.998712 0.050730
+vn 0.000000 0.998712 -0.050730
+vn 0.000000 0.998712 -0.050730
+vn 0.000000 0.998712 -0.050730
+vn 0.000000 0.998712 -0.050730
+vn 0.050730 0.998712 0.000000
+vn 0.050730 0.998712 0.000000
+vn 0.050730 0.998712 0.000000
+vn 0.050730 0.998712 0.000000
+vn 0.000000 0.998712 0.050730
+vn 0.000000 0.998712 0.050730
+vn 0.000000 0.998712 0.050730
+vn 0.000000 0.998712 0.050730
+vn 0.000000 0.998712 -0.050730
+vn 0.000000 0.998712 -0.050730
+vn 0.000000 0.998712 -0.050730
+vn 0.000000 0.998712 -0.050730
+vn 0.000000 0.998712 0.050730
+vn 0.000000 0.998712 0.050730
+vn 0.000000 0.998712 0.050730
+vn 0.000000 0.998712 0.050730
+vn -0.050730 0.998712 0.000000
+vn -0.050730 0.998712 0.000000
+vn -0.050730 0.998712 0.000000
+vn -0.050730 0.998712 0.000000
+vn 0.000000 0.998712 -0.050730
+vn 0.000000 0.998712 -0.050730
+vn 0.000000 0.998712 -0.050730
+vn 0.000000 0.998712 -0.050730
+s off
+g pCube3
+usemtl initialShadingGroup
+f 33/41/1 34/42/2 35/43/3 36/44/4
+f 34/42/5 37/45/6 38/46/7 35/43/8
+f 37/45/9 39/47/10 40/48/11 38/46/12
+f 5/5/13 6/6/14 10/10/15 9/9/16
+f 6/6/17 7/7/18 11/11/19 10/10/20
+f 7/7/21 8/8/22 12/12/23 11/11/24
+f 41/49/25 42/50/26 43/51/27 44/52/28
+f 42/50/29 45/53/30 46/54/31 43/51/32
+f 45/53/33 47/55/34 48/56/35 46/54/36
+f 4/4/37 16/21/38 12/22/39 8/8/40
+f 13/23/41 1/1/42 5/5/43 9/24/44
+f 1/1/45 2/2/46 18/26/47 17/25/48
+f 6/6/49 5/5/50 20/28/51 19/27/52
+f 5/5/53 1/1/54 17/25/55 20/28/56
+f 2/2/57 3/3/58 21/29/59 18/26/60
+f 7/7/61 6/6/62 19/27/63 22/30/64
+f 3/3/65 4/4/66 23/31/67 21/29/68
+f 4/4/69 8/8/70 24/32/71 23/31/72
+f 8/8/73 7/7/74 22/30/75 24/32/76
+f 9/9/77 10/10/78 26/34/79 25/33/80
+f 14/14/81 13/13/82 28/36/83 27/35/84
+f 13/13/85 9/9/86 25/33/87 28/36/88
+f 10/10/89 11/11/90 29/37/91 26/34/92
+f 15/15/93 14/14/94 27/35/95 30/38/96
+f 11/11/97 12/12/98 31/39/99 29/37/100
+f 12/12/101 16/16/102 32/40/103 31/39/104
+f 16/16/105 15/15/106 30/38/107 32/40/108
+f 17/25/109 18/26/110 34/42/111 33/41/112
+f 19/27/113 20/28/114 36/44/115 35/43/116
+f 20/28/117 17/25/118 33/41/119 36/44/120
+f 18/26/121 21/29/122 37/45/123 34/42/124
+f 22/30/125 19/27/126 35/43/127 38/46/128
+f 21/29/129 23/31/130 39/47/131 37/45/132
+f 23/31/133 24/32/134 40/48/135 39/47/136
+f 24/32/137 22/30/138 38/46/139 40/48/140
+f 25/33/141 26/34/142 42/50/143 41/49/144
+f 27/35/145 28/36/146 44/52/147 43/51/148
+f 28/36/149 25/33/150 41/49/151 44/52/152
+f 26/34/153 29/37/154 45/53/155 42/50/156
+f 30/38/157 27/35/158 43/51/159 46/54/160
+f 29/37/161 31/39/162 47/55/163 45/53/164
+f 31/39/165 32/40/166 48/56/167 47/55/168
+f 32/40/169 30/38/170 46/54/171 48/56/172
+f 49/57/173 50/58/174 51/59/175 52/60/176
+f 54/61/177 53/62/178 55/63/179 56/64/180
+f 53/62/181 49/57/182 52/60/183 55/63/184
+f 50/58/185 57/65/186 58/66/187 51/59/188
+f 59/67/189 54/61/190 56/64/191 60/68/192
+f 57/65/193 61/69/194 62/70/195 58/66/196
+f 61/69/197 63/71/198 64/72/199 62/70/200
+f 63/71/201 59/67/202 60/68/203 64/72/204
+f 13/13/205 14/14/206 50/58/207 49/57/208
+f 2/18/209 1/17/210 53/62/211 54/61/212
+f 1/17/213 13/13/214 49/57/215 53/62/216
+f 14/14/217 15/15/218 57/65/219 50/58/220
+f 3/19/221 2/18/222 54/61/223 59/67/224
+f 15/15/225 16/16/226 61/69/227 57/65/228
+f 16/16/229 4/20/230 63/71/231 61/69/232
+f 4/20/233 3/19/234 59/67/235 63/71/236
diff --git a/resources/archdoor.obj b/resources/archdoor.obj
new file mode 100644
index 00000000..136f1d41
--- /dev/null
+++ b/resources/archdoor.obj
@@ -0,0 +1,400 @@
+# This file uses centimeters as units for non-parametric coordinates.
+
+mtllib archdoor.mtl
+g default
+v -0.190980 -0.286471 -0.000000
+v 0.190980 -0.286471 -0.000000
+v -0.190980 0.179437 0.000000
+v 0.190980 0.179437 0.000000
+v 0.089021 0.286471 0.000000
+v 0.089021 -0.286471 -0.000000
+v -0.089021 0.286471 0.000000
+v -0.089021 -0.286471 -0.000000
+v 0.089021 -0.286471 0.050176
+v 0.190980 -0.286471 0.050176
+v 0.190980 0.179437 0.050176
+v 0.089021 0.286471 0.050176
+v -0.089021 -0.286471 0.050176
+v -0.089021 0.286471 0.050176
+v -0.190980 -0.286471 0.050176
+v -0.190980 0.179437 0.050176
+v 0.072109 -0.232046 0.050176
+v 0.154698 -0.232046 0.050176
+v 0.154698 0.145347 0.050176
+v 0.072109 0.232046 0.050176
+v -0.072109 -0.232046 0.050176
+v -0.072109 0.232046 0.050176
+v -0.154698 -0.232046 0.050176
+v -0.154698 0.145347 0.050176
+v 0.072109 -0.232046 0.014705
+v 0.154698 -0.232046 0.014705
+v 0.154698 0.145347 0.014705
+v 0.072109 0.232046 0.014705
+v -0.072109 -0.232046 0.014705
+v -0.072109 0.232046 0.014705
+v -0.154698 -0.232046 0.014705
+v -0.154698 0.145347 0.014705
+v 0.089021 -0.326920 -0.000000
+v 0.190980 -0.326920 -0.000000
+v 0.190980 -0.326920 0.050176
+v 0.089021 -0.326920 0.050176
+v -0.089021 -0.326920 -0.000000
+v -0.089021 -0.326920 0.050176
+v -0.190980 -0.326920 -0.000000
+v -0.190980 -0.326920 0.050176
+v 0.089021 -0.286471 0.098868
+v 0.190980 -0.286471 0.098868
+v 0.089021 -0.326920 0.098868
+v 0.190980 -0.326920 0.098868
+v -0.089021 -0.286471 0.098868
+v -0.089021 -0.326920 0.098868
+v -0.190980 -0.286471 0.098868
+v -0.190980 -0.326920 0.098868
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 0.000000 1.000000
+vt 1.000000 1.000000
+vt 0.666667 1.000000
+vt 0.666667 0.000000
+vt 0.333333 1.000000
+vt 0.333333 0.000000
+vt 0.666667 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.666667 1.000000
+vt 0.333333 0.000000
+vt 0.333333 1.000000
+vt 0.000000 0.000000
+vt 0.000000 1.000000
+vt 0.666667 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.666667 1.000000
+vt 0.333333 0.000000
+vt 0.333333 1.000000
+vt 0.000000 0.000000
+vt 0.000000 1.000000
+vt 0.666667 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.666667 1.000000
+vt 0.333333 0.000000
+vt 0.333333 1.000000
+vt 0.000000 0.000000
+vt 0.000000 1.000000
+vt 0.666667 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.666667 1.000000
+vt 0.333333 0.000000
+vt 0.333333 1.000000
+vt 0.000000 0.000000
+vt 0.000000 1.000000
+vt 0.666667 0.000000
+vt 1.000000 0.000000
+vt 1.000000 0.000000
+vt 0.666667 0.000000
+vt 0.333333 0.000000
+vt 0.333333 0.000000
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 0.666667 0.000000
+vt 0.666667 0.000000
+vt 1.000000 0.000000
+vt 0.333333 0.000000
+vt 0.333333 0.000000
+vt 0.000000 0.000000
+vt 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -0.000000 0.000000 1.000000
+vn -0.000000 0.000000 1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn -0.000000 0.000000 -1.000000
+vn -0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn -0.000000 0.000000 -1.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.724064 0.689733 -0.000000
+vn 0.724064 0.689733 -0.000000
+vn 0.724064 0.689733 -0.000000
+vn 0.724064 0.689733 -0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn -0.724064 0.689733 -0.000000
+vn -0.724064 0.689733 -0.000000
+vn -0.724064 0.689733 -0.000000
+vn -0.724064 0.689733 -0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 -0.000000 1.000000
+vn 0.000000 -0.000000 1.000000
+vn 0.000000 -0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 -0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 -0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 -0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 -0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 -0.000000 1.000000
+vn 0.000000 -0.000000 1.000000
+vn 0.000000 -0.000000 1.000000
+vn 0.000000 -0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 -0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 1.000000 -0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -0.724063 -0.689734 0.000000
+vn -0.724063 -0.689733 0.000000
+vn -0.724063 -0.689734 0.000000
+vn -0.724063 -0.689733 0.000000
+vn -0.000000 1.000000 -0.000000
+vn -0.000000 1.000000 -0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 1.000000 -0.000000
+vn -0.000000 1.000000 -0.000000
+vn 0.724063 -0.689734 0.000000
+vn 0.724063 -0.689734 0.000000
+vn 0.724063 -0.689734 0.000000
+vn 0.724063 -0.689734 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 -0.000000 -1.000000
+vn 0.000000 -0.000000 -1.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -0.000000 -0.000000 -1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -0.000000 -0.000000 -1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 1.000000 -0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+s 1
+g pPlane1
+usemtl initialShadingGroup
+f 26/34/1 27/35/2 25/33/3
+f 25/33/3 27/35/2 28/36/4
+f 29/37/5 25/33/3 30/38/6
+f 30/38/6 25/33/3 28/36/4
+f 31/39/7 29/37/5 32/40/8
+f 32/40/8 29/37/5 30/38/6
+s 2
+f 5/12/9 4/11/10 6/9/11
+f 6/9/11 4/11/10 2/10/12
+f 8/13/13 7/14/14 6/9/11
+f 6/9/11 7/14/14 5/12/9
+f 1/15/15 3/16/16 8/13/13
+f 8/13/13 3/16/16 7/14/14
+s 4
+f 33/41/17 34/42/18 36/44/19
+f 36/44/19 34/42/18 35/43/20
+s 5
+f 2/2/21 4/4/22 10/18/23
+f 10/18/23 4/4/22 11/19/24
+s 6
+f 4/4/25 5/5/26 11/19/27
+f 11/19/27 5/5/26 12/20/28
+s 7
+f 37/45/29 33/41/30 38/46/31
+f 38/46/31 33/41/30 36/44/32
+s 8
+f 5/5/33 7/7/34 12/20/35
+f 12/20/35 7/7/34 14/22/36
+s 9
+f 39/47/37 37/45/38 40/48/39
+f 40/48/39 37/45/38 38/46/40
+s 10
+f 7/7/41 3/3/42 14/22/43
+f 14/22/43 3/3/42 16/24/44
+s 11
+f 3/3/45 1/1/46 16/24/47
+f 16/24/47 1/1/46 15/23/48
+s 12
+f 10/18/49 18/26/50 9/17/51
+f 9/17/51 18/26/50 17/25/52
+s 13
+f 10/18/53 11/19/54 18/26/55
+f 18/26/55 11/19/54 19/27/56
+s 14
+f 12/20/57 20/28/58 11/19/59
+f 11/19/59 20/28/58 19/27/60
+s 15
+f 13/21/61 9/17/62 21/29/63
+f 21/29/63 9/17/62 17/25/64
+s 16
+f 12/20/65 14/22/66 20/28/67
+f 20/28/67 14/22/66 22/30/68
+s 17
+f 15/23/69 13/21/70 23/31/71
+f 23/31/71 13/21/70 21/29/72
+s 18
+f 14/22/73 16/24/74 22/30/75
+f 22/30/75 16/24/74 24/32/76
+s 19
+f 15/23/77 23/31/78 16/24/79
+f 16/24/79 23/31/78 24/32/80
+s 20
+f 17/25/81 18/26/82 25/33/83
+f 25/33/83 18/26/82 26/34/84
+s 21
+f 18/26/85 19/27/86 26/34/87
+f 26/34/87 19/27/86 27/35/88
+s 22
+f 19/27/89 20/28/90 27/35/91
+f 27/35/91 20/28/90 28/36/92
+s 20
+f 21/29/93 17/25/81 29/37/94
+f 29/37/94 17/25/81 25/33/83
+s 23
+f 20/28/95 22/30/96 28/36/97
+f 28/36/97 22/30/96 30/38/98
+s 20
+f 23/31/99 21/29/93 31/39/100
+f 31/39/100 21/29/93 29/37/94
+s 24
+f 22/30/101 24/32/102 30/38/103
+f 30/38/103 24/32/102 32/40/104
+s 25
+f 24/32/105 23/31/106 32/40/107
+f 32/40/107 23/31/106 31/39/108
+s 2
+f 6/6/11 2/2/12 33/41/109
+f 33/41/109 2/2/12 34/42/110
+s 5
+f 2/2/21 10/18/23 34/42/111
+f 34/42/111 10/18/23 35/43/112
+s 26
+f 42/49/113 41/50/114 44/52/115
+f 44/52/115 41/50/114 43/51/116
+s 2
+f 8/8/13 6/6/11 37/45/117
+f 37/45/117 6/6/11 33/41/109
+s 26
+f 41/50/114 45/53/118 43/51/116
+f 43/51/116 45/53/118 46/54/119
+s 2
+f 1/1/15 8/8/13 39/47/120
+f 39/47/120 8/8/13 37/45/117
+s 26
+f 45/53/118 47/55/121 46/54/119
+f 46/54/119 47/55/121 48/56/122
+s 11
+f 15/23/48 1/1/46 40/48/123
+f 40/48/123 1/1/46 39/47/124
+s 27
+f 10/18/125 9/17/126 42/49/127
+f 42/49/127 9/17/126 41/50/128
+s 28
+f 36/44/129 35/43/130 43/51/131
+f 43/51/131 35/43/130 44/52/132
+s 29
+f 35/43/133 10/18/134 44/52/135
+f 44/52/135 10/18/134 42/49/136
+s 30
+f 9/17/137 13/21/138 41/50/139
+f 41/50/139 13/21/138 45/53/140
+s 31
+f 38/46/141 36/44/142 46/54/143
+f 46/54/143 36/44/142 43/51/144
+s 32
+f 13/21/145 15/23/146 45/53/147
+f 45/53/147 15/23/146 47/55/148
+s 33
+f 15/23/149 40/48/150 47/55/151
+f 47/55/151 40/48/150 48/56/152
+s 34
+f 40/48/153 38/46/154 48/56/155
+f 48/56/155 38/46/154 46/54/156
diff --git a/resources/arches.obj b/resources/arches.obj
new file mode 100644
index 00000000..5557e149
--- /dev/null
+++ b/resources/arches.obj
@@ -0,0 +1,1210 @@
+# This file uses centimeters as units for non-parametric coordinates.
+
+mtllib arches.mtl
+g default
+v -0.500000 0.405686 0.500000
+v -0.300000 0.405686 0.500000
+v -0.100000 0.405686 0.500000
+v 0.100000 0.405686 0.500000
+v 0.300000 0.405686 0.500000
+v 0.500000 0.405686 0.500000
+v -0.500000 1.000000 0.500000
+v -0.300000 1.000000 0.500000
+v -0.100000 1.000000 0.500000
+v 0.100000 1.000000 0.500000
+v 0.300000 1.000000 0.500000
+v 0.500000 1.000000 0.500000
+v -0.500000 1.000000 -0.500000
+v -0.300000 1.000000 -0.500000
+v -0.100000 1.000000 -0.500000
+v 0.100000 1.000000 -0.500000
+v 0.300000 1.000000 -0.500000
+v 0.500000 1.000000 -0.500000
+v -0.500000 0.405686 -0.500000
+v -0.300000 0.405686 -0.500000
+v -0.100000 0.405686 -0.500000
+v 0.100000 0.405686 -0.500000
+v 0.300000 0.405686 -0.500000
+v 0.500000 0.405686 -0.500000
+v -0.500000 0.000000 -0.500000
+v -0.300000 0.000000 -0.500000
+v -0.300000 0.000000 0.500000
+v -0.500000 0.000000 0.500000
+v -0.100000 0.000000 -0.500000
+v 0.100000 0.000000 -0.500000
+v 0.100000 0.000000 0.500000
+v -0.100000 0.000000 0.500000
+v 0.300000 0.000000 -0.500000
+v 0.500000 0.000000 -0.500000
+v 0.500000 0.000000 0.500000
+v 0.300000 0.000000 0.500000
+v -0.166667 0.470478 0.500000
+v -0.166667 1.000000 0.500000
+v -0.166667 1.000000 -0.500000
+v -0.166667 0.470478 -0.500000
+v -0.233333 0.470478 0.500000
+v -0.233333 1.000000 0.500000
+v -0.233333 1.000000 -0.500000
+v -0.233333 0.470478 -0.500000
+v 0.233333 0.470478 0.500000
+v 0.233333 1.000000 0.500000
+v 0.233333 1.000000 -0.500000
+v 0.233333 0.470478 -0.500000
+v 0.166667 0.470478 0.500000
+v 0.166667 1.000000 0.500000
+v 0.166667 1.000000 -0.500000
+v 0.166667 0.470478 -0.500000
+vt 0.375000 0.000000
+vt 0.425000 0.000000
+vt 0.475000 0.000000
+vt 0.525000 0.000000
+vt 0.575000 0.000000
+vt 0.625000 0.000000
+vt 0.375000 0.250000
+vt 0.425000 0.250000
+vt 0.475000 0.250000
+vt 0.525000 0.250000
+vt 0.575000 0.250000
+vt 0.625000 0.250000
+vt 0.375000 0.500000
+vt 0.425000 0.500000
+vt 0.475000 0.500000
+vt 0.525000 0.500000
+vt 0.575000 0.500000
+vt 0.625000 0.500000
+vt 0.375000 0.750000
+vt 0.425000 0.750000
+vt 0.475000 0.750000
+vt 0.525000 0.750000
+vt 0.575000 0.750000
+vt 0.625000 0.750000
+vt 0.375000 1.000000
+vt 0.425000 1.000000
+vt 0.475000 1.000000
+vt 0.525000 1.000000
+vt 0.575000 1.000000
+vt 0.625000 1.000000
+vt 0.875000 0.000000
+vt 0.875000 0.250000
+vt 0.125000 0.000000
+vt 0.125000 0.250000
+vt 0.375000 0.750000
+vt 0.425000 0.750000
+vt 0.425000 1.000000
+vt 0.375000 1.000000
+vt 0.475000 0.750000
+vt 0.525000 0.750000
+vt 0.525000 1.000000
+vt 0.475000 1.000000
+vt 0.575000 0.750000
+vt 0.625000 0.750000
+vt 0.625000 1.000000
+vt 0.575000 1.000000
+vt 0.458333 0.000000
+vt 0.458333 1.000000
+vt 0.458333 0.250000
+vt 0.458333 0.500000
+vt 0.458333 0.750000
+vt 0.441667 0.000000
+vt 0.441667 1.000000
+vt 0.441667 0.250000
+vt 0.441667 0.500000
+vt 0.441667 0.750000
+vt 0.558333 0.000000
+vt 0.558333 1.000000
+vt 0.558333 0.250000
+vt 0.558333 0.500000
+vt 0.558333 0.750000
+vt 0.541667 0.000000
+vt 0.541667 1.000000
+vt 0.541667 0.250000
+vt 0.541667 0.500000
+vt 0.541667 0.750000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.696955 -0.717115 0.000000
+vn 0.437071 -0.899427 0.000000
+vn 0.696955 -0.717115 0.000000
+vn 0.437071 -0.899427 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.696955 -0.717115 0.000000
+vn 0.437071 -0.899427 0.000000
+vn 0.696955 -0.717115 0.000000
+vn 0.437071 -0.899427 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn -0.437071 -0.899427 0.000000
+vn -0.437071 -0.899427 0.000000
+vn -0.696955 -0.717115 0.000000
+vn -0.696955 -0.717115 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn -0.437071 -0.899427 0.000000
+vn -0.437071 -0.899427 0.000000
+vn -0.696955 -0.717115 0.000000
+vn -0.696954 -0.717115 0.000000
+s 1
+g pCube2
+usemtl initialShadingGroup
+f 1/1/1 2/2/2 7/7/3
+f 7/7/3 2/2/2 8/8/4
+f 2/2/2 41/52/5 8/8/4
+f 8/8/4 41/52/5 42/54/6
+f 3/3/7 4/4/8 9/9/9
+f 9/9/9 4/4/8 10/10/10
+f 4/4/8 49/62/11 10/10/10
+f 10/10/10 49/62/11 50/64/12
+f 5/5/13 6/6/14 11/11/15
+f 11/11/15 6/6/14 12/12/16
+s 4
+f 7/7/17 8/8/18 13/13/19
+f 13/13/19 8/8/18 14/14/20
+f 8/8/18 42/54/21 14/14/20
+f 14/14/20 42/54/21 43/55/22
+f 9/9/23 10/10/24 15/15/25
+f 15/15/25 10/10/24 16/16/26
+f 10/10/24 50/64/27 16/16/26
+f 16/16/26 50/64/27 51/65/28
+f 11/11/29 12/12/30 17/17/31
+f 17/17/31 12/12/30 18/18/32
+s 7
+f 13/13/33 14/14/34 19/19/35
+f 19/19/35 14/14/34 20/20/36
+f 43/55/37 44/56/38 14/14/34
+f 14/14/34 44/56/38 20/20/36
+f 15/15/39 16/16/40 21/21/41
+f 21/21/41 16/16/40 22/22/42
+f 51/65/43 52/66/44 16/16/40
+f 16/16/40 52/66/44 22/22/42
+f 17/17/45 18/18/46 23/23/47
+f 23/23/47 18/18/46 24/24/48
+s 12
+f 25/35/49 26/36/50 28/38/51
+f 28/38/51 26/36/50 27/37/52
+s 13
+f 20/20/53 44/56/54 2/26/55
+f 2/26/55 44/56/54 41/53/56
+s 14
+f 29/39/57 30/40/58 32/42/59
+f 32/42/59 30/40/58 31/41/60
+s 15
+f 22/22/61 52/66/62 4/28/63
+f 4/28/63 52/66/62 49/63/64
+s 16
+f 33/43/65 34/44/66 36/46/67
+f 36/46/67 34/44/66 35/45/68
+s 17
+f 6/6/69 24/31/70 12/12/71
+f 12/12/71 24/31/70 18/32/72
+s 18
+f 19/33/73 1/1/74 13/34/75
+f 13/34/75 1/1/74 7/7/76
+s 19
+f 19/19/77 20/20/78 25/35/79
+f 25/35/79 20/20/78 26/36/80
+s 20
+f 20/20/81 2/26/82 26/36/83
+f 26/36/83 2/26/82 27/37/84
+s 21
+f 2/26/85 1/25/86 27/37/87
+f 27/37/87 1/25/86 28/38/88
+s 22
+f 1/25/89 19/19/90 28/38/91
+f 28/38/91 19/19/90 25/35/92
+s 23
+f 21/21/93 22/22/94 29/39/95
+f 29/39/95 22/22/94 30/40/96
+s 24
+f 22/22/97 4/28/98 30/40/99
+f 30/40/99 4/28/98 31/41/100
+s 25
+f 4/28/101 3/27/102 31/41/103
+f 31/41/103 3/27/102 32/42/104
+s 26
+f 3/27/105 21/21/106 32/42/107
+f 32/42/107 21/21/106 29/39/108
+s 27
+f 23/23/109 24/24/110 33/43/111
+f 33/43/111 24/24/110 34/44/112
+s 28
+f 24/24/113 6/30/114 34/44/115
+f 34/44/115 6/30/114 35/45/116
+s 29
+f 6/30/117 5/29/118 35/45/119
+f 35/45/119 5/29/118 36/46/120
+s 30
+f 5/29/121 23/23/122 36/46/123
+f 36/46/123 23/23/122 33/43/124
+s 1
+f 3/3/7 9/9/9 37/47/125
+f 37/47/125 9/9/9 38/49/126
+s 4
+f 39/50/127 38/49/128 15/15/25
+f 15/15/25 38/49/128 9/9/23
+s 7
+f 39/50/129 15/15/39 40/51/130
+f 40/51/130 15/15/39 21/21/41
+s 13
+f 37/48/131 40/51/132 3/27/133
+f 3/27/133 40/51/132 21/21/134
+s 1
+f 41/52/5 37/47/125 42/54/6
+f 42/54/6 37/47/125 38/49/126
+s 4
+f 43/55/22 42/54/21 39/50/127
+f 39/50/127 42/54/21 38/49/128
+s 7
+f 44/56/38 43/55/37 40/51/130
+f 40/51/130 43/55/37 39/50/129
+s 13
+f 41/53/56 44/56/54 37/48/131
+f 37/48/131 44/56/54 40/51/132
+s 1
+f 5/5/13 11/11/15 45/57/135
+f 45/57/135 11/11/15 46/59/136
+s 4
+f 47/60/137 46/59/138 17/17/31
+f 17/17/31 46/59/138 11/11/29
+s 7
+f 47/60/139 17/17/45 48/61/140
+f 48/61/140 17/17/45 23/23/47
+s 15
+f 45/58/141 48/61/142 5/29/143
+f 5/29/143 48/61/142 23/23/144
+s 1
+f 49/62/11 45/57/135 50/64/12
+f 50/64/12 45/57/135 46/59/136
+s 4
+f 51/65/28 50/64/27 47/60/137
+f 47/60/137 50/64/27 46/59/138
+s 7
+f 52/66/44 51/65/43 48/61/140
+f 48/61/140 51/65/43 47/60/139
+s 15
+f 49/63/64 52/66/62 45/58/141
+f 45/58/141 52/66/62 48/61/142
+g default
+v -0.500000 0.405686 0.500000
+v -0.300000 0.405686 0.500000
+v -0.100000 0.405686 0.500000
+v 0.100000 0.405686 0.500000
+v 0.300000 0.405686 0.500000
+v 0.500000 0.405686 0.500000
+v -0.500000 1.000000 0.500000
+v -0.300000 1.000000 0.500000
+v -0.100000 1.000000 0.500000
+v 0.100000 1.000000 0.500000
+v 0.300000 1.000000 0.500000
+v 0.500000 1.000000 0.500000
+v -0.500000 1.000000 -0.500000
+v -0.300000 1.000000 -0.500000
+v -0.100000 1.000000 -0.500000
+v 0.100000 1.000000 -0.500000
+v 0.300000 1.000000 -0.500000
+v 0.500000 1.000000 -0.500000
+v -0.500000 0.405686 -0.500000
+v -0.300000 0.405686 -0.500000
+v -0.100000 0.405686 -0.500000
+v 0.100000 0.405686 -0.500000
+v 0.300000 0.405686 -0.500000
+v 0.500000 0.405686 -0.500000
+v -0.500000 0.000000 -0.500000
+v -0.300000 0.000000 -0.500000
+v -0.300000 0.000000 0.500000
+v -0.500000 0.000000 0.500000
+v -0.100000 0.000000 -0.500000
+v 0.100000 0.000000 -0.500000
+v 0.100000 0.000000 0.500000
+v -0.100000 0.000000 0.500000
+v 0.300000 0.000000 -0.500000
+v 0.500000 0.000000 -0.500000
+v 0.500000 0.000000 0.500000
+v 0.300000 0.000000 0.500000
+v -0.166667 0.470478 0.500000
+v -0.166667 1.000000 0.500000
+v -0.166667 1.000000 -0.500000
+v -0.166667 0.470478 -0.500000
+v -0.233333 0.470478 0.500000
+v -0.233333 1.000000 0.500000
+v -0.233333 1.000000 -0.500000
+v -0.233333 0.470478 -0.500000
+v 0.233333 0.470478 0.500000
+v 0.233333 1.000000 0.500000
+v 0.233333 1.000000 -0.500000
+v 0.233333 0.470478 -0.500000
+v 0.166667 0.470478 0.500000
+v 0.166667 1.000000 0.500000
+v 0.166667 1.000000 -0.500000
+v 0.166667 0.470478 -0.500000
+vt 0.375000 0.000000
+vt 0.425000 0.000000
+vt 0.475000 0.000000
+vt 0.525000 0.000000
+vt 0.575000 0.000000
+vt 0.625000 0.000000
+vt 0.375000 0.250000
+vt 0.425000 0.250000
+vt 0.475000 0.250000
+vt 0.525000 0.250000
+vt 0.575000 0.250000
+vt 0.625000 0.250000
+vt 0.375000 0.500000
+vt 0.425000 0.500000
+vt 0.475000 0.500000
+vt 0.525000 0.500000
+vt 0.575000 0.500000
+vt 0.625000 0.500000
+vt 0.375000 0.750000
+vt 0.425000 0.750000
+vt 0.475000 0.750000
+vt 0.525000 0.750000
+vt 0.575000 0.750000
+vt 0.625000 0.750000
+vt 0.375000 1.000000
+vt 0.425000 1.000000
+vt 0.475000 1.000000
+vt 0.525000 1.000000
+vt 0.575000 1.000000
+vt 0.625000 1.000000
+vt 0.875000 0.000000
+vt 0.875000 0.250000
+vt 0.125000 0.000000
+vt 0.125000 0.250000
+vt 0.375000 0.750000
+vt 0.425000 0.750000
+vt 0.425000 1.000000
+vt 0.375000 1.000000
+vt 0.475000 0.750000
+vt 0.525000 0.750000
+vt 0.525000 1.000000
+vt 0.475000 1.000000
+vt 0.575000 0.750000
+vt 0.625000 0.750000
+vt 0.625000 1.000000
+vt 0.575000 1.000000
+vt 0.458333 0.000000
+vt 0.458333 1.000000
+vt 0.458333 0.250000
+vt 0.458333 0.500000
+vt 0.458333 0.750000
+vt 0.441667 0.000000
+vt 0.441667 1.000000
+vt 0.441667 0.250000
+vt 0.441667 0.500000
+vt 0.441667 0.750000
+vt 0.558333 0.000000
+vt 0.558333 1.000000
+vt 0.558333 0.250000
+vt 0.558333 0.500000
+vt 0.558333 0.750000
+vt 0.541667 0.000000
+vt 0.541667 1.000000
+vt 0.541667 0.250000
+vt 0.541667 0.500000
+vt 0.541667 0.750000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.696955 -0.717115 0.000000
+vn 0.437071 -0.899427 0.000000
+vn 0.696955 -0.717115 0.000000
+vn 0.437071 -0.899427 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.696955 -0.717115 0.000000
+vn 0.437071 -0.899427 0.000000
+vn 0.696955 -0.717115 0.000000
+vn 0.437071 -0.899427 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn -0.437071 -0.899427 0.000000
+vn -0.437071 -0.899427 0.000000
+vn -0.696955 -0.717115 0.000000
+vn -0.696955 -0.717115 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn -0.437071 -0.899427 0.000000
+vn -0.437071 -0.899427 0.000000
+vn -0.696955 -0.717115 0.000000
+vn -0.696954 -0.717115 0.000000
+s 1
+g pCube2
+f 53/67/145 54/68/146 59/73/147
+f 59/73/147 54/68/146 60/74/148
+f 54/68/146 93/118/149 60/74/148
+f 60/74/148 93/118/149 94/120/150
+f 55/69/151 56/70/152 61/75/153
+f 61/75/153 56/70/152 62/76/154
+f 56/70/152 101/128/155 62/76/154
+f 62/76/154 101/128/155 102/130/156
+f 57/71/157 58/72/158 63/77/159
+f 63/77/159 58/72/158 64/78/160
+s 4
+f 59/73/161 60/74/162 65/79/163
+f 65/79/163 60/74/162 66/80/164
+f 60/74/162 94/120/165 66/80/164
+f 66/80/164 94/120/165 95/121/166
+f 61/75/167 62/76/168 67/81/169
+f 67/81/169 62/76/168 68/82/170
+f 62/76/168 102/130/171 68/82/170
+f 68/82/170 102/130/171 103/131/172
+f 63/77/173 64/78/174 69/83/175
+f 69/83/175 64/78/174 70/84/176
+s 7
+f 65/79/177 66/80/178 71/85/179
+f 71/85/179 66/80/178 72/86/180
+f 95/121/181 96/122/182 66/80/178
+f 66/80/178 96/122/182 72/86/180
+f 67/81/183 68/82/184 73/87/185
+f 73/87/185 68/82/184 74/88/186
+f 103/131/187 104/132/188 68/82/184
+f 68/82/184 104/132/188 74/88/186
+f 69/83/189 70/84/190 75/89/191
+f 75/89/191 70/84/190 76/90/192
+s 12
+f 77/101/193 78/102/194 80/104/195
+f 80/104/195 78/102/194 79/103/196
+s 13
+f 72/86/197 96/122/198 54/92/199
+f 54/92/199 96/122/198 93/119/200
+s 14
+f 81/105/201 82/106/202 84/108/203
+f 84/108/203 82/106/202 83/107/204
+s 15
+f 74/88/205 104/132/206 56/94/207
+f 56/94/207 104/132/206 101/129/208
+s 16
+f 85/109/209 86/110/210 88/112/211
+f 88/112/211 86/110/210 87/111/212
+s 17
+f 58/72/213 76/97/214 64/78/215
+f 64/78/215 76/97/214 70/98/216
+s 18
+f 71/99/217 53/67/218 65/100/219
+f 65/100/219 53/67/218 59/73/220
+s 19
+f 71/85/221 72/86/222 77/101/223
+f 77/101/223 72/86/222 78/102/224
+s 20
+f 72/86/225 54/92/226 78/102/227
+f 78/102/227 54/92/226 79/103/228
+s 21
+f 54/92/229 53/91/230 79/103/231
+f 79/103/231 53/91/230 80/104/232
+s 22
+f 53/91/233 71/85/234 80/104/235
+f 80/104/235 71/85/234 77/101/236
+s 23
+f 73/87/237 74/88/238 81/105/239
+f 81/105/239 74/88/238 82/106/240
+s 24
+f 74/88/241 56/94/242 82/106/243
+f 82/106/243 56/94/242 83/107/244
+s 25
+f 56/94/245 55/93/246 83/107/247
+f 83/107/247 55/93/246 84/108/248
+s 26
+f 55/93/249 73/87/250 84/108/251
+f 84/108/251 73/87/250 81/105/252
+s 27
+f 75/89/253 76/90/254 85/109/255
+f 85/109/255 76/90/254 86/110/256
+s 28
+f 76/90/257 58/96/258 86/110/259
+f 86/110/259 58/96/258 87/111/260
+s 29
+f 58/96/261 57/95/262 87/111/263
+f 87/111/263 57/95/262 88/112/264
+s 30
+f 57/95/265 75/89/266 88/112/267
+f 88/112/267 75/89/266 85/109/268
+s 1
+f 55/69/151 61/75/153 89/113/269
+f 89/113/269 61/75/153 90/115/270
+s 4
+f 91/116/271 90/115/272 67/81/169
+f 67/81/169 90/115/272 61/75/167
+s 7
+f 91/116/273 67/81/183 92/117/274
+f 92/117/274 67/81/183 73/87/185
+s 13
+f 89/114/275 92/117/276 55/93/277
+f 55/93/277 92/117/276 73/87/278
+s 1
+f 93/118/149 89/113/269 94/120/150
+f 94/120/150 89/113/269 90/115/270
+s 4
+f 95/121/166 94/120/165 91/116/271
+f 91/116/271 94/120/165 90/115/272
+s 7
+f 96/122/182 95/121/181 92/117/274
+f 92/117/274 95/121/181 91/116/273
+s 13
+f 93/119/200 96/122/198 89/114/275
+f 89/114/275 96/122/198 92/117/276
+s 1
+f 57/71/157 63/77/159 97/123/279
+f 97/123/279 63/77/159 98/125/280
+s 4
+f 99/126/281 98/125/282 69/83/175
+f 69/83/175 98/125/282 63/77/173
+s 7
+f 99/126/283 69/83/189 100/127/284
+f 100/127/284 69/83/189 75/89/191
+s 15
+f 97/124/285 100/127/286 57/95/287
+f 57/95/287 100/127/286 75/89/288
+s 1
+f 101/128/155 97/123/279 102/130/156
+f 102/130/156 97/123/279 98/125/280
+s 4
+f 103/131/172 102/130/171 99/126/281
+f 99/126/281 102/130/171 98/125/282
+s 7
+f 104/132/188 103/131/187 100/127/284
+f 100/127/284 103/131/187 99/126/283
+s 15
+f 101/129/208 104/132/206 97/124/285
+f 97/124/285 104/132/206 100/127/286
+g default
+v -0.500000 0.405686 0.500000
+v -0.300000 0.405686 0.500000
+v -0.100000 0.405686 0.500000
+v 0.100000 0.405686 0.500000
+v 0.300000 0.405686 0.500000
+v 0.500000 0.405686 0.500000
+v -0.500000 1.000000 0.500000
+v -0.300000 1.000000 0.500000
+v -0.100000 1.000000 0.500000
+v 0.100000 1.000000 0.500000
+v 0.300000 1.000000 0.500000
+v 0.500000 1.000000 0.500000
+v -0.500000 1.000000 -0.500000
+v -0.300000 1.000000 -0.500000
+v -0.100000 1.000000 -0.500000
+v 0.100000 1.000000 -0.500000
+v 0.300000 1.000000 -0.500000
+v 0.500000 1.000000 -0.500000
+v -0.500000 0.405686 -0.500000
+v -0.300000 0.405686 -0.500000
+v -0.100000 0.405686 -0.500000
+v 0.100000 0.405686 -0.500000
+v 0.300000 0.405686 -0.500000
+v 0.500000 0.405686 -0.500000
+v -0.500000 0.000000 -0.500000
+v -0.300000 0.000000 -0.500000
+v -0.300000 0.000000 0.500000
+v -0.500000 0.000000 0.500000
+v -0.100000 0.000000 -0.500000
+v 0.100000 0.000000 -0.500000
+v 0.100000 0.000000 0.500000
+v -0.100000 0.000000 0.500000
+v 0.300000 0.000000 -0.500000
+v 0.500000 0.000000 -0.500000
+v 0.500000 0.000000 0.500000
+v 0.300000 0.000000 0.500000
+v -0.166667 0.470478 0.500000
+v -0.166667 1.000000 0.500000
+v -0.166667 1.000000 -0.500000
+v -0.166667 0.470478 -0.500000
+v -0.233333 0.470478 0.500000
+v -0.233333 1.000000 0.500000
+v -0.233333 1.000000 -0.500000
+v -0.233333 0.470478 -0.500000
+v 0.233333 0.470478 0.500000
+v 0.233333 1.000000 0.500000
+v 0.233333 1.000000 -0.500000
+v 0.233333 0.470478 -0.500000
+v 0.166667 0.470478 0.500000
+v 0.166667 1.000000 0.500000
+v 0.166667 1.000000 -0.500000
+v 0.166667 0.470478 -0.500000
+vt 0.375000 0.000000
+vt 0.425000 0.000000
+vt 0.475000 0.000000
+vt 0.525000 0.000000
+vt 0.575000 0.000000
+vt 0.625000 0.000000
+vt 0.375000 0.250000
+vt 0.425000 0.250000
+vt 0.475000 0.250000
+vt 0.525000 0.250000
+vt 0.575000 0.250000
+vt 0.625000 0.250000
+vt 0.375000 0.500000
+vt 0.425000 0.500000
+vt 0.475000 0.500000
+vt 0.525000 0.500000
+vt 0.575000 0.500000
+vt 0.625000 0.500000
+vt 0.375000 0.750000
+vt 0.425000 0.750000
+vt 0.475000 0.750000
+vt 0.525000 0.750000
+vt 0.575000 0.750000
+vt 0.625000 0.750000
+vt 0.375000 1.000000
+vt 0.425000 1.000000
+vt 0.475000 1.000000
+vt 0.525000 1.000000
+vt 0.575000 1.000000
+vt 0.625000 1.000000
+vt 0.875000 0.000000
+vt 0.875000 0.250000
+vt 0.125000 0.000000
+vt 0.125000 0.250000
+vt 0.375000 0.750000
+vt 0.425000 0.750000
+vt 0.425000 1.000000
+vt 0.375000 1.000000
+vt 0.475000 0.750000
+vt 0.525000 0.750000
+vt 0.525000 1.000000
+vt 0.475000 1.000000
+vt 0.575000 0.750000
+vt 0.625000 0.750000
+vt 0.625000 1.000000
+vt 0.575000 1.000000
+vt 0.458333 0.000000
+vt 0.458333 1.000000
+vt 0.458333 0.250000
+vt 0.458333 0.500000
+vt 0.458333 0.750000
+vt 0.441667 0.000000
+vt 0.441667 1.000000
+vt 0.441667 0.250000
+vt 0.441667 0.500000
+vt 0.441667 0.750000
+vt 0.558333 0.000000
+vt 0.558333 1.000000
+vt 0.558333 0.250000
+vt 0.558333 0.500000
+vt 0.558333 0.750000
+vt 0.541667 0.000000
+vt 0.541667 1.000000
+vt 0.541667 0.250000
+vt 0.541667 0.500000
+vt 0.541667 0.750000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.696955 -0.717115 0.000000
+vn 0.437071 -0.899427 0.000000
+vn 0.696955 -0.717115 0.000000
+vn 0.437071 -0.899427 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.696955 -0.717115 0.000000
+vn 0.437071 -0.899427 0.000000
+vn 0.696955 -0.717115 0.000000
+vn 0.437071 -0.899427 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn -0.437071 -0.899427 0.000000
+vn -0.437071 -0.899427 0.000000
+vn -0.696955 -0.717115 0.000000
+vn -0.696955 -0.717115 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn -0.437071 -0.899427 0.000000
+vn -0.437071 -0.899427 0.000000
+vn -0.696955 -0.717115 0.000000
+vn -0.696954 -0.717115 0.000000
+s 1
+g pCube2
+f 105/133/289 106/134/290 111/139/291
+f 111/139/291 106/134/290 112/140/292
+f 106/134/290 145/184/293 112/140/292
+f 112/140/292 145/184/293 146/186/294
+f 107/135/295 108/136/296 113/141/297
+f 113/141/297 108/136/296 114/142/298
+f 108/136/296 153/194/299 114/142/298
+f 114/142/298 153/194/299 154/196/300
+f 109/137/301 110/138/302 115/143/303
+f 115/143/303 110/138/302 116/144/304
+s 4
+f 111/139/305 112/140/306 117/145/307
+f 117/145/307 112/140/306 118/146/308
+f 112/140/306 146/186/309 118/146/308
+f 118/146/308 146/186/309 147/187/310
+f 113/141/311 114/142/312 119/147/313
+f 119/147/313 114/142/312 120/148/314
+f 114/142/312 154/196/315 120/148/314
+f 120/148/314 154/196/315 155/197/316
+f 115/143/317 116/144/318 121/149/319
+f 121/149/319 116/144/318 122/150/320
+s 7
+f 117/145/321 118/146/322 123/151/323
+f 123/151/323 118/146/322 124/152/324
+f 147/187/325 148/188/326 118/146/322
+f 118/146/322 148/188/326 124/152/324
+f 119/147/327 120/148/328 125/153/329
+f 125/153/329 120/148/328 126/154/330
+f 155/197/331 156/198/332 120/148/328
+f 120/148/328 156/198/332 126/154/330
+f 121/149/333 122/150/334 127/155/335
+f 127/155/335 122/150/334 128/156/336
+s 12
+f 129/167/337 130/168/338 132/170/339
+f 132/170/339 130/168/338 131/169/340
+s 13
+f 124/152/341 148/188/342 106/158/343
+f 106/158/343 148/188/342 145/185/344
+s 14
+f 133/171/345 134/172/346 136/174/347
+f 136/174/347 134/172/346 135/173/348
+s 15
+f 126/154/349 156/198/350 108/160/351
+f 108/160/351 156/198/350 153/195/352
+s 16
+f 137/175/353 138/176/354 140/178/355
+f 140/178/355 138/176/354 139/177/356
+s 17
+f 110/138/357 128/163/358 116/144/359
+f 116/144/359 128/163/358 122/164/360
+s 18
+f 123/165/361 105/133/362 117/166/363
+f 117/166/363 105/133/362 111/139/364
+s 19
+f 123/151/365 124/152/366 129/167/367
+f 129/167/367 124/152/366 130/168/368
+s 20
+f 124/152/369 106/158/370 130/168/371
+f 130/168/371 106/158/370 131/169/372
+s 21
+f 106/158/373 105/157/374 131/169/375
+f 131/169/375 105/157/374 132/170/376
+s 22
+f 105/157/377 123/151/378 132/170/379
+f 132/170/379 123/151/378 129/167/380
+s 23
+f 125/153/381 126/154/382 133/171/383
+f 133/171/383 126/154/382 134/172/384
+s 24
+f 126/154/385 108/160/386 134/172/387
+f 134/172/387 108/160/386 135/173/388
+s 25
+f 108/160/389 107/159/390 135/173/391
+f 135/173/391 107/159/390 136/174/392
+s 26
+f 107/159/393 125/153/394 136/174/395
+f 136/174/395 125/153/394 133/171/396
+s 27
+f 127/155/397 128/156/398 137/175/399
+f 137/175/399 128/156/398 138/176/400
+s 28
+f 128/156/401 110/162/402 138/176/403
+f 138/176/403 110/162/402 139/177/404
+s 29
+f 110/162/405 109/161/406 139/177/407
+f 139/177/407 109/161/406 140/178/408
+s 30
+f 109/161/409 127/155/410 140/178/411
+f 140/178/411 127/155/410 137/175/412
+s 1
+f 107/135/295 113/141/297 141/179/413
+f 141/179/413 113/141/297 142/181/414
+s 4
+f 143/182/415 142/181/416 119/147/313
+f 119/147/313 142/181/416 113/141/311
+s 7
+f 143/182/417 119/147/327 144/183/418
+f 144/183/418 119/147/327 125/153/329
+s 13
+f 141/180/419 144/183/420 107/159/421
+f 107/159/421 144/183/420 125/153/422
+s 1
+f 145/184/293 141/179/413 146/186/294
+f 146/186/294 141/179/413 142/181/414
+s 4
+f 147/187/310 146/186/309 143/182/415
+f 143/182/415 146/186/309 142/181/416
+s 7
+f 148/188/326 147/187/325 144/183/418
+f 144/183/418 147/187/325 143/182/417
+s 13
+f 145/185/344 148/188/342 141/180/419
+f 141/180/419 148/188/342 144/183/420
+s 1
+f 109/137/301 115/143/303 149/189/423
+f 149/189/423 115/143/303 150/191/424
+s 4
+f 151/192/425 150/191/426 121/149/319
+f 121/149/319 150/191/426 115/143/317
+s 7
+f 151/192/427 121/149/333 152/193/428
+f 152/193/428 121/149/333 127/155/335
+s 15
+f 149/190/429 152/193/430 109/161/431
+f 109/161/431 152/193/430 127/155/432
+s 1
+f 153/194/299 149/189/423 154/196/300
+f 154/196/300 149/189/423 150/191/424
+s 4
+f 155/197/316 154/196/315 151/192/425
+f 151/192/425 154/196/315 150/191/426
+s 7
+f 156/198/332 155/197/331 152/193/428
+f 152/193/428 155/197/331 151/192/427
+s 15
+f 153/195/352 156/198/350 149/190/429
+f 149/190/429 156/198/350 152/193/430
diff --git a/resources/denethor.jpg b/resources/denethor.jpg
new file mode 100644
index 00000000..bac21483
Binary files /dev/null and b/resources/denethor.jpg differ
diff --git a/resources/emplacement.obj b/resources/emplacement.obj
new file mode 100644
index 00000000..59bbfc7a
--- /dev/null
+++ b/resources/emplacement.obj
@@ -0,0 +1,295 @@
+# This file uses centimeters as units for non-parametric coordinates.
+
+mtllib emplacement.mtl
+g default
+v -0.500000 -0.376818 0.250000
+v -0.300000 -0.376818 0.250000
+v -0.100000 -0.376818 0.250000
+v 0.100000 -0.376818 0.250000
+v 0.300000 -0.376818 0.250000
+v 0.500000 -0.376818 0.250000
+v -0.500000 0.004471 0.250000
+v -0.300000 0.004471 0.250000
+v -0.100000 0.004471 0.250000
+v 0.100000 0.004471 0.250000
+v 0.300000 0.004471 0.250000
+v 0.500000 0.004471 0.250000
+v -0.500000 0.004471 -0.250000
+v -0.300000 0.004471 -0.250000
+v -0.100000 0.004471 -0.250000
+v 0.100000 0.004471 -0.250000
+v 0.300000 0.004471 -0.250000
+v 0.500000 0.004471 -0.250000
+v -0.500000 -0.376818 -0.250000
+v -0.300000 -0.376818 -0.250000
+v -0.100000 -0.376818 -0.250000
+v 0.100000 -0.376818 -0.250000
+v 0.300000 -0.376818 -0.250000
+v 0.500000 -0.376818 -0.250000
+v -0.500000 -0.995529 -0.250000
+v -0.300000 -0.995529 -0.250000
+v -0.100000 -0.995529 -0.250000
+v 0.100000 -0.995529 -0.250000
+v 0.300000 -0.995529 -0.250000
+v 0.500000 -0.995529 -0.250000
+v -0.166667 -0.303412 0.250000
+v -0.166667 0.004471 0.250000
+v -0.166667 0.004471 -0.250000
+v -0.166667 -0.303412 -0.250000
+v -0.233333 -0.303412 0.250000
+v -0.233333 0.004471 0.250000
+v -0.233333 0.004471 -0.250000
+v -0.233333 -0.303412 -0.250000
+v 0.233333 -0.303412 0.250000
+v 0.233333 0.004471 0.250000
+v 0.233333 0.004471 -0.250000
+v 0.233333 -0.303412 -0.250000
+v 0.166667 -0.303412 0.250000
+v 0.166667 0.004471 0.250000
+v 0.166667 0.004471 -0.250000
+v 0.166667 -0.303412 -0.250000
+vt 0.375000 0.000000
+vt 0.425000 0.000000
+vt 0.475000 0.000000
+vt 0.525000 0.000000
+vt 0.575000 0.000000
+vt 0.625000 0.000000
+vt 0.375000 0.250000
+vt 0.425000 0.250000
+vt 0.475000 0.250000
+vt 0.525000 0.250000
+vt 0.575000 0.250000
+vt 0.625000 0.250000
+vt 0.375000 0.500000
+vt 0.425000 0.500000
+vt 0.475000 0.500000
+vt 0.525000 0.500000
+vt 0.575000 0.500000
+vt 0.625000 0.500000
+vt 0.375000 0.750000
+vt 0.425000 0.750000
+vt 0.475000 0.750000
+vt 0.525000 0.750000
+vt 0.575000 0.750000
+vt 0.625000 0.750000
+vt 0.375000 1.000000
+vt 0.425000 1.000000
+vt 0.475000 1.000000
+vt 0.525000 1.000000
+vt 0.575000 1.000000
+vt 0.625000 1.000000
+vt 0.875000 0.000000
+vt 0.875000 0.250000
+vt 0.125000 0.000000
+vt 0.125000 0.250000
+vt 0.375000 0.875000
+vt 0.425000 0.875000
+vt 0.475000 0.875000
+vt 0.525000 0.875000
+vt 0.575000 0.875000
+vt 0.625000 0.875000
+vt 0.458333 0.000000
+vt 0.458333 1.000000
+vt 0.458333 0.250000
+vt 0.458333 0.500000
+vt 0.458333 0.750000
+vt 0.441667 0.000000
+vt 0.441667 1.000000
+vt 0.441667 0.250000
+vt 0.441667 0.500000
+vt 0.441667 0.750000
+vt 0.558333 0.000000
+vt 0.558333 1.000000
+vt 0.558333 0.250000
+vt 0.558333 0.500000
+vt 0.558333 0.750000
+vt 0.541667 0.000000
+vt 0.541667 1.000000
+vt 0.541667 0.250000
+vt 0.541667 0.500000
+vt 0.541667 0.750000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn -0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.740275 -0.672305 0.000000
+vn 0.482289 -0.876012 0.000000
+vn 0.740274 -0.672305 0.000000
+vn 0.482288 -0.876013 0.000000
+vn 0.740275 -0.672305 0.000000
+vn 0.482289 -0.876012 0.000000
+vn 0.740274 -0.672305 0.000000
+vn 0.482288 -0.876013 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 -0.628544 0.777774
+vn 0.000000 -0.628544 0.777774
+vn 0.000000 -0.628544 0.777774
+vn 0.000000 -0.628544 0.777774
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 -0.628544 0.777774
+vn 0.000000 -0.628544 0.777774
+vn 0.000000 -0.628544 0.777774
+vn 0.000000 -0.628544 0.777774
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn -0.000000 -0.628544 0.777774
+vn -0.000000 -0.628544 0.777774
+vn -0.000000 -0.628544 0.777774
+vn 0.000000 -0.628544 0.777774
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn -0.482288 -0.876013 0.000000
+vn -0.482288 -0.876012 0.000000
+vn -0.740274 -0.672305 0.000000
+vn -0.740274 -0.672305 0.000000
+vn -0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn -0.482288 -0.876012 0.000000
+vn -0.482288 -0.876013 0.000000
+vn -0.740275 -0.672305 0.000000
+vn -0.740274 -0.672305 0.000000
+s 1
+g pCube1
+usemtl initialShadingGroup
+f 1/1/1 2/2/2 7/7/3
+f 7/7/3 2/2/2 8/8/4
+f 2/2/2 35/46/5 8/8/4
+f 8/8/4 35/46/5 36/48/6
+f 3/3/7 4/4/8 9/9/9
+f 9/9/9 4/4/8 10/10/10
+f 4/4/8 43/56/11 10/10/10
+f 10/10/10 43/56/11 44/58/12
+f 5/5/13 6/6/14 11/11/15
+f 11/11/15 6/6/14 12/12/16
+s 4
+f 7/7/17 8/8/18 13/13/19
+f 13/13/19 8/8/18 14/14/20
+f 8/8/18 36/48/21 14/14/20
+f 14/14/20 36/48/21 37/49/22
+f 9/9/23 10/10/24 15/15/25
+f 15/15/25 10/10/24 16/16/26
+f 10/10/24 44/58/27 16/16/26
+f 16/16/26 44/58/27 45/59/28
+f 11/11/29 12/12/30 17/17/31
+f 17/17/31 12/12/30 18/18/32
+s 7
+f 20/20/33 38/50/34 2/26/35
+f 2/26/35 38/50/34 35/47/36
+s 8
+f 22/22/37 46/60/38 4/28/39
+f 4/28/39 46/60/38 43/57/40
+s 9
+f 6/6/41 24/31/42 12/12/43
+f 12/12/43 24/31/42 18/32/44
+s 10
+f 19/33/45 1/1/46 13/34/47
+f 13/34/47 1/1/46 7/7/48
+s off
+f 20/20/49 2/26/50 26/36/51
+s 11
+f 2/26/52 1/25/53 26/36/54
+f 26/36/54 1/25/53 25/35/55
+s off
+f 1/25/56 19/19/57 25/35/58
+f 22/22/59 4/28/60 28/38/61
+s 12
+f 4/28/62 3/27/63 28/38/64
+f 28/38/64 3/27/63 27/37/65
+s off
+f 3/27/66 21/21/67 27/37/68
+f 24/24/69 6/30/70 30/40/71
+s 13
+f 6/30/72 5/29/73 30/40/74
+f 30/40/74 5/29/73 29/39/75
+s off
+f 5/29/76 23/23/77 29/39/78
+s 1
+f 3/3/7 9/9/9 31/41/79
+f 31/41/79 9/9/9 32/43/80
+s 4
+f 33/44/81 32/43/82 15/15/25
+f 15/15/25 32/43/82 9/9/23
+s 7
+f 31/42/83 34/45/84 3/27/85
+f 3/27/85 34/45/84 21/21/86
+s 1
+f 35/46/5 31/41/79 36/48/6
+f 36/48/6 31/41/79 32/43/80
+s 4
+f 37/49/22 36/48/21 33/44/81
+f 33/44/81 36/48/21 32/43/82
+s 7
+f 35/47/36 38/50/34 31/42/83
+f 31/42/83 38/50/34 34/45/84
+s 1
+f 5/5/13 11/11/15 39/51/87
+f 39/51/87 11/11/15 40/53/88
+s 4
+f 41/54/89 40/53/90 17/17/31
+f 17/17/31 40/53/90 11/11/29
+s 8
+f 39/52/91 42/55/92 5/29/93
+f 5/29/93 42/55/92 23/23/94
+s 1
+f 43/56/11 39/51/87 44/58/12
+f 44/58/12 39/51/87 40/53/88
+s 4
+f 45/59/28 44/58/27 41/54/89
+f 41/54/89 44/58/27 40/53/90
+s 8
+f 43/57/40 46/60/38 39/52/91
+f 39/52/91 46/60/38 42/55/92
diff --git a/resources/gondor.mp3 b/resources/gondor.mp3
new file mode 100644
index 00000000..56f2e19d
Binary files /dev/null and b/resources/gondor.mp3 differ
diff --git a/resources/ring.obj b/resources/ring.obj
new file mode 100644
index 00000000..30ec5f4f
--- /dev/null
+++ b/resources/ring.obj
@@ -0,0 +1,435 @@
+# This file uses centimeters as units for non-parametric coordinates.
+
+mtllib ring.mtl
+g default
+v 0.975000 0.000000 -0.000000
+v 0.927280 0.000000 -0.301292
+v 0.788792 0.000000 -0.573091
+v 0.573091 0.000000 -0.788792
+v 0.301292 0.000000 -0.927280
+v -0.000000 0.000000 -0.975000
+v -0.301292 0.000000 -0.927280
+v -0.573091 0.000000 -0.788792
+v -0.788792 0.000000 -0.573091
+v -0.927280 0.000000 -0.301292
+v -0.975000 0.000000 0.000000
+v -0.927280 0.000000 0.301292
+v -0.788792 0.000000 0.573091
+v -0.573091 0.000000 0.788792
+v -0.301292 0.000000 0.927280
+v 0.000000 0.000000 0.975000
+v 0.301292 0.000000 0.927280
+v 0.573091 0.000000 0.788792
+v 0.788792 0.000000 0.573091
+v 0.927281 0.000000 0.301292
+v 0.975000 0.250000 0.000000
+v 0.927280 0.250000 -0.301292
+v 0.788792 0.250000 -0.573091
+v 0.573091 0.250000 -0.788792
+v 0.301292 0.250000 -0.927280
+v -0.000000 0.250000 -0.975000
+v -0.301292 0.250000 -0.927280
+v -0.573091 0.250000 -0.788792
+v -0.788792 0.250000 -0.573091
+v -0.927280 0.250000 -0.301292
+v -0.975000 0.250000 0.000000
+v -0.927280 0.250000 0.301292
+v -0.788792 0.250000 0.573091
+v -0.573091 0.250000 0.788792
+v -0.301292 0.250000 0.927280
+v 0.000000 0.250000 0.975000
+v 0.301292 0.250000 0.927280
+v 0.573091 0.250000 0.788792
+v 0.788792 0.250000 0.573091
+v 0.927281 0.250000 0.301292
+v 1.000000 0.250000 0.000000
+v 0.951057 0.250000 -0.309017
+v 0.809017 0.250000 -0.587785
+v 0.587785 0.250000 -0.809017
+v 0.309017 0.250000 -0.951057
+v -0.000000 0.250000 -1.000000
+v -0.309017 0.250000 -0.951057
+v -0.587785 0.250000 -0.809017
+v -0.809017 0.250000 -0.587785
+v -0.951057 0.250000 -0.309017
+v -1.000000 0.250000 0.000000
+v -0.951057 0.250000 0.309017
+v -0.809017 0.250000 0.587785
+v -0.587785 0.250000 0.809017
+v -0.309017 0.250000 0.951057
+v 0.000000 0.250000 1.000000
+v 0.309017 0.250000 0.951057
+v 0.587786 0.250000 0.809017
+v 0.809018 0.250000 0.587786
+v 0.951057 0.250000 0.309017
+v 1.000000 0.000000 -0.000000
+v 0.951057 0.000000 -0.309017
+v 0.809017 0.000000 -0.587785
+v 0.587785 0.000000 -0.809017
+v 0.309017 0.000000 -0.951057
+v -0.000000 0.000000 -1.000000
+v -0.309017 0.000000 -0.951057
+v -0.587785 0.000000 -0.809017
+v -0.809017 0.000000 -0.587785
+v -0.951057 0.000000 -0.309017
+v -1.000000 0.000000 -0.000000
+v -0.951057 0.000000 0.309017
+v -0.809017 0.000000 0.587785
+v -0.587785 0.000000 0.809017
+v -0.309017 0.000000 0.951057
+v 0.000000 0.000000 1.000000
+v 0.309017 0.000000 0.951057
+v 0.587786 0.000000 0.809017
+v 0.809018 0.000000 0.587786
+v 0.951057 0.000000 0.309017
+vt 0.000000 1.000000
+vt 0.050000 1.000000
+vt 0.100000 1.000000
+vt 0.150000 1.000000
+vt 0.200000 1.000000
+vt 0.250000 1.000000
+vt 0.300000 1.000000
+vt 0.350000 1.000000
+vt 0.400000 1.000000
+vt 0.450000 1.000000
+vt 0.500000 1.000000
+vt 0.550000 1.000000
+vt 0.600000 1.000000
+vt 0.650000 1.000000
+vt 0.700000 1.000000
+vt 0.750000 1.000000
+vt 0.800000 1.000000
+vt 0.850000 1.000000
+vt 0.900000 1.000000
+vt 0.950000 1.000000
+vt 1.000000 1.000000
+vt 0.000000 0.750000
+vt 0.050000 0.750000
+vt 0.100000 0.750000
+vt 0.150000 0.750000
+vt 0.200000 0.750000
+vt 0.250000 0.750000
+vt 0.300000 0.750000
+vt 0.350000 0.750000
+vt 0.400000 0.750000
+vt 0.450000 0.750000
+vt 0.500000 0.750000
+vt 0.550000 0.750000
+vt 0.600000 0.750000
+vt 0.650000 0.750000
+vt 0.700000 0.750000
+vt 0.750000 0.750000
+vt 0.800000 0.750000
+vt 0.850000 0.750000
+vt 0.900000 0.750000
+vt 0.950000 0.750000
+vt 1.000000 0.750000
+vt 0.000000 0.500000
+vt 0.050000 0.500000
+vt 0.100000 0.500000
+vt 0.150000 0.500000
+vt 0.200000 0.500000
+vt 0.250000 0.500000
+vt 0.300000 0.500000
+vt 0.350000 0.500000
+vt 0.400000 0.500000
+vt 0.450000 0.500000
+vt 0.500000 0.500000
+vt 0.550000 0.500000
+vt 0.600000 0.500000
+vt 0.650000 0.500000
+vt 0.700000 0.500000
+vt 0.750000 0.500000
+vt 0.800000 0.500000
+vt 0.850000 0.500000
+vt 0.900000 0.500000
+vt 0.950000 0.500000
+vt 1.000000 0.500000
+vt 0.000000 0.250000
+vt 0.050000 0.250000
+vt 0.100000 0.250000
+vt 0.150000 0.250000
+vt 0.200000 0.250000
+vt 0.250000 0.250000
+vt 0.300000 0.250000
+vt 0.350000 0.250000
+vt 0.400000 0.250000
+vt 0.450000 0.250000
+vt 0.500000 0.250000
+vt 0.550000 0.250000
+vt 0.600000 0.250000
+vt 0.650000 0.250000
+vt 0.700000 0.250000
+vt 0.750000 0.250000
+vt 0.800000 0.250000
+vt 0.850000 0.250000
+vt 0.900000 0.250000
+vt 0.950000 0.250000
+vt 1.000000 0.250000
+vt 0.000000 0.000000
+vt 0.050000 0.000000
+vt 0.100000 0.000000
+vt 0.150000 0.000000
+vt 0.200000 0.000000
+vt 0.250000 0.000000
+vt 0.300000 0.000000
+vt 0.350000 0.000000
+vt 0.400000 0.000000
+vt 0.450000 0.000000
+vt 0.500000 0.000000
+vt 0.550000 0.000000
+vt 0.600000 0.000000
+vt 0.650000 0.000000
+vt 0.700000 0.000000
+vt 0.750000 0.000000
+vt 0.800000 0.000000
+vt 0.850000 0.000000
+vt 0.900000 0.000000
+vt 0.950000 0.000000
+vt 1.000000 0.000000
+vn -0.951057 0.000000 0.309017
+vn -1.000000 0.000000 0.000001
+vn -1.000000 0.000000 0.000001
+vn -0.951057 0.000000 0.309017
+vn -0.809017 0.000000 0.587785
+vn -0.809017 0.000000 0.587785
+vn -0.587785 0.000000 0.809017
+vn -0.587785 0.000000 0.809017
+vn -0.309017 0.000000 0.951057
+vn -0.309017 0.000000 0.951057
+vn -0.000000 0.000000 1.000000
+vn -0.000000 0.000000 1.000000
+vn 0.309017 0.000000 0.951057
+vn 0.309017 0.000000 0.951057
+vn 0.587785 0.000000 0.809017
+vn 0.587785 0.000000 0.809017
+vn 0.809017 0.000000 0.587785
+vn 0.809017 0.000000 0.587785
+vn 0.951057 0.000000 0.309017
+vn 0.951057 0.000000 0.309017
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.951057 0.000000 -0.309017
+vn 0.951057 0.000000 -0.309017
+vn 0.809017 0.000000 -0.587785
+vn 0.809017 0.000000 -0.587785
+vn 0.587785 0.000000 -0.809017
+vn 0.587785 0.000000 -0.809017
+vn 0.309017 0.000000 -0.951056
+vn 0.309017 0.000000 -0.951056
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn -0.309017 0.000000 -0.951057
+vn -0.309017 0.000000 -0.951057
+vn -0.587785 0.000000 -0.809017
+vn -0.587785 0.000000 -0.809017
+vn -0.809017 0.000000 -0.587785
+vn -0.809017 0.000000 -0.587785
+vn -0.951057 0.000000 -0.309016
+vn -0.951057 0.000000 -0.309016
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.951057 0.000000 -0.309017
+vn 1.000000 -0.000000 -0.000001
+vn 1.000000 -0.000000 -0.000001
+vn 0.951057 0.000000 -0.309017
+vn 0.809017 0.000000 -0.587785
+vn 0.809017 0.000000 -0.587785
+vn 0.587785 0.000000 -0.809017
+vn 0.587785 0.000000 -0.809017
+vn 0.309017 0.000000 -0.951057
+vn 0.309017 0.000000 -0.951057
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn -0.309017 0.000000 -0.951057
+vn -0.309017 0.000000 -0.951057
+vn -0.587785 0.000000 -0.809017
+vn -0.587785 0.000000 -0.809017
+vn -0.809017 0.000000 -0.587785
+vn -0.809017 0.000000 -0.587785
+vn -0.951057 0.000000 -0.309017
+vn -0.951057 0.000000 -0.309017
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -0.951057 0.000000 0.309017
+vn -0.951057 0.000000 0.309017
+vn -0.809017 0.000000 0.587785
+vn -0.809017 0.000000 0.587785
+vn -0.587785 0.000000 0.809017
+vn -0.587785 0.000000 0.809017
+vn -0.309017 0.000000 0.951056
+vn -0.309017 0.000000 0.951056
+vn -0.000000 0.000000 1.000000
+vn -0.000000 0.000000 1.000000
+vn 0.309017 0.000000 0.951057
+vn 0.309017 0.000000 0.951057
+vn 0.587785 0.000000 0.809017
+vn 0.587785 0.000000 0.809017
+vn 0.809017 0.000000 0.587785
+vn 0.809017 0.000000 0.587785
+vn 0.951057 -0.000000 0.309016
+vn 0.951057 -0.000000 0.309016
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+s 1
+g pPipe1
+usemtl initialShadingGroup
+f 2/2/1 1/1/2 21/22/3 22/23/4
+f 3/3/5 2/2/1 22/23/4 23/24/6
+f 4/4/7 3/3/5 23/24/6 24/25/8
+f 5/5/9 4/4/7 24/25/8 25/26/10
+f 6/6/11 5/5/9 25/26/10 26/27/12
+f 7/7/13 6/6/11 26/27/12 27/28/14
+f 8/8/15 7/7/13 27/28/14 28/29/16
+f 9/9/17 8/8/15 28/29/16 29/30/18
+f 10/10/19 9/9/17 29/30/18 30/31/20
+f 11/11/21 10/10/19 30/31/20 31/32/22
+f 12/12/23 11/11/21 31/32/22 32/33/24
+f 13/13/25 12/12/23 32/33/24 33/34/26
+f 14/14/27 13/13/25 33/34/26 34/35/28
+f 15/15/29 14/14/27 34/35/28 35/36/30
+f 16/16/31 15/15/29 35/36/30 36/37/32
+f 17/17/33 16/16/31 36/37/32 37/38/34
+f 18/18/35 17/17/33 37/38/34 38/39/36
+f 19/19/37 18/18/35 38/39/36 39/40/38
+f 20/20/39 19/19/37 39/40/38 40/41/40
+f 1/21/2 20/20/39 40/41/40 21/42/3
+s 2
+f 22/23/41 21/22/42 41/43/43 42/44/44
+f 23/24/45 22/23/41 42/44/44 43/45/46
+f 24/25/47 23/24/45 43/45/46 44/46/48
+f 25/26/49 24/25/47 44/46/48 45/47/50
+f 26/27/51 25/26/49 45/47/50 46/48/52
+f 27/28/53 26/27/51 46/48/52 47/49/54
+f 28/29/55 27/28/53 47/49/54 48/50/56
+f 29/30/57 28/29/55 48/50/56 49/51/58
+f 30/31/59 29/30/57 49/51/58 50/52/60
+f 31/32/61 30/31/59 50/52/60 51/53/62
+f 32/33/63 31/32/61 51/53/62 52/54/64
+f 33/34/65 32/33/63 52/54/64 53/55/66
+f 34/35/67 33/34/65 53/55/66 54/56/68
+f 35/36/69 34/35/67 54/56/68 55/57/70
+f 36/37/71 35/36/69 55/57/70 56/58/72
+f 37/38/73 36/37/71 56/58/72 57/59/74
+f 38/39/75 37/38/73 57/59/74 58/60/76
+f 39/40/77 38/39/75 58/60/76 59/61/78
+f 40/41/79 39/40/77 59/61/78 60/62/80
+f 21/42/42 40/41/79 60/62/80 41/63/43
+s 3
+f 42/44/81 41/43/82 61/64/83 62/65/84
+f 43/45/85 42/44/81 62/65/84 63/66/86
+f 44/46/87 43/45/85 63/66/86 64/67/88
+f 45/47/89 44/46/87 64/67/88 65/68/90
+f 46/48/91 45/47/89 65/68/90 66/69/92
+f 47/49/93 46/48/91 66/69/92 67/70/94
+f 48/50/95 47/49/93 67/70/94 68/71/96
+f 49/51/97 48/50/95 68/71/96 69/72/98
+f 50/52/99 49/51/97 69/72/98 70/73/100
+f 51/53/101 50/52/99 70/73/100 71/74/102
+f 52/54/103 51/53/101 71/74/102 72/75/104
+f 53/55/105 52/54/103 72/75/104 73/76/106
+f 54/56/107 53/55/105 73/76/106 74/77/108
+f 55/57/109 54/56/107 74/77/108 75/78/110
+f 56/58/111 55/57/109 75/78/110 76/79/112
+f 57/59/113 56/58/111 76/79/112 77/80/114
+f 58/60/115 57/59/113 77/80/114 78/81/116
+f 59/61/117 58/60/115 78/81/116 79/82/118
+f 60/62/119 59/61/117 79/82/118 80/83/120
+f 41/63/82 60/62/119 80/83/120 61/84/83
+s 4
+f 62/65/121 61/64/122 1/85/123 2/86/124
+f 63/66/125 62/65/121 2/86/124 3/87/126
+f 64/67/127 63/66/125 3/87/126 4/88/128
+f 65/68/129 64/67/127 4/88/128 5/89/130
+f 66/69/131 65/68/129 5/89/130 6/90/132
+f 67/70/133 66/69/131 6/90/132 7/91/134
+f 68/71/135 67/70/133 7/91/134 8/92/136
+f 69/72/137 68/71/135 8/92/136 9/93/138
+f 70/73/139 69/72/137 9/93/138 10/94/140
+f 71/74/141 70/73/139 10/94/140 11/95/142
+f 72/75/143 71/74/141 11/95/142 12/96/144
+f 73/76/145 72/75/143 12/96/144 13/97/146
+f 74/77/147 73/76/145 13/97/146 14/98/148
+f 75/78/149 74/77/147 14/98/148 15/99/150
+f 76/79/151 75/78/149 15/99/150 16/100/152
+f 77/80/153 76/79/151 16/100/152 17/101/154
+f 78/81/155 77/80/153 17/101/154 18/102/156
+f 79/82/157 78/81/155 18/102/156 19/103/158
+f 80/83/159 79/82/157 19/103/158 20/104/160
+f 61/84/122 80/83/159 20/104/160 1/105/123
diff --git a/resources/roundroof.obj b/resources/roundroof.obj
new file mode 100644
index 00000000..527a040d
--- /dev/null
+++ b/resources/roundroof.obj
@@ -0,0 +1,557 @@
+# This file uses centimeters as units for non-parametric coordinates.
+
+mtllib roundroof.mtl
+g default
+v 0.339244 0.127000 -0.339245
+v 0.000000 0.127000 -0.479764
+v -0.339244 0.127000 -0.339245
+v -0.479764 0.127000 0.000000
+v -0.339244 0.127000 0.339245
+v 0.000000 0.127000 0.479764
+v 0.339244 0.127000 0.339245
+v 0.479764 0.127000 0.000000
+v 0.322640 0.315681 -0.322641
+v 0.000000 0.315681 -0.456283
+v -0.322640 0.315681 -0.322641
+v -0.456283 0.315681 0.000000
+v -0.322640 0.315681 0.322641
+v 0.000000 0.315681 0.456283
+v 0.322640 0.315681 0.322641
+v 0.456283 0.315681 0.000000
+v 0.274454 0.463443 -0.274455
+v 0.000000 0.463443 -0.388137
+v -0.274454 0.463443 -0.274455
+v -0.388137 0.463443 0.000000
+v -0.274454 0.463443 0.274455
+v 0.000000 0.463443 0.388137
+v 0.274454 0.463443 0.274455
+v 0.388137 0.463443 0.000000
+v 0.199403 0.580708 -0.199403
+v 0.000000 0.580708 -0.281998
+v -0.199403 0.580708 -0.199403
+v -0.281998 0.580708 0.000000
+v -0.199403 0.580708 0.199403
+v 0.000000 0.580708 0.281998
+v 0.199403 0.580708 0.199403
+v 0.281998 0.580708 0.000000
+v 0.104832 0.655997 -0.104832
+v 0.000000 0.655997 -0.148255
+v -0.104832 0.655997 -0.104832
+v -0.148255 0.655997 0.000000
+v -0.104832 0.655997 0.104832
+v 0.000000 0.655997 0.148255
+v 0.104832 0.655997 0.104832
+v 0.148255 0.655997 0.000000
+v 0.000000 0.659219 0.000000
+v 0.500000 0.127000 -0.500000
+v 0.000000 0.127000 -0.500000
+v 0.500000 0.002000 -0.500000
+v 0.000000 0.002000 -0.500000
+v -0.500000 0.127000 -0.500000
+v -0.500000 0.002000 -0.500000
+v -0.500000 0.127000 0.000000
+v -0.500000 0.002000 0.000000
+v -0.500000 0.127000 0.500000
+v -0.500000 0.002000 0.500000
+v 0.000000 0.127000 0.500000
+v 0.000000 0.002000 0.500000
+v 0.500000 0.127000 0.500000
+v 0.500000 0.002000 0.500000
+v 0.500000 0.127000 0.000000
+v 0.500000 0.002000 0.000000
+v 0.000000 0.002000 0.000000
+vt 0.000000 0.500000
+vt 0.125000 0.500000
+vt 0.250000 0.500000
+vt 0.375000 0.500000
+vt 0.500000 0.500000
+vt 0.625000 0.500000
+vt 0.750000 0.500000
+vt 0.875000 0.500000
+vt 1.000000 0.500000
+vt 0.000000 0.600000
+vt 0.125000 0.600000
+vt 0.250000 0.600000
+vt 0.375000 0.600000
+vt 0.500000 0.600000
+vt 0.625000 0.600000
+vt 0.750000 0.600000
+vt 0.875000 0.600000
+vt 1.000000 0.600000
+vt 0.000000 0.700000
+vt 0.125000 0.700000
+vt 0.250000 0.700000
+vt 0.375000 0.700000
+vt 0.500000 0.700000
+vt 0.625000 0.700000
+vt 0.750000 0.700000
+vt 0.875000 0.700000
+vt 1.000000 0.700000
+vt 0.000000 0.800000
+vt 0.125000 0.800000
+vt 0.250000 0.800000
+vt 0.375000 0.800000
+vt 0.500000 0.800000
+vt 0.625000 0.800000
+vt 0.750000 0.800000
+vt 0.875000 0.800000
+vt 1.000000 0.800000
+vt 0.000000 0.900000
+vt 0.125000 0.900000
+vt 0.250000 0.900000
+vt 0.375000 0.900000
+vt 0.500000 0.900000
+vt 0.625000 0.900000
+vt 0.750000 0.900000
+vt 0.875000 0.900000
+vt 1.000000 0.900000
+vt 0.187500 1.000000
+vt 0.437500 1.000000
+vt 0.687500 1.000000
+vt 0.937500 1.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 0.000000 0.000000
+vt 1.000000 0.000000
+vt 1.000000 1.000000
+vt 0.000000 1.000000
+vt 0.500000 1.000000
+vt 0.500000 1.000000
+vt 0.500000 1.000000
+vt 0.500000 1.000000
+vn 0.380179 0.114225 -0.917833
+vn 0.380179 0.114225 -0.917833
+vn 0.380179 0.114225 -0.917833
+vn 0.380179 0.114224 -0.917833
+vn -0.380179 0.114224 -0.917833
+vn -0.380179 0.114225 -0.917833
+vn -0.380179 0.114224 -0.917833
+vn -0.380179 0.114225 -0.917833
+vn -0.917833 0.114225 -0.380179
+vn -0.917833 0.114225 -0.380179
+vn -0.917833 0.114225 -0.380179
+vn -0.917833 0.114225 -0.380179
+vn -0.917833 0.114225 0.380179
+vn -0.917833 0.114225 0.380179
+vn -0.917833 0.114225 0.380179
+vn -0.917833 0.114225 0.380179
+vn -0.380179 0.114225 0.917833
+vn -0.380179 0.114225 0.917833
+vn -0.380179 0.114225 0.917833
+vn -0.380179 0.114224 0.917833
+vn 0.380179 0.114224 0.917833
+vn 0.380179 0.114224 0.917833
+vn 0.380179 0.114224 0.917833
+vn 0.380179 0.114224 0.917833
+vn 0.917833 0.114224 0.380179
+vn 0.917833 0.114225 0.380179
+vn 0.917833 0.114225 0.380179
+vn 0.917833 0.114225 0.380179
+vn 0.917833 0.114225 -0.380179
+vn 0.917833 0.114225 -0.380179
+vn 0.917833 0.114225 -0.380179
+vn 0.917833 0.114225 -0.380179
+vn 0.352059 0.391980 -0.849945
+vn 0.352059 0.391980 -0.849945
+vn 0.352059 0.391980 -0.849945
+vn 0.352059 0.391980 -0.849945
+vn -0.352059 0.391980 -0.849945
+vn -0.352059 0.391980 -0.849945
+vn -0.352059 0.391980 -0.849945
+vn -0.352059 0.391980 -0.849945
+vn -0.849945 0.391980 -0.352059
+vn -0.849945 0.391979 -0.352059
+vn -0.849945 0.391980 -0.352059
+vn -0.849945 0.391979 -0.352060
+vn -0.849945 0.391979 0.352059
+vn -0.849945 0.391980 0.352059
+vn -0.849945 0.391979 0.352059
+vn -0.849944 0.391981 0.352059
+vn -0.352059 0.391980 0.849945
+vn -0.352059 0.391980 0.849945
+vn -0.352059 0.391980 0.849945
+vn -0.352059 0.391980 0.849945
+vn 0.352059 0.391980 0.849945
+vn 0.352059 0.391980 0.849945
+vn 0.352059 0.391980 0.849945
+vn 0.352059 0.391980 0.849945
+vn 0.849945 0.391980 0.352059
+vn 0.849945 0.391980 0.352059
+vn 0.849945 0.391980 0.352059
+vn 0.849945 0.391979 0.352060
+vn 0.849945 0.391979 -0.352059
+vn 0.849945 0.391980 -0.352059
+vn 0.849945 0.391979 -0.352059
+vn 0.849944 0.391981 -0.352059
+vn 0.293568 0.641492 -0.708735
+vn 0.293568 0.641492 -0.708735
+vn 0.293568 0.641492 -0.708735
+vn 0.293568 0.641492 -0.708735
+vn -0.293568 0.641492 -0.708735
+vn -0.293568 0.641493 -0.708735
+vn -0.293568 0.641492 -0.708735
+vn -0.293568 0.641492 -0.708735
+vn -0.708735 0.641492 -0.293568
+vn -0.708735 0.641492 -0.293568
+vn -0.708735 0.641492 -0.293568
+vn -0.708735 0.641493 -0.293568
+vn -0.708735 0.641492 0.293568
+vn -0.708735 0.641492 0.293568
+vn -0.708735 0.641492 0.293568
+vn -0.708735 0.641492 0.293568
+vn -0.293568 0.641492 0.708735
+vn -0.293568 0.641492 0.708735
+vn -0.293568 0.641492 0.708735
+vn -0.293568 0.641492 0.708735
+vn 0.293568 0.641492 0.708735
+vn 0.293568 0.641493 0.708735
+vn 0.293568 0.641492 0.708735
+vn 0.293568 0.641492 0.708735
+vn 0.708735 0.641492 0.293568
+vn 0.708735 0.641492 0.293568
+vn 0.708735 0.641492 0.293568
+vn 0.708735 0.641493 0.293568
+vn 0.708735 0.641492 -0.293568
+vn 0.708735 0.641492 -0.293568
+vn 0.708735 0.641492 -0.293568
+vn 0.708735 0.641492 -0.293568
+vn 0.199124 0.853963 -0.480726
+vn 0.199123 0.853963 -0.480726
+vn 0.199123 0.853963 -0.480726
+vn 0.199122 0.853963 -0.480726
+vn -0.199123 0.853963 -0.480726
+vn -0.199123 0.853963 -0.480726
+vn -0.199123 0.853963 -0.480726
+vn -0.199123 0.853963 -0.480726
+vn -0.480727 0.853962 -0.199124
+vn -0.480727 0.853962 -0.199124
+vn -0.480727 0.853963 -0.199124
+vn -0.480726 0.853963 -0.199122
+vn -0.480726 0.853963 0.199124
+vn -0.480726 0.853962 0.199124
+vn -0.480726 0.853962 0.199124
+vn -0.480727 0.853962 0.199123
+vn -0.199124 0.853963 0.480726
+vn -0.199123 0.853963 0.480726
+vn -0.199123 0.853963 0.480726
+vn -0.199122 0.853963 0.480726
+vn 0.199123 0.853963 0.480726
+vn 0.199123 0.853963 0.480726
+vn 0.199123 0.853963 0.480726
+vn 0.199123 0.853963 0.480726
+vn 0.480727 0.853962 0.199124
+vn 0.480727 0.853962 0.199124
+vn 0.480727 0.853963 0.199124
+vn 0.480726 0.853963 0.199122
+vn 0.480726 0.853963 -0.199124
+vn 0.480726 0.853962 -0.199124
+vn 0.480726 0.853962 -0.199124
+vn 0.480727 0.853962 -0.199123
+vn -0.008999 0.999723 -0.021725
+vn -0.015363 0.999764 -0.015363
+vn -0.015363 0.999764 -0.015363
+vn -0.021726 0.999723 -0.008999
+vn -0.021726 0.999723 0.008999
+vn -0.015363 0.999764 0.015363
+vn -0.015363 0.999764 0.015363
+vn -0.008999 0.999723 0.021725
+vn 0.008999 0.999723 0.021725
+vn 0.015363 0.999764 0.015363
+vn 0.015363 0.999764 0.015363
+vn 0.021726 0.999723 0.008999
+vn 0.021726 0.999723 -0.008999
+vn 0.015363 0.999764 -0.015363
+vn 0.015363 0.999764 -0.015363
+vn 0.008999 0.999723 -0.021725
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn 0.000000 0.000000 -1.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn -1.000000 0.000000 0.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 0.000000 0.000000 1.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 1.000000 0.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 1.000000 -0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+vn 0.000000 -1.000000 0.000000
+s 1
+g pSphere1
+usemtl initialShadingGroup
+f 1/1/1 2/2/2 9/10/3
+f 9/10/3 2/2/2 10/11/4
+s 2
+f 2/2/5 3/3/6 10/11/7
+f 10/11/7 3/3/6 11/12/8
+s 3
+f 3/3/9 4/4/10 11/12/11
+f 11/12/11 4/4/10 12/13/12
+s 4
+f 4/4/13 5/5/14 12/13/15
+f 12/13/15 5/5/14 13/14/16
+s 5
+f 5/5/17 6/6/18 13/14/19
+f 13/14/19 6/6/18 14/15/20
+s 6
+f 6/6/21 7/7/22 14/15/23
+f 14/15/23 7/7/22 15/16/24
+s 7
+f 7/7/25 8/8/26 15/16/27
+f 15/16/27 8/8/26 16/17/28
+s 8
+f 8/8/29 1/9/30 16/17/31
+f 16/17/31 1/9/30 9/18/32
+s 9
+f 9/10/33 10/11/34 17/19/35
+f 17/19/35 10/11/34 18/20/36
+s 10
+f 10/11/37 11/12/38 18/20/39
+f 18/20/39 11/12/38 19/21/40
+s 11
+f 11/12/41 12/13/42 19/21/43
+f 19/21/43 12/13/42 20/22/44
+s 12
+f 12/13/45 13/14/46 20/22/47
+f 20/22/47 13/14/46 21/23/48
+s 13
+f 13/14/49 14/15/50 21/23/51
+f 21/23/51 14/15/50 22/24/52
+s 14
+f 14/15/53 15/16/54 22/24/55
+f 22/24/55 15/16/54 23/25/56
+s 15
+f 15/16/57 16/17/58 23/25/59
+f 23/25/59 16/17/58 24/26/60
+s 16
+f 16/17/61 9/18/62 24/26/63
+f 24/26/63 9/18/62 17/27/64
+s 17
+f 17/19/65 18/20/66 25/28/67
+f 25/28/67 18/20/66 26/29/68
+s 18
+f 18/20/69 19/21/70 26/29/71
+f 26/29/71 19/21/70 27/30/72
+s 19
+f 19/21/73 20/22/74 27/30/75
+f 27/30/75 20/22/74 28/31/76
+s 20
+f 20/22/77 21/23/78 28/31/79
+f 28/31/79 21/23/78 29/32/80
+s 21
+f 21/23/81 22/24/82 29/32/83
+f 29/32/83 22/24/82 30/33/84
+s 22
+f 22/24/85 23/25/86 30/33/87
+f 30/33/87 23/25/86 31/34/88
+s 23
+f 23/25/89 24/26/90 31/34/91
+f 31/34/91 24/26/90 32/35/92
+s 24
+f 24/26/93 17/27/94 32/35/95
+f 32/35/95 17/27/94 25/36/96
+s 25
+f 25/28/97 26/29/98 33/37/99
+f 33/37/99 26/29/98 34/38/100
+s 26
+f 26/29/101 27/30/102 34/38/103
+f 34/38/103 27/30/102 35/39/104
+s 27
+f 27/30/105 28/31/106 35/39/107
+f 35/39/107 28/31/106 36/40/108
+s 28
+f 28/31/109 29/32/110 36/40/111
+f 36/40/111 29/32/110 37/41/112
+s 29
+f 29/32/113 30/33/114 37/41/115
+f 37/41/115 30/33/114 38/42/116
+s 30
+f 30/33/117 31/34/118 38/42/119
+f 38/42/119 31/34/118 39/43/120
+s 31
+f 31/34/121 32/35/122 39/43/123
+f 39/43/123 32/35/122 40/44/124
+s 32
+f 32/35/125 25/36/126 40/44/127
+f 40/44/127 25/36/126 33/45/128
+s 33
+f 34/38/129 35/39/130 41/46/131
+f 41/46/131 35/39/130 36/40/132
+s 34
+f 36/40/133 37/41/134 41/47/135
+f 41/47/135 37/41/134 38/42/136
+s 35
+f 38/42/137 39/43/138 41/48/139
+f 41/48/139 39/43/138 40/44/140
+s 36
+f 40/44/141 33/37/142 41/49/143
+f 41/49/143 33/37/142 34/38/144
+s 37
+f 43/66/145 42/67/146 45/69/147
+f 45/69/147 42/67/146 44/68/148
+s 38
+f 46/70/149 43/71/150 47/73/151
+f 47/73/151 43/71/150 45/72/152
+s 39
+f 48/74/153 46/75/154 49/77/155
+f 49/77/155 46/75/154 47/76/156
+s 40
+f 50/78/157 48/79/158 51/81/159
+f 51/81/159 48/79/158 49/80/160
+s 41
+f 52/82/161 50/83/162 53/85/163
+f 53/85/163 50/83/162 51/84/164
+s 42
+f 54/86/165 52/87/166 55/89/167
+f 55/89/167 52/87/166 53/88/168
+s 43
+f 56/90/169 54/91/170 57/93/171
+f 57/93/171 54/91/170 55/92/172
+s 44
+f 42/94/173 56/95/174 44/97/175
+f 44/97/175 56/95/174 57/96/176
+s 45
+f 43/66/177 2/50/178 42/67/179
+f 2/50/178 1/51/180 42/67/179
+s 46
+f 43/71/181 46/70/182 2/53/183
+f 3/52/184 2/53/183 46/70/182
+s 47
+f 48/74/185 4/54/186 46/75/187
+f 4/54/186 3/55/188 46/75/187
+s 48
+f 48/79/189 50/78/190 4/57/191
+f 5/56/192 4/57/191 50/78/190
+s 49
+f 52/82/193 6/58/194 50/83/195
+f 6/58/194 5/59/196 50/83/195
+s 50
+f 52/87/197 54/86/198 6/61/199
+f 7/60/200 6/61/199 54/86/198
+s 51
+f 56/90/201 8/62/202 54/91/203
+f 8/62/202 7/63/204 54/91/203
+s 52
+f 56/95/205 42/94/206 8/65/207
+f 1/64/208 8/65/207 42/94/206
+s 53
+f 47/73/209 45/72/210 49/99/211
+f 49/99/211 45/72/210 58/98/212
+s 54
+f 49/99/213 58/98/214 51/84/215
+f 51/84/215 58/98/214 53/85/216
+s 55
+f 45/69/217 44/68/218 58/101/219
+f 58/101/219 44/68/218 57/100/220
+s 56
+f 58/101/221 57/100/222 53/88/223
+f 53/88/223 57/100/222 55/89/224
diff --git a/src/framework.js b/src/framework.js
new file mode 100644
index 00000000..9cfcd1b4
--- /dev/null
+++ b/src/framework.js
@@ -0,0 +1,75 @@
+
+const THREE = require('three');
+const OrbitControls = require('three-orbit-controls')(THREE)
+import Stats from 'stats-js'
+import DAT from 'dat-gui'
+
+// when the scene is done initializing, the function passed as `callback` will be executed
+// then, every frame, the function passed as `update` will be executed
+function init(callback, update) {
+ var stats = new Stats();
+ stats.setMode(1);
+ stats.domElement.style.position = 'absolute';
+ stats.domElement.style.left = '0px';
+ stats.domElement.style.top = '0px';
+ document.body.appendChild(stats.domElement);
+
+ var gui = new DAT.GUI();
+
+ var framework = {
+ gui: gui,
+ stats: stats
+ };
+
+ // run this function after the window loads
+ window.addEventListener('load', function() {
+
+ var scene = new THREE.Scene();
+ var camera = new THREE.PerspectiveCamera( 75, window.innerWidth/window.innerHeight, 0.1, 1000 );
+ var renderer = new THREE.WebGLRenderer( { antialias: true } );
+ renderer.setPixelRatio(window.devicePixelRatio);
+ renderer.setSize(window.innerWidth, window.innerHeight);
+ renderer.setClearColor(0x020202, 0);
+
+ var controls = new OrbitControls(camera, renderer.domElement);
+ controls.enableDamping = true;
+ controls.enableZoom = true;
+ controls.target.set(0, 0, 0);
+ controls.rotateSpeed = 0.3;
+ controls.zoomSpeed = 1.0;
+ controls.panSpeed = 2.0;
+
+ document.body.appendChild(renderer.domElement);
+
+ // resize the canvas when the window changes
+ window.addEventListener('resize', function() {
+ camera.aspect = window.innerWidth / window.innerHeight;
+ camera.updateProjectionMatrix();
+ renderer.setSize(window.innerWidth, window.innerHeight);
+ });
+
+ // assign THREE.js objects to the object we will return
+ framework.scene = scene;
+ framework.camera = camera;
+ framework.renderer = renderer;
+
+ // begin the animation loop
+ (function tick() {
+ stats.begin();
+ update(framework); // perform any requested updates
+ renderer.render(scene, camera); // render the scene
+ stats.end();
+ requestAnimationFrame(tick); // register to call this again when the browser renders a new frame
+ })();
+
+ // we will pass the scene, gui, renderer, camera, etc... to the callback function
+ return callback(framework);
+ });
+}
+
+export default {
+ init: init
+}
+
+export const PI = 3.14159265
+export const e = 2.7181718
\ No newline at end of file
diff --git a/src/main.js b/src/main.js
new file mode 100644
index 00000000..16c2777d
--- /dev/null
+++ b/src/main.js
@@ -0,0 +1,188 @@
+
+const THREE = require('three'); // older modules are imported like this. You shouldn't have to worry about this much
+import Framework from './framework'
+import GrammarSystem from './shapeGrammar.js'
+import {getNoise} from './noise.js'
+
+// the shape grammar
+var city;
+var iterations = 0;
+var animPlayed = false;
+
+var lastTime = Date.now();
+
+var pic = THREE.ImageUtils.loadTexture('./resources/denethor.jpg');
+
+var settings = {
+ volume: 0.5
+};
+
+// curve helpers for terrain deformation
+function bias(b, t) {
+ return Math.pow(t, Math.log(b) / Math.log(0.5));
+}
+
+function gain(g, t) {
+
+ if(t < 0.5) return bias(t * 2.0, g) / 2.0;
+ else return bias(t * 2.0 - 1.0,1.0 - g) / 2.0 + 0.5;
+}
+
+
+// called after the scene loads
+function onLoad(framework) {
+ var scene = framework.scene;
+ var camera = framework.camera;
+ var renderer = framework.renderer;
+ var gui = framework.gui;
+ var stats = framework.stats;
+
+ scene.fog = new THREE.Fog(0xffffff, 1, 60);
+ scene.fog.color.setHSL( 0.55, 0.4, 0.8 );
+
+ // initialize a simple box and material
+ var box = new THREE.IcosahedronBufferGeometry(1, 6);
+
+ var mat = new THREE.MeshLambertMaterial();
+ var adamCube = new THREE.Mesh(box, mat);
+
+ // set camera position
+ camera.position.set(3, 5, 15);
+ camera.lookAt(new THREE.Vector3(0,0,0));
+
+ // scene.add(adamCube);
+ city = new GrammarSystem(scene);
+ city.finalizeGrammar();
+
+ makeTerrain(scene);
+
+ var audioLoader = new THREE.AudioLoader();
+ var listener = new THREE.AudioListener();
+ var sound = new THREE.Audio(listener);
+ camera.add(listener);
+
+ //Load a sound and set it as the Audio object's buffer
+ audioLoader.load( 'resources/gondor.mp3', function(buffer) {
+ sound.setBuffer(buffer);
+ sound.setLoop(true);
+ sound.setVolume(0.0);
+ sound.play();
+ });
+
+
+ renderer.shadowMapEnabled = true;
+ renderer.shadowMap.type = THREE.PCFSoftShadowMap;
+ //renderer.shadowMapSoft = true;
+ renderer.shadowCameraNear = 1;
+ renderer.shadowCameraFar = 50;
+ //renderer.shadowCameraFov = 50;
+ var directionalLight = new THREE.DirectionalLight( 0xffffff, 0.9 );
+ directionalLight.color.setHSL(0.1, 1, 0.95);
+ directionalLight.position.set(3, 2, 2);
+ directionalLight.position.multiplyScalar(10);
+ directionalLight.castShadow = true;
+ //directionalLight.shadowCameraVisible = true;
+ directionalLight.shadow.mapSize.width = 2048;
+ directionalLight.shadow.mapSize.height = 2048;
+ directionalLight.shadowCameraBottom = -25;
+ directionalLight.shadowCameraTop = 25;
+ directionalLight.shadowCameraLeft = -25;
+ directionalLight.shadowCameraRight = 25;
+ directionalLight.shadow.camera.near = 0.5;
+ directionalLight.shadow.camera.far = 50
+
+
+ scene.add(directionalLight);
+
+
+ var helper = new THREE.CameraHelper( directionalLight.shadow.camera );
+ //scene.add( helper );
+ var hLight = new THREE.HemisphereLight(0xeef5ff, 0x010120, 0.2);
+ scene.add(hLight);
+
+ // edit params and listen to changes like this
+ // more information here: https://workshop.chromeexperiments.com/examples/gui/#1--Basic-Usage
+ gui.add(camera, 'fov', 0, 180).onChange(function(newVal) {
+ camera.updateProjectionMatrix();
+ });
+
+ var obj = { Iterate:function(){ city.iterateGrammar(); iterations++;},
+ Clear:function(){ city.clearIterations(); iterations = 0; animPlayed = false;} };
+
+ gui.add(obj,'Iterate');
+ gui.add(obj,'Clear');
+ gui.add(settings, 'volume', 0.0, 1.0).onChange(function(newVal) {
+ sound.setVolume(newVal);
+ });
+}
+
+function makeTerrain(scene) {
+ var planeGeo = new THREE.PlaneGeometry(30, 30, 40, 40);
+ var planeMat = new THREE.MeshPhongMaterial( {
+ side: THREE.DoubleSide,
+ color: 0xaaaaaa
+ });
+ planeGeo.applyMatrix( new THREE.Matrix4().makeRotationX(-Math.PI / 2.0));
+
+ var verts = planeGeo.vertices;
+ for (var i = 0; i < verts.length; i++) {
+ var u = (verts[i].x - 15.0) / -30.0;
+ var v = (verts[i].z - 15.0) / -30.0;
+ var bv2 = bias(0.4, v);
+ var bv = bias(0.20 + 0.05 * getNoise(u, v, 6.0), gain(0.25 + 0.15 * getNoise(u, v, 6.0), v));
+ verts[i].y += bv2 * getNoise(u, v, 16.0) + bv2 * 2 * getNoise(u, v, 8.0) - 0.4 + 15.0 * bv + 0.4;
+ verts[i].z += 0.2 * getNoise(u, gain(0.40, v), 16.0);
+
+ }
+
+ planeGeo.verticesNeedUpdate = true;
+ planeGeo.computeFaceNormals();
+ planeGeo.computeVertexNormals();
+ planeGeo.normalsNeedUpdate = true;
+
+ var plane = new THREE.Mesh(planeGeo, planeMat);
+ plane.castShadow = true;
+ plane.receiveShadow = true;
+ scene.add(plane);
+}
+
+// called on frame updates
+function onUpdate(framework) {
+ var denethor = framework.scene.getObjectByName("unfortunateSteward");
+ var t = Date.now();
+ var dt = (t - lastTime) / 1000.0;
+ lastTime = t;
+ if (denethor !== undefined) {
+ // run denethor off the cliff
+ var vel = denethor.userdata.v;
+ denethor.position.x = dt * vel.x + denethor.position.x;
+ denethor.position.y = dt * vel.y + denethor.position.y;
+ denethor.position.z = dt * vel.z + denethor.position.z;
+ if (denethor.position.z > 8.1) {
+ denethor.userdata.v.y -= 1.1 * dt;
+ }
+
+ if (denethor.position.y <= 0) {
+ framework.scene.remove(denethor);
+ console.log("plonk");
+ }
+ } else if (iterations >= 4 && !animPlayed) {
+ // make a burning denethor
+ var geo = new THREE.BoxGeometry(0.4, 0.4, 0.4);
+ geo.applyMatrix(new THREE.Matrix4().makeTranslation(0, 0.1, 0));
+ var mat = new THREE.MeshBasicMaterial({map: pic});
+ denethor = new THREE.Mesh(geo, mat);
+ denethor.name = "unfortunateSteward";
+ denethor.userdata = {v: new THREE.Vector3(0, 0, 1)};
+ denethor.position.y = 9.0;
+ denethor.position.z = 1.0;
+ //denethor.material.color.setHex(0xff8800);
+ denethor.castShadow = true;
+ framework.scene.add(denethor);
+ console.log("AAAAAAAAAaaaaaaaaaa~....");
+ animPlayed = true;
+ }
+}
+
+// when the scene is done initializing, it will call onLoad, then on frame updates, call onUpdate
+Framework.init(onLoad, onUpdate);
\ No newline at end of file
diff --git a/src/noise.js b/src/noise.js
new file mode 100644
index 00000000..0927ec11
--- /dev/null
+++ b/src/noise.js
@@ -0,0 +1,60 @@
+const THREE = require('three');
+// gradients for improved perlin noise
+var gradients = [new THREE.Vector2(1.0, 0), new THREE.Vector2(-1.0, 0),
+ new THREE.Vector2(0, 1.0), new THREE.Vector2(0, -1.0),
+ new THREE.Vector2(0.7071, 0.7071), new THREE.Vector2(-0.7071, 0.7071),
+ new THREE.Vector2(0.7071, -0.7071), new THREE.Vector2(-0.7071, -0.7071)];
+
+// hash table for improved perlin noise
+var pHash = [151,160,137,91,90,15,
+ 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
+ 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
+ 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
+ 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
+ 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
+ 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
+ 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
+ 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
+ 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
+ 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
+ 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
+ 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180];
+
+
+function lerp(a, b, t) {
+ return (t * b + (1.0 - t) * a);
+}
+
+//2D perlin noise
+export function getNoise(u, v, samples) {
+ var xs = u * samples;
+ var ys = v * samples;
+
+ var xlb = Math.floor(xs);
+ var ylb = Math.floor(ys);
+
+ var i = pHash[pHash[xlb + pHash[ylb]]] / 256.0;
+ var g = gradients[Math.floor(i * 8.0)];
+ var p = new THREE.Vector2(xs - xlb, ys - ylb);
+ var dll = g.dot(p);
+
+ i = pHash[pHash[xlb + 1 + pHash[ylb]]] / 256.0;
+ g = gradients[Math.floor(i * 8.0)];
+ p = new THREE.Vector2(xs - xlb - 1.0, ys - ylb);
+ var dlr = g.dot(p);
+
+ i = pHash[pHash[xlb + pHash[ylb + 1]]] / 256.0;
+ g = gradients[Math.floor(i * 8.0)];
+ p = new THREE.Vector2(xs - xlb, ys - ylb - 1.0);
+ var dul = g.dot(p);
+
+
+ i = pHash[pHash[xlb + 1 + pHash[ylb + 1]]] / 256.0;
+ g = gradients[Math.floor(i * 8.0)];
+ p = new THREE.Vector2(xs - xlb - 1.0, ys - ylb - 1.0);
+ //console.log(g);
+ var dur = g.dot(p);
+
+
+ return lerp(lerp(dll, dlr, xs - xlb), lerp(dul, dur, xs - xlb), ys - ylb);
+}
\ No newline at end of file
diff --git a/src/shapeGrammar.js b/src/shapeGrammar.js
new file mode 100644
index 00000000..3853c472
--- /dev/null
+++ b/src/shapeGrammar.js
@@ -0,0 +1,469 @@
+const THREE = require('three')
+const OBJLoader = require('three-obj-loader')(THREE)
+import {getNoise} from './noise.js'
+
+var ShapeEnum = Object.freeze({Ring: 0, Wall: 1, Roof1: 2,
+ Roof2: 3, Block: 4, Tower: 5,
+ Wedge: 6, Emplacement: 7, Cyl: 8,
+ Other: 999});
+var material = new THREE.MeshPhongMaterial({
+ side: THREE.DoubleSide,
+ color: 0xfefaf0
+ });
+var objLoader = new THREE.OBJLoader();
+var objLibrary = [];
+
+// used to scale or cull building placements
+function populationDensity(x, z) {
+ var u = (x - 10.0) / -20.0;
+ var v = (z - 10.0) / -20.0;
+ return getNoise(u, v, 8.0);
+}
+
+/*
+State of a single shape in the grammar.
+pos: postion
+scale: scale
+yaw: rotation about world Y axis
+symbol: the type of shape that this will be
+*/
+var Shape = function(pos, scale, yaw, symbol, terminal, iter) {
+ return {
+ pos: new THREE.Vector3(pos.x, pos.y, pos.z),
+ scale: new THREE.Vector3(scale.x, scale.y, scale.z),
+ yaw: yaw,
+ type: symbol,
+ terminal: terminal,
+ iter: iter
+ }
+}
+
+/*
+The exported GrammarSystem class.
+ - The grammar system has a list of shapes that are data the grammar can iterate on
+ - As an optimization, there is only a single merged mesh
+ - Also responsible for adding to scene and removing self from scene
+*/
+export default class GrammarSystem {
+
+ // adds dummies to the list of objs, then reloads when obj is ready
+ // usually takes only a few ms
+ loadAllObjs(selfRef) {
+ var mContainer1 = new THREE.Geometry();
+
+ objLibrary.push(mContainer1);
+ objLoader.load('./resources/ring.obj', function(obj) {
+ var g = new THREE.Geometry().fromBufferGeometry(obj.children[0].geometry);
+ g.applyMatrix( new THREE.Matrix4().makeScale(8, 8, 8));
+ g.applyMatrix( new THREE.Matrix4().makeTranslation(0, 2, 0));
+
+ objLibrary[0].merge(g, objLibrary[0].matrix);
+
+ selfRef.clearIterations();
+ });
+
+ var dummy2 = new THREE.Geometry();
+ objLibrary.push(dummy2);
+ objLoader.load('./resources/emplacement.obj', function(obj) {
+ var g = new THREE.Geometry().fromBufferGeometry(obj.children[0].geometry);
+ g.applyMatrix( new THREE.Matrix4().makeRotationY(0.5 * Math.PI / 180.0));
+
+ objLibrary[1].merge(g, g.matrix);
+
+ selfRef.clearIterations();
+ });
+
+
+ var dummy3 = new THREE.Geometry();
+ objLibrary.push(dummy3);
+ objLoader.load('./resources/roundroof.obj', function(obj) {
+ var g = new THREE.Geometry().fromBufferGeometry(obj.children[0].geometry);
+
+ objLibrary[2].merge(g, g.matrix);
+
+ selfRef.clearIterations();
+ });
+
+ var dummy4 = new THREE.Geometry();
+ objLibrary.push(dummy4);
+ objLoader.load('./resources/angleroof.obj', function(obj) {
+ var g = new THREE.Geometry().fromBufferGeometry(obj.children[0].geometry);
+ g.applyMatrix( new THREE.Matrix4().makeScale(4, 4, 4));
+ objLibrary[3].merge(g, g.matrix);
+
+ selfRef.clearIterations();
+ });
+
+ }
+
+ constructor(scene) {
+
+ this.scene = scene;
+ this.allShapes = []; // will contain every single
+ this.geometry = new THREE.Geometry();
+ this.mesh = undefined;
+ this.numIterations = 1;
+ this.loadAllObjs(this);
+
+ this.addShape(new THREE.Vector3(0, 0, 0),
+ new THREE.Vector3(1, 1, 1), 0.0, ShapeEnum.Ring, false, 1);
+ this.addShape(new THREE.Vector3(0, 0, 15),
+ new THREE.Vector3(2, 2, 2), 35.0, ShapeEnum.Block, false, 1);
+ }
+
+
+
+ // add a single shape to the grammar with specified values
+ addShape(pos, scale, yaw, type, terminal, iter) {
+
+ var s = new Shape(pos, scale, yaw, type, terminal, iter);
+ this.allShapes.push(s);
+ // merge into existing geometry
+ var geom;
+ switch(type) {
+ case ShapeEnum.Ring:
+ var ring = objLibrary[0].clone();
+ geom = new THREE.CylinderGeometry(8, 8, 2, 20);
+ geom.applyMatrix( new THREE.Matrix4().makeTranslation(0, 1, 0));
+ geom.merge(ring, ring.matrix);
+ break;
+
+ case ShapeEnum.Block:
+ geom = new THREE.BoxGeometry(4, 4, 4);
+ geom.applyMatrix( new THREE.Matrix4().makeTranslation(0, 2, 0));
+ break;
+
+ case ShapeEnum.Wall:
+ geom = objLibrary[0].clone();
+ break;
+
+ case ShapeEnum.Wedge:
+ geom = new THREE.CylinderGeometry(2, 2.4, 2, 3);
+ geom.applyMatrix( new THREE.Matrix4().makeTranslation(0, 1, 0));
+ geom.applyMatrix( new THREE.Matrix4().makeScale(1, 1, 4));
+ geom.computeFlatVertexNormals();
+ geom.normalsNeedUpdate = true;
+ break;
+
+ case ShapeEnum.Tower:
+ var g1 = new THREE.BoxGeometry(0.6, 2, 0.6);
+ g1.applyMatrix(new THREE.Matrix4().makeTranslation(0, 2, 0));
+ geom = new THREE.BoxGeometry(0.5, 2, 0.5);
+ geom.applyMatrix(new THREE.Matrix4().makeTranslation(0, 4, 0));
+ geom.merge(g1, g1.matrix);
+ break;
+
+ case ShapeEnum.Emplacement:
+ geom = objLibrary[1].clone();
+ break;
+
+ case ShapeEnum.Roof1:
+ geom = objLibrary[2].clone();
+ break;
+
+ case ShapeEnum.Roof2:
+ geom = objLibrary[3].clone();
+ break;
+
+ case ShapeEnum.Cyl:
+ geom = new THREE.CylinderGeometry(8, 8, 2, 20);
+ geom.applyMatrix( new THREE.Matrix4().makeTranslation(0, 1, 0));
+ break;
+
+ default:
+ geom = new THREE.CylinderGeometry(8, 8, 2, 20);
+ geom.applyMatrix( new THREE.Matrix4().makeTranslation(0, 1, 0));
+ break;
+
+ }
+
+ geom.applyMatrix( new THREE.Matrix4().makeScale(scale.x, scale.y, scale.z));
+ geom.applyMatrix( new THREE.Matrix4().makeRotationY(yaw * Math.PI / 180.0));
+ geom.applyMatrix( new THREE.Matrix4().makeTranslation(pos.x, pos.y, pos.z));
+ this.geometry.merge(geom, geom.matrix);
+ }
+
+ // add a single already-created shape
+ addWholeShape(shape) {
+ this.addShape(shape.pos, shape.scale, shape.yaw, shape.type, shape.terminal, shape.iter);
+ }
+
+ // completely removes all geometry and information
+ resetGrammar() {
+ var g = this.scene.getObjectByName("grammarGeo");
+ if (g !== undefined) {
+ this.scene.remove(g);
+ this.mesh = undefined;
+ }
+ this.allShapes = [];
+ this.geometry = new THREE.Geometry();
+ this.numIterations = 1;
+ //this.addShape(new THREE.Vector3(0, 0, 0), new THREE.Vector3(1, 1, 1), 0.0, ShapeEnum.Ring, false);
+ }
+
+ // resets the shape grammar to its initial state
+ clearIterations() {
+ this.resetGrammar();
+ this.addShape(new THREE.Vector3(0, 0, 0),
+ new THREE.Vector3(1, 1, 1), 0.0, ShapeEnum.Ring, false, 1);
+ var outerWall = new Shape(new THREE.Vector3(0, -2, 0), new THREE.Vector3(1.2, 1, 1.2),
+ 0, ShapeEnum.Wall, false, 1);
+ this.addWholeShape(outerWall);
+ this.finalizeGrammar();
+ }
+
+
+ // caps this shape with a roof and terminates it
+ buildRoof(shape, shapeList) {
+ var longestSide = Math.max(shape.scale.x, shape.scale.z);
+ var roof;
+ if (shape.scale.x > shape.scale.z) {
+ roof = new Shape(new THREE.Vector3(shape.pos.x, 4 * shape.scale.y +shape.pos.y, shape.pos.z),
+ new THREE.Vector3(shape.scale.z, shape.scale.x, shape.scale.x),
+ shape.yaw + 90, ShapeEnum.Roof2, true, shape.iter + 1);
+
+ } else {
+ roof = new Shape(new THREE.Vector3(shape.pos.x, 4 * shape.scale.y +shape.pos.y, shape.pos.z),
+ new THREE.Vector3(shape.scale.x, shape.scale.z, shape.scale.z),
+ shape.yaw, ShapeEnum.Roof2, true, shape.iter + 1);
+ }
+
+
+ //console.log("snorf");
+ shapeList.push(roof);
+ }
+
+ // creates a tower on this building
+
+ // divides this shape and adds the new ones to the list
+ subdivide(shape, shapeList) {
+ var xS = Math.cos(shape.yaw * Math.PI / 180.0);
+ var zS = Math.sin(shape.yaw * Math.PI / 180.0);
+
+ if (Math.random() < 0.1 || shape.scale.x < 0.1 || shape.scale.z < 0.1) {
+ shape.terminal = true;
+ shapeList.push(shape);
+ this.buildRoof(shape, shapeList);
+ return;
+ }
+
+
+ var s1; var s2;
+ var d; var s;
+ if (Math.random() > 0.5) {
+ d = new THREE.Vector2(0, shape.scale.z);
+ d.rotateAround(new THREE.Vector2(0, 0), shape.yaw * Math.PI / 180.0);
+ s = new THREE.Vector3(shape.scale.x, shape.scale.y, 0.45 * shape.scale.z);
+ } else {
+ d = new THREE.Vector2(shape.scale.x, 0);
+ d.rotateAround(new THREE.Vector2(0, 0), shape.yaw * Math.PI / 180.0);
+ s = new THREE.Vector3(0.4 * shape.scale.x, shape.scale.y, shape.scale.z);
+ }
+
+ s1 = new Shape(new THREE.Vector3(shape.pos.x + d.x,
+ shape.pos.y, shape.pos.z - d.y), s.multiply(new THREE.Vector3(1, 1.0 - Math.random() * 0.2, 1)),
+ shape.yaw, ShapeEnum.Block, false, shape.iter + 1);
+ s2 = new Shape(new THREE.Vector3(shape.pos.x - d.x,
+ shape.pos.y, shape.pos.z + d.y), s.multiply(new THREE.Vector3(1, 1.0 - Math.random() * 0.2, 1)),
+ shape.yaw, ShapeEnum.Block, false, shape.iter + 1);
+
+ shapeList.push(s1);
+ shapeList.push(s2);
+ }
+
+
+ // creates another layer of the city
+ buildLayer(shape, shapeList) {
+ var x = (8.0 - 1.5 * shape.iter) / 8.0;
+ var y = (8.0 - 0.5 * shape.iter) / 8.0;
+ var s = new THREE.Vector3(x, y, x)
+ var check = this.numIterations > 3;
+
+ var layer = new Shape(new THREE.Vector3(shape.pos.x, shape.pos.y + 2 * shape.scale.y, shape.pos.z),
+ s,
+ shape.yaw, check? ShapeEnum.Cyl : ShapeEnum.Ring, false, shape.iter + 1);
+
+
+ var cliff = new Shape(new THREE.Vector3(0, 0, 0),
+ new THREE.Vector3(1, y * (shape.iter + 2), 1),
+ 0, ShapeEnum.Wedge, true, 1);
+
+
+ shape.terminal = true; // end iteration on original
+ shapeList.push(shape); // preserve original
+ shapeList.push(cliff);
+ shapeList.push(layer);
+ }
+
+
+ // places houses in a reasonable way along the ring
+ placeRadial(shape, shapeList) {
+ var inner = (8.0 - 1.5 * (shape.iter - 1.0));
+ var outer = (8.0 - 1.5 * (shape.iter - 2.0));
+ var rCenter = 0.5 * (inner + outer) - 0.05;
+ var arc = 2 * Math.PI * rCenter *
+ console.log(rCenter);
+ var rScale = 0.5 * 0.25 * (outer - inner);
+ var topLayer = shape.type == ShapeEnum.Cyl;
+ var rowOffset = (Math.random() - 0.5) * 5.0 + 4.5;
+ for (var i = 0; i < 20; i++) {
+ var offset = (Math.random() - 0.5) * 2.0;
+ var theta = i * 360.0 / 40 + offset + rowOffset + (topLayer? 0 : offset);
+ theta = topLayer ? theta * 2 : theta;
+ if (Math.abs(theta - 90) < 10) continue; // avoid the wedge
+ var rct = rCenter * Math.cos(theta * Math.PI / 180.0);
+ var rst = rCenter * Math.sin(theta * Math.PI / 180.0);
+ //console.log(theta);
+
+ var pop = populationDensity(rct, rst);
+ if (pop < -0.2) continue; // not populous enough for a building
+
+ var s = new Shape(new THREE.Vector3(rct, shape.pos.y, rst),
+ new THREE.Vector3(1.4 * rScale,
+ (topLayer ? 2.0 : 1.0) * 0.3 * inner * (1 + pop) * (rScale),
+ (topLayer ? 2.0 : 1.0) *shape.scale.z * 1.5 * rScale),
+ -theta, ShapeEnum.Block,
+ false, shape.iter + 1);
+ shapeList.push(s);
+ }
+
+ if (shape.type == ShapeEnum.Cyl) {
+ shape.terminal = true;
+ shapeList.push(shape);
+ }
+ }
+
+ // places a building atop an existing emplacement
+ buildEmplacement(shape, shapeList) {
+ var pop = 1.0 + populationDensity(shape.pos.x, shape.pos.z);
+
+ var s = new Shape(new THREE.Vector3(shape.pos.x, shape.pos.y, shape.pos.z),
+ new THREE.Vector3(shape.scale.x * 0.25, pop * shape.scale.y * 0.25, shape.scale.z * 0.5 * 0.25),
+ shape.yaw, ShapeEnum.Block, false, shape.iter + 1);
+ shapeList.push(s);
+ shape.terminal = true;
+ shapeList.push(shape);
+ }
+
+ // creates a tower on the wall
+ buildWallTower(shape, shapeList) {
+ var rad = 8 * shape.scale.z;
+ var numTowers = Math.floor(Math.random() * 5.0);
+ var offset = Math.random() * 180.0 / numTowers;
+
+ // wall emplacements
+ for (var i = 0; i < 10; i++) {
+ if (Math.random() < 0.6) continue;
+ var theta = i * 18.0 + 9.0;
+ if (Math.abs(theta - 90) < 10) continue; // avoid the wedge
+ var ct = Math.cos(theta * Math.PI / 180.0)
+ var st = Math.sin(theta * Math.PI / 180.0)
+
+ var rct = rad * ct;
+ var rst = rad * st;
+
+ var s = new Shape(new THREE.Vector3(rct, shape.pos.y + 4 * shape.scale.y, rst),
+ new THREE.Vector3(shape.scale.x, shape.scale.y + (Math.random() - 0.5) * 0.2, shape.scale.z),
+ 90-theta, ShapeEnum.Emplacement, false, shape.iter + 1);
+ shapeList.push(s);
+ }
+
+ // wall towers
+ for (var i = 0; i <= 10; i++) {
+ if (Math.random() < 0.7) continue;
+ var theta = i * 18.0;
+ if (Math.abs(theta - 90) < 10) continue; // avoid the wedge
+ var ct = Math.cos(theta * Math.PI / 180.0)
+ var st = Math.sin(theta * Math.PI / 180.0)
+
+ var rct = rad * ct;
+ var rst = rad * st;
+
+ var o = 1 + (Math.random() - 0.5) * 0.3;
+
+ var s = new Shape(new THREE.Vector3(rct, shape.pos.y, rst),
+ new THREE.Vector3(shape.scale.x, o * shape.scale.y, shape.scale.z),
+ -theta, ShapeEnum.Tower, true, shape.iter + 1);
+ shapeList.push(s);
+
+ var r = new Shape(new THREE.Vector3(rct, shape.pos.y + 5 * o * shape.scale.y, rst),
+ new THREE.Vector3(0.7 * shape.scale.x, 0.7 * shape.scale.x, 0.7 * shape.scale.z),
+ -theta, ShapeEnum.Roof1, true, shape.iter + 1);
+ shapeList.push(r);
+ }
+
+ if (shape.type == ShapeEnum.Wall) {
+ shape.terminal = true;
+ shapeList.push(shape);
+ }
+
+ }
+
+ // apply a rule to each non - terminal shape in the grammar
+ iterateGrammar() {
+ // begin a new list of shapes
+ var newShapes = [];
+ var newIter = this.numIterations + 1;
+
+ // for each shape, apply an appropriate rule
+ for (var i = 0; i < this.allShapes.length; i++) {
+ if (!this.allShapes[i].terminal) {
+ switch(this.allShapes[i].type) {
+ case ShapeEnum.Ring:
+ this.buildLayer(this.allShapes[i], newShapes);
+ this.placeRadial(this.allShapes[i], newShapes);
+ this.buildWallTower(this.allShapes[i], newShapes);
+ break;
+ case ShapeEnum.Block:
+ this.subdivide(this.allShapes[i], newShapes);
+ break;
+ case ShapeEnum.Wall:
+ this.buildWallTower(this.allShapes[i], newShapes);
+ break;
+ case ShapeEnum.Cyl:
+ this.placeRadial(this.allShapes[i], newShapes);
+ break;
+ case ShapeEnum.Emplacement:
+ this.buildEmplacement(this.allShapes[i], newShapes);
+ break;
+ default:
+ newShapes.push(this.allShapes[i]);
+ break;
+ }
+ } else {
+ // this shape is terminal. Simply add it to the list
+ if (this.allShapes[i].type == ShapeEnum.Block) {
+ //this.buildRoof(this.allShapes[i], newShapes);
+ }
+ newShapes.push(this.allShapes[i]);
+ }
+
+ }
+
+ // clear out the old information and geometry
+ this.resetGrammar();
+
+ // add every shape from the iteration
+ for (var i = 0; i < newShapes.length; i++) {
+ this.addWholeShape(newShapes[i]);
+ }
+
+
+
+ // render the new shape grammar
+ this.numIterations = newIter;
+ this.finalizeGrammar();
+ }
+
+ // takes the merged geometry and applies it to the scene
+ finalizeGrammar() {
+ if (this.mesh == undefined) {
+ this.mesh = new THREE.Mesh(this.geometry, material);
+ this.mesh.name = "grammarGeo";
+ this.mesh.castShadow = true;
+ this.mesh.receiveShadow = true;
+ this.scene.add(this.mesh);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/webpack.config.js b/webpack.config.js
new file mode 100644
index 00000000..57dce485
--- /dev/null
+++ b/webpack.config.js
@@ -0,0 +1,28 @@
+const path = require('path');
+
+module.exports = {
+ entry: path.join(__dirname, "src/main"),
+ output: {
+ filename: "./bundle.js"
+ },
+ module: {
+ loaders: [
+ {
+ test: /\.js$/,
+ exclude: /(node_modules|bower_components)/,
+ loader: 'babel',
+ query: {
+ presets: ['es2015']
+ }
+ },
+ {
+ test: /\.glsl$/,
+ loader: "webpack-glsl"
+ },
+ ]
+ },
+ devtool: 'source-map',
+ devServer: {
+ port: 7000
+ }
+}
\ No newline at end of file