diff options
| -rw-r--r-- | Final.hs | 17 | ||||
| -rw-r--r-- | Graphics/Glyph/ExtendedGL.hs | 74 | ||||
| -rw-r--r-- | Graphics/Glyph/ExtendedGL/Base.hs | 117 | ||||
| -rw-r--r-- | Graphics/Glyph/ExtendedGL/Framebuffers.hs | 109 | ||||
| -rw-r--r-- | README.txt | 9 | ||||
| -rw-r--r-- | Resources.hs | 10 | ||||
| -rw-r--r-- | box.obj | 103 | ||||
| -rw-r--r-- | jungletree.obj | 2221 | ||||
| -rw-r--r-- | shaders/sky.frag | 1 | ||||
| -rw-r--r-- | shaders/water.frag | 16 | ||||
| -rw-r--r-- | shaders/water.tcs | 28 | ||||
| -rw-r--r-- | shaders/water.tes | 69 | ||||
| -rw-r--r-- | terrain/beach.png | bin | 0 -> 1430254 bytes | |||
| -rw-r--r-- | terrain/forest.png | bin | 0 -> 2191038 bytes | |||
| -rw-r--r-- | terrain/grass.png | bin | 0 -> 2501389 bytes | |||
| -rw-r--r-- | terrain/jungle.png | bin | 0 -> 2486997 bytes | |||
| -rw-r--r-- | terrain/mountains.png | bin | 0 -> 2393628 bytes | |||
| -rw-r--r-- | terrain/oceanfloor.png | bin | 0 -> 2884650 bytes | |||
| -rw-r--r-- | terrain/tundra.png | bin | 0 -> 2021455 bytes | |||
| -rw-r--r-- | terrain/water.png | bin | 0 -> 1821757 bytes | |||
| -rw-r--r-- | textures/jungle_tree.png | bin | 0 -> 275744 bytes | |||
| -rw-r--r-- | textures/sky_reflect.png | bin | 0 -> 657310 bytes | |||
| -rw-r--r-- | textures/sky_reflect_night.png | bin | 0 -> 239993 bytes | |||
| -rw-r--r-- | textures/skybox.jpg | bin | 0 -> 3757819 bytes | |||
| -rw-r--r-- | textures/skybox_sides.png | bin | 0 -> 2574790 bytes | |||
| -rw-r--r-- | textures/skybox_sides_night.png | bin | 0 -> 265133 bytes | |||
| -rw-r--r-- | textures/skybox_top.png | bin | 0 -> 468591 bytes | |||
| -rw-r--r-- | textures/skybox_top_night.png | bin | 0 -> 244275 bytes | |||
| -rw-r--r-- | textures/water.jpg | bin | 0 -> 120230 bytes | |||
| -rw-r--r-- | textures/wood_low.png | bin | 0 -> 7753 bytes | |||
| -rw-r--r-- | tree.obj | 1443 |
31 files changed, 4137 insertions, 80 deletions
@@ -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 @@ -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 |