aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Final.hs17
-rw-r--r--Graphics/Glyph/ExtendedGL.hs74
-rw-r--r--Graphics/Glyph/ExtendedGL/Base.hs117
-rw-r--r--Graphics/Glyph/ExtendedGL/Framebuffers.hs109
-rw-r--r--README.txt9
-rw-r--r--Resources.hs10
-rw-r--r--box.obj103
-rw-r--r--jungletree.obj2221
-rw-r--r--shaders/sky.frag1
-rw-r--r--shaders/water.frag16
-rw-r--r--shaders/water.tcs28
-rw-r--r--shaders/water.tes69
-rw-r--r--terrain/beach.pngbin0 -> 1430254 bytes
-rw-r--r--terrain/forest.pngbin0 -> 2191038 bytes
-rw-r--r--terrain/grass.pngbin0 -> 2501389 bytes
-rw-r--r--terrain/jungle.pngbin0 -> 2486997 bytes
-rw-r--r--terrain/mountains.pngbin0 -> 2393628 bytes
-rw-r--r--terrain/oceanfloor.pngbin0 -> 2884650 bytes
-rw-r--r--terrain/tundra.pngbin0 -> 2021455 bytes
-rw-r--r--terrain/water.pngbin0 -> 1821757 bytes
-rw-r--r--textures/jungle_tree.pngbin0 -> 275744 bytes
-rw-r--r--textures/sky_reflect.pngbin0 -> 657310 bytes
-rw-r--r--textures/sky_reflect_night.pngbin0 -> 239993 bytes
-rw-r--r--textures/skybox.jpgbin0 -> 3757819 bytes
-rw-r--r--textures/skybox_sides.pngbin0 -> 2574790 bytes
-rw-r--r--textures/skybox_sides_night.pngbin0 -> 265133 bytes
-rw-r--r--textures/skybox_top.pngbin0 -> 468591 bytes
-rw-r--r--textures/skybox_top_night.pngbin0 -> 244275 bytes
-rw-r--r--textures/water.jpgbin0 -> 120230 bytes
-rw-r--r--textures/wood_low.pngbin0 -> 7753 bytes
-rw-r--r--tree.obj1443
31 files changed, 4137 insertions, 80 deletions
diff --git a/Final.hs b/Final.hs
index cba5784..facc916 100644
--- a/Final.hs
+++ b/Final.hs
@@ -2,6 +2,7 @@
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE FlexibleContexts #-}
+
module Main where
import Graphics.Rendering.OpenGL as GL
@@ -31,7 +32,8 @@ import Resources
import System.Random
import Debug.Trace
-
+import System.Environment
+import System.Exit
data TileType = Forest | Beach | Water | Grass | Jungle | Mountains |
Tundra | Unknown deriving (Enum,Eq)
@@ -129,7 +131,7 @@ getWaterQuads marr arr = do
mxy = fromIntegral maxy + 1
mny = fromIntegral miny - 1
relev = fromIntegral elev / 10 in
- mapM_ bVertex3 $ trianglesFromQuads
+ mapM_ bVertex3
[(mxx,relev,mxy),
(mxx,relev,mny),
(mnx,relev,mny),
@@ -258,9 +260,16 @@ createLocations arr gen density typ = do
main :: IO ()
main = do
+ let doload str = sequence
+ [ SDLImg.load $ "maps/"++str++"_terrain.png",
+ SDLImg.load $ "maps/"++str++"_height.png" ]
+ args <- getArgs
putStrLn "Loading..."
- terrain <- SDLImg.load "terrain.png"
- height <- SDLImg.load "height.png"
+ [terrain,height] <-
+ case args of
+ (ter:hei:_) -> sequence [SDLImg.load ter, SDLImg.load hei]
+ (m:_) -> doload m
+ _ -> sequence [SDLImg.load "maps/wonderland_terrain.png", SDLImg.load "maps/wonderland_height.png"]
putStrLn "Done Loading ..."
arr <- buildArray terrain height
diff --git a/Graphics/Glyph/ExtendedGL.hs b/Graphics/Glyph/ExtendedGL.hs
index 86258e1..a056c5b 100644
--- a/Graphics/Glyph/ExtendedGL.hs
+++ b/Graphics/Glyph/ExtendedGL.hs
@@ -1,70 +1,8 @@
-module Graphics.Glyph.ExtendedGL where
+module Graphics.Glyph.ExtendedGL
+ (
+ module All
+ ) where
-import Graphics.Rendering.OpenGL hiding (Points,Lines,Triangles)
-import qualified Graphics.Rendering.OpenGL as GL
-import Graphics.Rendering.OpenGL.Raw.Core31
-import Graphics.Rendering.OpenGL.Raw.ARB
+import Graphics.Glyph.ExtendedGL.Framebuffers as All hiding (framebufferBasicParameteri)
+import Graphics.Glyph.ExtendedGL.Base as All
-import Foreign.Marshal.Alloc
-import Foreign.Ptr
-import Foreign.Storable
-import Foreign.C.Types
-
-import System.IO.Unsafe
-import Control.Monad
-
-data ExPrimitiveMode = Points | Triangles | Lines | Patches deriving (Show,Enum)
-
-class IsPrimitiveModeMarshallable a where
- marshalPrimitiveMode :: a -> GLuint
-
-instance IsPrimitiveModeMarshallable ExPrimitiveMode where
- marshalPrimitiveMode x = case x of
- Points -> gl_POINTS
- Triangles -> gl_TRIANGLES
- Lines -> gl_LINES
- Patches -> gl_PATCHES
-
-instance IsPrimitiveModeMarshallable PrimitiveMode where
- marshalPrimitiveMode x = case x of
- GL.Points -> 0x0
- GL.Lines -> 0x1
- GL.LineLoop -> 0x2
- GL.LineStrip -> 0x3
- GL.Triangles -> 0x4
- GL.TriangleStrip -> 0x5
- GL.TriangleFan -> 0x6
- GL.Quads -> 0x7
- GL.QuadStrip -> 0x8
- GL.Polygon -> 0x9
-
-drawArraysInstanced ::
- (IsPrimitiveModeMarshallable a) => a -> ArrayIndex -> NumArrayIndices -> GLsizei -> IO ()
-drawArraysInstanced = glDrawArraysInstanced . marshalPrimitiveMode
-
-vertexAttributeDivisor :: AttribLocation -> SettableStateVar GLuint
-vertexAttributeDivisor (AttribLocation loc) =
- makeSettableStateVar $ \val ->
- glVertexAttribDivisor loc val
-
-patchVertices :: (Integral a) => SettableStateVar a
-patchVertices =
- makeSettableStateVar $ \val ->
- glPatchParameteri gl_PATCH_VERTICES $ fromIntegral val
-
-maxPatchVertices :: IO CInt
-maxPatchVertices =
- alloca $ \ptr -> do
- glGetIntegerv gl_MAX_PATCH_VERTICES ptr
- peek ptr
-
-getGLVersion :: IO String
-getGLVersion =
- let lift2 (a,b) = do
- x <- a ; y <- b ; return (x,y)
- in
- alloca $ \ptr1 -> alloca $ \ptr2 -> do
- glGetIntegerv gl_MAJOR_VERSION ptr1
- glGetIntegerv gl_MINOR_VERSION ptr2
- (v1,v2) <- lift2 (peek ptr1, peek ptr2)
- return ("OpenGL " ++ show v1 ++ "." ++ show v2)
diff --git a/Graphics/Glyph/ExtendedGL/Base.hs b/Graphics/Glyph/ExtendedGL/Base.hs
new file mode 100644
index 0000000..48f61a5
--- /dev/null
+++ b/Graphics/Glyph/ExtendedGL/Base.hs
@@ -0,0 +1,117 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+module Graphics.Glyph.ExtendedGL.Base where
+
+import qualified Graphics.Rendering.OpenGL as GL
+import Graphics.Rendering.OpenGL.Raw.Core31
+import Graphics.Rendering.OpenGL.Raw.ARB
+
+import Foreign.Marshal.Alloc
+import Foreign.Ptr
+import Foreign.Storable
+import Foreign.C.Types
+
+import System.IO.Unsafe
+import Control.Monad
+
+import Data.StateVar
+import Unsafe.Coerce
+
+data ExPrimitiveMode = Points | Triangles | Lines | Patches deriving (Show,Enum)
+
+class IsBindable a where
+ bind :: a -> IO ()
+class IsGLEnumMarshallable a where
+ toGLEnum :: a -> GLenum
+class IsGenerable a where
+ generate :: IO a
+class IsWrappedPrimitive t a where
+ unwrap :: a -> t
+ wrap :: t -> a
+class HasIntegerParam t a where
+ parami :: t -> a -> SettableStateVar GLuint
+class HasFloatParam t a where
+ paramf :: t -> a -> SettableStateVar GLfloat
+class HasParamOfType b t a where
+ param :: t -> a -> SettableStateVar b
+
+class IsPrimitiveModeMarshallable a where
+ marshalPrimitiveMode :: a -> GLuint
+
+castPrimitive :: forall a b t. (IsWrappedPrimitive t a, IsWrappedPrimitive t b) => a -> b
+castPrimitive x = wrap unw
+ where
+ unw :: t
+ unw = unwrap x
+
+instance (IsWrappedPrimitive a a) where
+ unwrap = id
+ wrap = id
+instance (IsWrappedPrimitive GLenum a) => IsGLEnumMarshallable a where
+ toGLEnum = unwrap
+
+instance IsPrimitiveModeMarshallable ExPrimitiveMode where
+ marshalPrimitiveMode x = case x of
+ Points -> gl_POINTS
+ Triangles -> gl_TRIANGLES
+ Lines -> gl_LINES
+ Patches -> gl_PATCHES
+
+instance IsPrimitiveModeMarshallable GL.PrimitiveMode where
+ marshalPrimitiveMode x = case x of
+ GL.Points -> 0x0
+ GL.Lines -> 0x1
+ GL.LineLoop -> 0x2
+ GL.LineStrip -> 0x3
+ GL.Triangles -> 0x4
+ GL.TriangleStrip -> 0x5
+ GL.TriangleFan -> 0x6
+ GL.Quads -> 0x7
+ GL.QuadStrip -> 0x8
+ GL.Polygon -> 0x9
+
+instance IsPrimitiveModeMarshallable GLuint where
+ marshalPrimitiveMode = id
+
+drawArraysInstanced ::
+ (IsPrimitiveModeMarshallable a) =>
+ a -> GL.ArrayIndex ->
+ GL.NumArrayIndices ->
+ GLsizei -> IO ()
+drawArraysInstanced = glDrawArraysInstanced . marshalPrimitiveMode
+
+vertexAttributeDivisor :: GL.AttribLocation -> SettableStateVar GLuint
+vertexAttributeDivisor (GL.AttribLocation loc) =
+ makeSettableStateVar $ \val ->
+ glVertexAttribDivisor loc val
+
+{- Sets the number of vertices per patch
+ - for OpenGL -}
+patchVertices :: (Integral a) => SettableStateVar a
+patchVertices =
+ makeSettableStateVar $ \val ->
+ glPatchParameteri gl_PATCH_VERTICES $ fromIntegral val
+
+{- Returns the maximum number of patches
+ - for a tessilation shader -}
+maxPatchVertices :: IO CInt
+maxPatchVertices =
+ alloca $ \ptr -> do
+ glGetIntegerv gl_MAX_PATCH_VERTICES ptr
+ peek ptr
+
+getGLVersion :: IO String
+getGLVersion =
+ let lift2 (a,b) = do
+ x <- a ; y <- b ; return (x,y)
+ in
+ alloca $ \ptr1 -> alloca $ \ptr2 -> do
+ glGetIntegerv gl_MAJOR_VERSION ptr1
+ glGetIntegerv gl_MINOR_VERSION ptr2
+ (v1,v2) <- lift2 (peek ptr1, peek ptr2)
+ return ("OpenGL " ++ show v1 ++ "." ++ show v2)
+
+coerced :: a
+coerced = unsafeCoerce (0::Int)
diff --git a/Graphics/Glyph/ExtendedGL/Framebuffers.hs b/Graphics/Glyph/ExtendedGL/Framebuffers.hs
new file mode 100644
index 0000000..abe9756
--- /dev/null
+++ b/Graphics/Glyph/ExtendedGL/Framebuffers.hs
@@ -0,0 +1,109 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+
+module Graphics.Glyph.ExtendedGL.Framebuffers where
+
+import Graphics.Rendering.OpenGL.Raw.ARB
+import Graphics.Rendering.OpenGL.Raw.Core31
+import qualified Graphics.Rendering.OpenGL as GL
+
+import Graphics.Glyph.ExtendedGL.Base
+
+import Foreign.Marshal.Alloc
+import Foreign.Ptr
+import Foreign.Storable
+import Foreign.C.Types
+
+import Data.StateVar
+import Control.Monad
+
+import Unsafe.Coerce
+
+
+class (
+ HasParamOfType GLuint FramebufferParameter a,
+ HasIntegerParam GLenum a,
+ IsGenerable a,
+ IsBindable a, IsWrappedPrimitive GLuint a) => IsFramebuffer a where
+
+ -- this function MUST discard the argument
+ getType :: a -> GLenum
+
+framebufferBasicParameteri :: (IsFramebuffer a) => GLenum -> a -> GLenum -> SettableStateVar GLuint
+framebufferBasicParameteri typ fb enum =
+ makeSettableStateVar (\value -> do
+ bind fb
+ glFramebufferParameteri typ enum $ fromIntegral value)
+
+data Renderbuffer = Renderbuffer GLuint
+instance IsWrappedPrimitive GLuint Renderbuffer where
+ unwrap (Renderbuffer x) = x
+instance IsGenerable Renderbuffer where
+ generate = alloca $ \ptr -> do
+ glGenRenderbuffers 1 ptr
+ liftM Renderbuffer $ peek ptr
+instance IsBindable Renderbuffer where
+ bind = glBindRenderbuffer gl_RENDERBUFFER . unwrap
+
+data RenderbufferArgument =
+ DepthAttachment
+instance IsWrappedPrimitive GLenum RenderbufferArgument where
+ unwrap DepthAttachment = gl_DEPTH_ATTACHMENT
+
+renderBufferStorageRaw :: (IsGLEnumMarshallable a, IsGLEnumMarshallable b) => a -> b -> Int -> Int -> IO ()
+renderBufferStorageRaw typ enum w h = glRenderbufferStorage (toGLEnum typ)
+ (toGLEnum enum) (fromIntegral w) (fromIntegral h)
+renderBufferStorage :: (IsGLEnumMarshallable a) => Renderbuffer -> SettableStateVar (a,Int,Int)
+renderBufferStorage buffer = makeSettableStateVar $ \(en,w,h) -> do
+ bind buffer
+ renderBufferStorageRaw gl_RENDERBUFFER en w h
+
+frameBufferRenderBuffer :: forall a b. (IsFramebuffer a,IsGLEnumMarshallable b) => Renderbuffer -> b -> IO a
+frameBufferRenderBuffer rb e = do
+ let enum :: GLenum
+ enum = getType test
+ unw :: GLuint
+ unw = unwrap rb
+ bind rb
+ glFramebufferRenderbuffer enum (toGLEnum e) gl_RENDERBUFFER (unwrap rb)
+ return $ wrap unw
+ where
+ test :: a
+ test = coerced
+
+data DrawFramebuffer = DrawFramebuffer GLuint
+data FramebufferParameter = DefaultWidth | DefaultHeight
+
+instance IsWrappedPrimitive GLenum FramebufferParameter where
+ unwrap p = case p of
+ DefaultWidth -> gl_FRAMEBUFFER_DEFAULT_WIDTH
+ DefaultHeight -> gl_FRAMEBUFFER_DEFAULT_HEIGHT
+ wrap x | x == gl_FRAMEBUFFER_DEFAULT_WIDTH = DefaultWidth
+ | x == gl_FRAMEBUFFER_DEFAULT_HEIGHT = DefaultHeight
+ | otherwise = undefined
+
+instance HasIntegerParam GLenum DrawFramebuffer where
+ parami p fb = framebufferBasicParameteri gl_DRAW_FRAMEBUFFER fb p
+
+{- Has parameters of type GLuint which are acessable by the data FramebufferParameter for
+ - the type DrawFramebuffer -}
+instance HasParamOfType GLuint FramebufferParameter DrawFramebuffer where
+ param = parami . toGLEnum
+
+instance IsGenerable DrawFramebuffer where
+ generate = alloca $ \ptr -> do
+ glGenFramebuffers 1 ptr
+ liftM DrawFramebuffer $ peek ptr
+
+instance IsBindable DrawFramebuffer where
+ bind (DrawFramebuffer fb) = glBindFramebuffer gl_DRAW_FRAMEBUFFER fb
+
+instance IsWrappedPrimitive GLuint DrawFramebuffer where
+ unwrap (DrawFramebuffer fb) = fb
+ wrap = DrawFramebuffer
+
+instance IsFramebuffer DrawFramebuffer where
+ getType _ = gl_DRAW_FRAMEBUFFER
diff --git a/README.txt b/README.txt
new file mode 100644
index 0000000..7c605f6
--- /dev/null
+++ b/README.txt
@@ -0,0 +1,9 @@
+This is still a work in progress, and I have not yet had time to bang around with tying to get it to compile on 12.04. A statically linked binary has been included (These things are getting big!)
+
+This program reads terrain.png and height.png to generate the terrain. You may edit these to your hearts content and look at the difference in the generated terrain.
+
+The water is still a work in progress. I am trying to get pseudo reflections to work and it is not being the best.
+
+Controls:
+ w,s,mouse - move
+ =/- - speed up time/slow down time
diff --git a/Resources.hs b/Resources.hs
index 4350d06..a7f7c14 100644
--- a/Resources.hs
+++ b/Resources.hs
@@ -42,6 +42,8 @@ import System.FilePath
import Models
import Debug.Trace
+import qualified Data.StateVar as SV
+
data CameraPosition = CameraPosition {
pEye :: Vec3 GLfloat,
pTh :: GLfloat,
@@ -194,8 +196,9 @@ displayHandle resources = do
uniform (UniformLocation 10) $= Vec4 (r,g,b,a::GLfloat)
return ()
+ cullFace $= Nothing
draw $ prepare (waterObj resources) $ \_ -> do
- patchVertices $= 3
+ patchVertices SV.$= 4
uniform (UniformLocation 4) $= pMatrix resources
uniform (UniformLocation 5) $= l_mvMatrix
uniform (UniformLocation 7) $= normalMatrix
@@ -298,7 +301,7 @@ buildForestObject seq obj tex = do
nelem Float (fromIntegral $ (3+3+2+1)*sizeOf (0::GLfloat))
(wordPtrToPtr offset))
vertexAttribArray location $= Enabled
- vertexAttributeDivisor location $= 1
+ vertexAttributeDivisor location SV.$= 1
declareAttr (AttribLocation 10) 3 0
declareAttr (AttribLocation 11) 3 (3*4)
@@ -319,8 +322,10 @@ makeResources surf builder forestB jungleB water = do
(Nothing::Maybe String) "shaders/water.vert" "shaders/water.frag"
waterTexture <- load "textures/water.jpg" >>= textureFromSurface
skyTexture <- load "textures/skybox_top.png" >>= textureFromSurface
+ skyNightTexture <- load "textures/skybox_top_night.png" >>= textureFromSurface
location <- get (uniformLocation waterProg "texture")
skyLocation <- get (uniformLocation waterProg "skytex")
+ skyNightLocation <- get (uniformLocation waterProg "skynight")
Resources
<$> pure surf
<*> do CameraPosition
@@ -340,6 +345,7 @@ makeResources surf builder forestB jungleB water = do
currentProgram $= Just waterProg
setupTexturing waterTexture location 0
setupTexturing skyTexture skyLocation 1
+ setupTexturing skyNightTexture skyNightLocation 2
)
<*> pure 0
<*> pure 1
diff --git a/box.obj b/box.obj
new file mode 100644
index 0000000..feb74de
--- /dev/null
+++ b/box.obj
@@ -0,0 +1,103 @@
+# Blender v2.69 (sub 10) OBJ File: ''
+# www.blender.org
+mtllib box.mtl
+o Cone.001
+v -0.000672 0.691012 -0.005766
+v 0.187465 0.199080 -0.142392
+v 0.187096 0.199079 0.131312
+v -0.000672 0.199147 0.217787
+v -0.132074 0.199147 0.175092
+v -0.233097 0.199075 -0.005366
+v -0.072979 0.199079 -0.226726
+v -0.011503 0.075154 0.003951
+vt 0.965293 0.946943
+vt 0.757133 0.003360
+vt 0.555209 0.945750
+vt 0.787129 0.986758
+vt 0.557453 0.018720
+vt 0.966329 0.004602
+vt 0.900698 0.932198
+vt 0.547213 0.904480
+vt 0.737138 0.060149
+vt 0.823898 -0.008999
+vt 0.536973 0.981280
+vt 0.982617 0.993638
+vt 0.963298 0.996170
+vt 0.531853 0.965920
+vt 0.793178 -0.014119
+vt 0.988649 -0.008950
+vt 0.721293 1.012000
+vt 0.511373 0.005218
+vn -0.756821 0.357129 -0.547431
+vn 0.287775 0.356884 -0.888718
+vn -0.806651 0.381484 0.451423
+vn -0.283652 0.396775 0.872990
+vn 0.386775 0.381567 0.839530
+vn 0.934139 0.356907 0.001260
+vn 0.450911 0.830837 0.326175
+vn -0.161958 0.850657 0.500152
+vn 0.478758 0.835931 -0.268347
+vn 0.162813 0.849944 -0.501086
+vn -0.221119 0.848493 -0.480798
+vn -0.529057 0.848586 -0.000709
+usemtl None
+s off
+f 6/1/1 1/2/1 7/3/1
+f 7/4/2 1/5/2 2/6/2
+f 5/7/3 1/8/3 6/9/3
+f 4/10/4 1/11/4 5/12/4
+f 3/13/5 1/14/5 4/15/5
+f 2/16/6 1/17/6 3/18/6
+f 6/1/7 8/2/7 7/3/7
+f 7/4/8 8/5/8 2/6/8
+f 5/7/9 8/8/9 6/9/9
+f 4/10/10 8/11/10 5/12/10
+f 3/13/11 8/14/11 4/15/11
+f 2/16/12 8/17/12 3/18/12
+o Cylinder_Cylinder.001
+v 0.000000 -0.044090 -0.037834
+v 0.000000 0.590325 -0.037834
+v 0.035982 -0.044090 -0.011691
+v 0.035982 0.590325 -0.011691
+v 0.022238 -0.044090 0.030608
+v 0.022238 0.590325 0.030608
+v -0.022238 -0.044090 0.030608
+v -0.022238 0.590325 0.030608
+v -0.035982 -0.044090 -0.011691
+v -0.035982 0.590325 -0.011691
+vt 0.473599 0.996163
+vt -0.004194 0.994066
+vt 0.002097 0.012226
+vt 0.477809 0.996536
+vt 0.000016 0.990245
+vt 0.006307 0.014696
+vt -0.002097 0.995790
+vt 0.000000 0.000000
+vt 0.459650 0.000000
+vt 0.478167 1.000357
+vt -0.003821 0.998260
+vt 0.019248 0.022711
+vt 0.008047 0.991969
+vt 0.480264 0.014323
+vt 0.479890 0.029003
+vt 0.473615 0.016793
+vt 0.470135 0.995790
+vt 0.014339 0.008031
+vn 0.587785 0.000000 -0.809017
+vn 0.951057 0.000000 0.309017
+vn -0.000000 0.000000 1.000000
+vn -0.587785 0.000000 -0.809017
+vn -0.951057 0.000000 0.309017
+vn 0.951056 0.000000 0.309017
+usemtl None
+s off
+f 10/19/13 12/20/13 11/21/13
+f 12/22/14 14/23/14 13/24/14
+f 14/25/15 16/26/15 15/27/15
+f 18/28/16 10/29/16 9/30/16
+f 16/31/17 18/28/17 17/32/17
+f 9/33/13 10/19/13 11/21/13
+f 11/34/18 12/22/18 13/24/18
+f 13/35/15 14/25/15 15/27/15
+f 17/32/16 18/28/16 9/30/16
+f 15/36/17 16/31/17 17/32/17
diff --git a/jungletree.obj b/jungletree.obj
new file mode 100644
index 0000000..60bc734
--- /dev/null
+++ b/jungletree.obj
@@ -0,0 +1,2221 @@
+# Blender v2.69 (sub 10) OBJ File: 'tree.blend'
+# www.blender.org
+mtllib jungletree.mtl
+o Gnarly_t
+v -1.241794 -0.080767 0.349568
+v -0.070413 -0.005682 0.771455
+v -1.225719 -0.080523 0.205170
+v -1.028326 0.082199 0.313829
+v -1.196990 -0.027785 0.173908
+v -1.170813 0.135329 0.371205
+v -1.141506 0.067116 0.210818
+v -0.023985 0.558933 0.744649
+v -1.144928 0.131624 0.173192
+v -1.127964 0.279329 0.356636
+v -0.070413 -0.005682 0.699745
+v -1.127547 0.094576 0.382194
+v -1.029204 0.427446 0.496809
+v -0.023985 0.558933 0.726550
+v -1.003424 0.253496 0.403136
+v -0.927008 0.300153 0.339820
+v -1.066006 0.083433 0.327798
+v -1.029310 0.018328 0.310136
+v -1.032693 -0.093721 0.368285
+v -1.229565 0.247270 0.488552
+v -1.223163 -0.041658 0.032006
+v -0.988108 0.207267 0.248518
+v -0.978307 0.334693 0.354504
+v -1.288188 0.263877 0.773581
+v -1.005237 0.197812 0.222332
+v -1.271851 0.093906 0.484852
+v -1.089672 -0.010369 0.057695
+v -0.957779 0.204393 0.245619
+v -1.260607 0.261407 0.300058
+v -0.950363 0.403808 0.444908
+v -0.947790 0.189232 0.323318
+v -1.230480 0.279221 0.302592
+v -1.078790 0.019449 0.385010
+v -1.239383 0.080550 0.458240
+v -0.935977 -0.021875 0.230605
+v -1.180290 0.442832 0.621216
+v -0.881584 0.194650 0.344418
+v -0.921958 0.205013 0.178608
+v -0.853890 0.024283 0.397274
+v -0.919284 -0.082240 0.409203
+v -1.329484 -0.127293 0.049793
+v -1.210401 0.411078 0.531880
+v -0.840019 0.304254 0.187444
+v -0.958255 0.271477 0.008314
+v -1.299029 -0.057182 -0.126580
+v -0.984947 0.160716 0.057560
+v -1.192800 0.276297 0.809515
+v -0.979938 0.257401 0.224288
+v -1.188719 0.208824 0.281391
+v -1.066421 0.403439 0.144539
+v -0.898104 -0.018834 0.525469
+v -1.184886 0.283165 0.475436
+v -1.158425 0.100924 0.723354
+v -0.845279 0.230842 0.478109
+v -0.746192 0.008377 0.356354
+v -1.030328 0.324872 0.555450
+v -0.960115 -0.198158 -0.018244
+v -0.953064 0.269016 0.080885
+v -1.139382 0.422893 0.402381
+v -0.769866 0.232294 0.288789
+v -0.774343 0.447023 0.290075
+v -1.139968 0.339762 0.437360
+v -0.863449 0.104655 0.258859
+v -0.809639 0.243503 0.342449
+v -1.093536 0.473640 0.635285
+v -0.842246 0.138494 0.029439
+v -0.770315 0.283650 0.336717
+v -0.855176 0.431958 0.294068
+v -1.026445 0.283986 0.616197
+v -1.014803 -0.113932 -0.287111
+v -0.786720 0.290719 0.113016
+v -1.124153 0.362250 0.450884
+v -0.960348 0.040566 -0.219421
+v -0.923709 0.012265 -0.337332
+v -0.794191 0.381077 0.386166
+v -1.109918 -0.105071 0.903023
+v -1.027965 0.594113 0.513442
+v -0.980897 0.203875 0.412013
+v -0.803320 -0.099685 0.524354
+v -0.992341 -0.024668 -0.286202
+v -0.887567 -0.227521 0.322207
+v -0.798267 0.341467 0.265400
+v -0.815318 0.490703 0.151509
+v -1.098617 0.264031 0.212434
+v -0.966338 0.361455 0.222139
+v -0.831125 0.329591 0.249782
+v -0.576209 0.128606 0.744368
+v -1.000873 0.465516 0.460730
+v -0.862868 -0.050630 -0.294664
+v -0.925900 0.477161 0.479378
+v -0.737442 0.124797 0.496690
+v -1.057588 0.442812 0.389272
+v -0.949616 0.465573 0.687170
+v -1.018488 0.019423 -0.246655
+v -0.678956 0.293511 0.421645
+v -0.934914 0.302072 0.216013
+v -0.713355 -0.092682 0.449300
+v -0.796515 0.324338 0.412137
+v -0.822307 -0.102742 -0.295738
+v -0.768109 0.013831 0.297654
+v -0.973972 0.231231 -0.124079
+v -0.687369 0.291364 -0.137838
+v -0.673595 0.328245 0.276688
+v -0.978958 0.100199 0.762474
+v -1.034707 0.162358 0.749157
+v -0.782778 0.262296 0.176444
+v -0.781570 0.101041 0.200591
+v -0.780291 0.249734 0.266941
+v -0.886111 0.516640 0.336176
+v -0.775329 0.457258 0.355248
+v -0.739409 0.187402 -0.123410
+v -0.488603 0.207554 -0.083284
+v -0.725461 -0.157461 -0.273318
+v -0.914357 0.326480 0.290713
+v -0.763502 0.079612 0.473001
+v -0.772350 0.445685 -0.328350
+v -0.958779 0.431852 0.849411
+v -0.699461 0.437006 0.298893
+v -0.760213 0.408094 -0.412950
+v -0.584817 0.050160 0.122784
+v -0.512725 0.133472 0.881919
+v -0.634863 0.014381 0.437955
+v -0.690537 0.444811 0.166742
+v -0.762586 0.391850 0.333876
+v -0.755085 0.196274 0.017474
+v -0.748431 0.330506 0.532017
+v -0.818404 -0.072005 0.952692
+v -0.884238 0.372710 0.263300
+v -0.956188 0.362630 0.238433
+v -0.626293 0.080814 -0.239795
+v -0.967278 0.172571 0.402438
+v -0.963920 0.246722 0.857349
+v -0.725331 0.507638 0.243744
+v -0.577781 0.005742 0.398690
+v -0.897898 0.243972 0.479270
+v -0.731909 0.147622 -0.529337
+v -0.836803 0.531022 0.304024
+v -0.622096 0.329865 0.228285
+v -0.850230 0.278141 0.496484
+v -1.046446 0.521358 0.531831
+v -0.717501 0.155692 0.759487
+v -0.685541 -0.100693 -0.468016
+v -0.710719 0.196868 0.843267
+v -0.701506 0.050436 0.959766
+v -0.537503 0.279636 0.816287
+v -0.830301 0.270421 0.770831
+v -0.696866 0.178431 0.838229
+v -0.685093 0.043262 0.785496
+v -0.626098 0.336567 -0.035048
+v -0.624908 0.343511 0.292445
+v -0.514207 0.270997 0.973451
+v -0.599154 0.002014 -0.376483
+v -0.693707 0.137587 0.820193
+v -0.616406 0.645485 -0.512519
+v -0.663505 0.178479 0.919690
+v -0.555163 0.309256 0.648819
+v -0.615670 0.219595 0.738541
+v -0.599362 0.348189 0.266045
+v -0.850253 0.663011 0.512037
+v -0.413839 0.322630 0.138642
+v -0.776080 0.556933 0.824302
+v -0.643872 0.491610 -0.597818
+v -0.723895 -0.122180 -0.246297
+v -0.877579 0.352011 0.127408
+v -0.486312 0.557906 -0.135712
+v -0.564840 0.127916 -0.282902
+v -0.660439 0.047745 0.691390
+v -0.597424 0.412922 0.434429
+v -0.661913 -0.038473 0.860879
+v -0.620671 0.393964 0.177396
+v -0.854747 0.104785 0.625782
+v -0.624008 0.064187 0.148066
+v -0.612440 0.244991 0.710359
+v -0.652438 0.217054 0.829564
+v -0.530825 0.484935 -0.073920
+v -0.647943 0.291725 0.707078
+v -0.910612 0.521913 0.382311
+v -0.584363 0.434200 0.909378
+v -0.609092 0.469902 0.235853
+v -0.587412 0.491909 0.322866
+v -0.590896 0.317778 0.653298
+v -0.569692 0.351237 0.869955
+v -0.659865 0.372790 -0.509970
+v -0.871201 0.093545 0.442203
+v -0.768271 0.458165 0.652445
+v -0.593708 0.390377 0.193904
+v -0.656778 0.262452 0.295396
+v -0.625323 0.285970 0.350572
+v -0.705848 -0.250288 0.153709
+v -0.573191 0.113795 0.564650
+v -0.583398 0.353329 0.777306
+v -0.509388 0.418117 -0.771402
+v -0.568237 0.134526 0.810911
+v -0.572221 0.182724 0.701871
+v -0.584165 0.561815 -0.224473
+v -0.488316 0.342316 0.815018
+v -0.800065 0.311915 0.640027
+v -0.543801 0.427089 0.127708
+v -0.565436 0.035069 0.815570
+v -0.514714 0.690480 -0.599450
+v -0.675884 0.804716 0.376148
+v -0.587336 0.135630 0.655417
+v -0.608476 0.095715 -0.137384
+v -0.506021 0.325345 0.028220
+v -0.620724 0.181384 0.660836
+v -0.779718 0.711213 0.624532
+v -0.651567 0.375703 0.429332
+v -0.422407 0.679406 -0.430830
+v -0.580962 0.294773 0.132293
+v -0.814634 0.446269 0.985847
+v -0.378212 0.308200 0.503731
+v -0.446161 0.572226 0.086506
+v -0.403600 0.245693 -0.387903
+v -0.575360 0.274483 0.800407
+v -0.291113 0.658994 -0.176846
+v -0.752726 0.642692 0.629204
+v -0.490639 0.532945 0.229358
+v -0.465547 0.509608 0.840767
+v -0.558237 0.333960 -0.404687
+v -0.600162 0.262318 0.777909
+v -0.652154 0.489795 0.333557
+v -0.412543 0.388301 0.027651
+v -0.734923 0.675898 0.802775
+v -0.355926 0.668904 -0.811180
+v -0.551783 -0.002590 0.885341
+v -0.457139 0.392104 -0.805196
+v -0.711867 0.218654 0.846693
+v -0.394744 0.824555 -0.384367
+v -0.417940 0.752418 -0.402940
+v -0.705894 0.774352 0.739021
+v -0.699552 0.234187 0.950088
+v -0.496515 0.450079 0.100800
+v -0.755052 0.564301 0.636871
+v -0.681318 0.169728 0.413786
+v -0.677468 0.296348 0.857032
+v -0.564846 0.072176 0.822154
+v -0.543851 0.237029 0.521097
+v -0.403214 0.365783 0.590668
+v -0.519400 0.389196 0.818918
+v -0.511162 0.516619 -0.662996
+v -0.515380 0.519922 -0.656470
+v -0.506691 0.332971 0.659043
+v -0.368026 0.029380 -0.050897
+v -0.584150 0.289737 0.771924
+v -0.346695 0.607352 -0.745143
+v -0.315720 0.780807 -0.217216
+v -0.332475 0.146687 -0.169193
+v -0.398851 0.391989 -0.291865
+v -0.485691 0.379177 -0.063021
+v -0.628773 0.297959 0.930063
+v -0.556604 0.344541 0.638030
+v -0.560609 0.442998 0.705247
+v -0.427272 0.644642 -0.657526
+v -0.486933 0.429513 0.644536
+v -0.276054 0.203489 -0.242212
+v -0.554402 0.437096 0.607176
+v -0.444739 0.519521 -0.668212
+v -0.303482 0.830778 -0.421406
+v -0.510087 0.404961 0.897362
+v -0.629253 0.287902 0.640689
+v -0.465698 0.167527 0.913886
+v -0.457210 0.166290 -0.750525
+v -0.454684 0.208885 0.737360
+v -0.406786 0.652630 -0.207413
+v -0.453872 0.091653 0.755808
+v -0.589504 0.165145 0.590290
+v -0.512689 0.087632 -0.581309
+v -0.105033 0.658578 -0.126485
+v -0.577995 0.294525 0.816421
+v -0.506363 0.123218 -0.602350
+v -0.179951 0.499762 -0.273044
+v -0.538375 0.643840 0.784086
+v -0.439800 0.265162 0.465021
+v -0.565605 0.460972 0.674600
+v -0.505124 0.266637 0.650334
+v -0.705094 0.525550 0.843510
+v -0.139039 0.746185 -0.288702
+v -0.431238 -0.024940 0.960349
+v -0.418688 0.334122 0.901238
+v -0.470007 0.341573 -0.602825
+v -0.367553 0.306437 0.601398
+v -0.544523 0.511309 0.871529
+v -0.497013 0.406645 0.439255
+v -0.488796 0.669792 0.799702
+v -0.586765 0.553170 0.812270
+v -0.402907 0.479439 0.944929
+v -0.337182 0.509051 0.539603
+v -0.416569 0.315409 0.490754
+v -0.353378 0.421579 0.554264
+v -0.390399 0.280455 0.444498
+v -0.274699 0.392622 -0.105620
+v -0.304619 0.392319 0.723335
+v -0.453589 0.788362 0.761467
+v -0.493843 0.334052 0.994454
+v -0.281748 0.558470 -0.007357
+v -0.491835 0.414645 0.730242
+v -0.290467 0.745080 0.178432
+v -0.490169 0.283979 0.679428
+v -0.334708 0.609912 0.463006
+v -0.372308 0.575252 0.159097
+v -0.392937 0.334360 0.602011
+v -0.267485 0.470903 -0.236770
+v -0.367746 0.427878 -0.010287
+v -0.301781 0.375183 0.575720
+v -0.242823 0.334202 -0.717887
+v -0.280781 0.637311 -0.647632
+v -0.360578 0.339856 0.457243
+v -0.422747 0.196074 -0.780493
+v -0.392219 0.205648 -0.786588
+v -0.393422 -0.020408 -0.710098
+v -0.569950 0.762916 0.922629
+v -0.310021 0.264407 -0.544117
+v -0.254096 0.533222 0.457408
+v -0.312174 0.383747 0.799342
+v -0.340398 0.376747 0.368185
+v -0.437825 0.205416 0.791648
+v -0.231533 0.562085 -0.282339
+v -0.423087 0.479566 0.821416
+v -0.246768 0.531639 0.527365
+v -0.335659 0.437104 0.395701
+v -0.374669 0.385906 0.775733
+v -0.528352 0.708577 0.509723
+v -0.343643 0.817393 0.750388
+v -0.372313 0.410418 -0.770585
+v -0.524099 0.749362 0.339127
+v -0.414611 0.717321 -0.115449
+v -0.234905 0.637699 0.183585
+v -0.317571 0.381693 -0.714486
+v -0.310345 0.231086 0.888186
+v -0.566926 0.487786 0.649457
+v -0.293773 0.152508 -0.612518
+v -0.112273 0.714292 0.061289
+v -0.199287 0.627051 0.250257
+v -0.195522 0.405549 0.064182
+v -0.330582 -0.007318 -0.806763
+v -0.242457 0.586973 -0.054764
+v -0.174566 0.572958 -0.093680
+v -0.346208 0.429165 0.817267
+v -0.407363 0.507979 -0.150410
+v -0.285893 0.598518 0.247880
+v -0.444281 0.640894 -0.144907
+v -0.294605 0.635497 -0.480998
+v -0.267739 0.492646 0.369771
+v -0.131415 0.428544 0.583428
+v -0.235718 0.110257 -0.679443
+v -0.264931 0.533930 0.347183
+v -0.256092 0.168692 -0.734350
+v -0.289639 0.172016 -0.870011
+v -0.333328 0.571019 0.956675
+v -0.259082 0.330794 0.737460
+v -0.297847 0.993380 -0.316177
+v -0.285198 0.714373 -0.249894
+v -0.295701 0.561077 -0.612632
+v -0.053716 0.820971 0.565475
+v -0.295543 0.434790 0.537464
+v -0.284426 0.575346 0.718134
+v -0.242895 0.501125 0.058484
+v -0.141050 0.799073 0.203858
+v -0.040294 0.892992 0.178114
+v -0.291492 0.397501 0.924470
+v -0.290000 0.461266 0.967845
+v -0.248896 0.214181 -0.760673
+v -0.249053 0.585000 0.154132
+v -0.070899 0.563289 0.021752
+v -0.223519 0.329024 0.752389
+v -0.239387 0.491841 0.297106
+v -0.207092 0.675198 0.056479
+v -0.213526 0.440214 -0.736810
+v -0.190520 0.179754 -0.756937
+v -0.223708 0.255144 -0.792903
+v -0.218046 0.620377 0.338485
+v -0.221791 0.539907 0.764690
+v -0.199413 0.593343 0.372767
+v -0.233387 0.212048 -0.678615
+v -0.211094 0.614331 0.353637
+v 0.110971 0.867837 0.450006
+v -0.139800 0.624068 0.211680
+v -0.247521 0.872474 0.272482
+v -0.390387 0.200318 -0.873723
+v -0.195409 0.387978 0.698311
+v -0.203309 0.016112 -0.781503
+v -0.250621 0.559793 0.350025
+v -0.093533 0.366