Merge branch 'gles'
authorparasti <parasti@78b8d119-cf0a-0410-b17c-f493084dd1d7>
Wed, 6 Jul 2011 17:45:55 +0000 (17:45 +0000)
committerparasti <parasti@78b8d119-cf0a-0410-b17c-f493084dd1d7>
Wed, 6 Jul 2011 17:45:55 +0000 (17:45 +0000)
Conflicts:
data/mtrl/leaf
share/glext.h

git-svn-id: https://s.snth.net/svn/neverball/trunk@3607 78b8d119-cf0a-0410-b17c-f493084dd1d7

305 files changed:
Makefile
ball/game_client.c
ball/game_draw.c
ball/game_draw.h
ball/hud.c
ball/main.c
ball/set.c
ball/st_ball.c
ball/st_conf.c
ball/st_name.c
ball/st_start.c
ball/util.c
data/back/alien.png
data/back/land.png
data/back/ocean.png
data/back/space.png
data/back/volcano.png
data/ball/atom/atom-glow
data/ball/atom/electron
data/ball/atom/neutron
data/ball/atom/proton
data/ball/basic-ball/basic-ball
data/ball/blinky/blinky
data/ball/earth/earth-atmos
data/ball/earth/earth-cloud
data/ball/earth/earth-color
data/ball/earth/earth-ocean
data/ball/eyeball/eyeball
data/ball/lava/lava-glow
data/ball/lava/lava-inner
data/ball/lava/lava-solid
data/ball/magic-eightball/magic-eightball
data/ball/reactor/reactor-surface
data/ball/reactor/sparkle1
data/ball/saturn/saturn-ring
data/ball/saturn/saturn-surface
data/ball/snowglobe/snowglobe-atlas
data/ball/snowglobe/snowglobe-star
data/ball/snowglobe/snowglobe-surface
data/ball/sootsprite/sootsprite-body
data/ball/sootsprite/sootsprite-eye
data/geom/back/back.map [new file with mode: 0644]
data/geom/back/back.obj [new file with mode: 0644]
data/geom/beam/beam [new file with mode: 0644]
data/geom/beam/beam.map [new file with mode: 0644]
data/geom/beam/beam.mtl [new file with mode: 0644]
data/geom/beam/beam.obj [new file with mode: 0644]
data/geom/beam/beam.png [new file with mode: 0644]
data/geom/beam/beam.wings [new file with mode: 0644]
data/geom/flag/flag.map [new file with mode: 0644]
data/geom/flag/flag.mtl [new file with mode: 0644]
data/geom/flag/flag.obj [new file with mode: 0644]
data/geom/flag/flag.wings [new file with mode: 0644]
data/geom/goal/goal [new file with mode: 0644]
data/geom/goal/goal.map [new file with mode: 0644]
data/geom/goal/goal.mtl [new file with mode: 0644]
data/geom/goal/goal.obj [new file with mode: 0644]
data/geom/goal/goal.png [new file with mode: 0644]
data/geom/goal/goal.wings [new file with mode: 0644]
data/geom/jump/jump [new file with mode: 0644]
data/geom/jump/jump.map [new file with mode: 0644]
data/geom/jump/jump.mtl [new file with mode: 0644]
data/geom/jump/jump.obj [new file with mode: 0644]
data/geom/jump/jump.png [new file with mode: 0644]
data/geom/jump/jump.wings [new file with mode: 0644]
data/geom/mark/mark.map [new file with mode: 0644]
data/geom/mark/mark.mtl [new file with mode: 0644]
data/geom/mark/mark.obj [new file with mode: 0644]
data/geom/mark/mark.wings [new file with mode: 0644]
data/geom/vect/vect [new file with mode: 0644]
data/geom/vect/vect.map [new file with mode: 0644]
data/geom/vect/vect.mtl [new file with mode: 0644]
data/geom/vect/vect.obj [new file with mode: 0644]
data/geom/vect/vect.png [new file with mode: 0644]
data/geom/vect/vect.wings [new file with mode: 0644]
data/item/coin/coin
data/item/coin/coin-glow [new file with mode: 0644]
data/item/coin/coin-glow.png [new file with mode: 0644]
data/item/grow/grow
data/item/shrink/shrink
data/map-back/alien.map
data/mtrl/arrow-dark
data/mtrl/arrow-green-light
data/mtrl/arrow-light
data/mtrl/asteroid
data/mtrl/black
data/mtrl/black-decal
data/mtrl/blue
data/mtrl/blue-fade
data/mtrl/blue-gas
data/mtrl/blue-glossy
data/mtrl/blue-gradient
data/mtrl/blue-gradient-bright
data/mtrl/blue-natural
data/mtrl/blue-sea
data/mtrl/blue-sea.png
data/mtrl/blue-wave
data/mtrl/border-carpet
data/mtrl/brass
data/mtrl/brass-faceted
data/mtrl/brick
data/mtrl/brick-small
data/mtrl/carpet
data/mtrl/caution
data/mtrl/chalk
data/mtrl/check-black-white
data/mtrl/chrome
data/mtrl/chrome-faceted
data/mtrl/coin-blue
data/mtrl/coin-brown-small
data/mtrl/coin-green-check
data/mtrl/coin-green-check2
data/mtrl/coin-green-dark
data/mtrl/coin-green-light
data/mtrl/coin-green-small
data/mtrl/coin-mirror-check
data/mtrl/coin-orange
data/mtrl/coin-orange-big
data/mtrl/coin-pad-dot-blue
data/mtrl/coin-pad-dot-red
data/mtrl/coin-pad-dot-yellow
data/mtrl/coin-pad-green-dark
data/mtrl/coin-pad-red-dark
data/mtrl/coin-purple
data/mtrl/coin-purple-check
data/mtrl/coin-red
data/mtrl/coin-shiny
data/mtrl/crate
data/mtrl/crate-small
data/mtrl/curtain-check-diagonal
data/mtrl/cyan
data/mtrl/default [new file with mode: 0644]
data/mtrl/dot-grey
data/mtrl/edge
data/mtrl/edge-blue
data/mtrl/edge-brown
data/mtrl/edge-green
data/mtrl/edge-green-check
data/mtrl/edge-green-check2
data/mtrl/edge-green-dark
data/mtrl/edge-green-light
data/mtrl/edge-green-offset
data/mtrl/edge-orange
data/mtrl/edge-orange-big
data/mtrl/edge-purple
data/mtrl/edge-purple-check
data/mtrl/edge-red
data/mtrl/edge-x
data/mtrl/edge-y
data/mtrl/edge2
data/mtrl/edge2-blue
data/mtrl/edge2-brown
data/mtrl/edge2-green
data/mtrl/edge2-green-check
data/mtrl/edge2-green-dark
data/mtrl/edge2-green-light
data/mtrl/edge2-green-offset
data/mtrl/edge2-green-small
data/mtrl/edge2-orange
data/mtrl/edge2-orange-big
data/mtrl/edge2-purple
data/mtrl/edge2-purple-check
data/mtrl/edge2-red
data/mtrl/edge2-x
data/mtrl/edge2-y
data/mtrl/glass
data/mtrl/glass-dark
data/mtrl/goal
data/mtrl/goal-1024
data/mtrl/goal-special
data/mtrl/green
data/mtrl/green-gas
data/mtrl/hole
data/mtrl/invisible
data/mtrl/leaf
data/mtrl/marble-brown-polished
data/mtrl/marble-grey
data/mtrl/marble-grey-polished
data/mtrl/marble-purple
data/mtrl/marble-purple-polished
data/mtrl/mirror
data/mtrl/mirror-blue
data/mtrl/mirror-check
data/mtrl/mirror-check-weak
data/mtrl/mirror-cyan
data/mtrl/mirror-dark
data/mtrl/mirror-green
data/mtrl/mirror-orange
data/mtrl/mirror-purple
data/mtrl/mirror-red
data/mtrl/mirror-yellow
data/mtrl/orb-blue
data/mtrl/pink-cream
data/mtrl/plank
data/mtrl/plank-diagonal
data/mtrl/plank-small
data/mtrl/plank-small-light
data/mtrl/poof-blue
data/mtrl/poof-green
data/mtrl/poof-red
data/mtrl/poof-yellow
data/mtrl/purple-pattern
data/mtrl/rail
data/mtrl/rainbow
data/mtrl/red
data/mtrl/red-gas
data/mtrl/red-glass
data/mtrl/red-glossy
data/mtrl/red-gradient
data/mtrl/red-gradient-bright
data/mtrl/red-pattern
data/mtrl/rotate180
data/mtrl/rotate90
data/mtrl/shadow-rock
data/mtrl/sign-end
data/mtrl/sign-no-smoking
data/mtrl/sign-warning
data/mtrl/space-mapped
data/mtrl/stripes
data/mtrl/switch
data/mtrl/teleporter
data/mtrl/thwomp
data/mtrl/thwomp-fear
data/mtrl/thwomp-grim
data/mtrl/thwomp-gufaw
data/mtrl/thwomp-incred
data/mtrl/thwomp-mocking
data/mtrl/thwomp-sullen
data/mtrl/thwomp-whistler
data/mtrl/timer
data/mtrl/transparent
data/mtrl/transparent-dark
data/mtrl/turf-blue
data/mtrl/turf-brown
data/mtrl/turf-brown-small
data/mtrl/turf-disco
data/mtrl/turf-green
data/mtrl/turf-green-check
data/mtrl/turf-green-check2
data/mtrl/turf-green-dark
data/mtrl/turf-green-light
data/mtrl/turf-green-offset
data/mtrl/turf-green-small
data/mtrl/turf-grey
data/mtrl/turf-grey-dark
data/mtrl/turf-orange
data/mtrl/turf-orange-big
data/mtrl/turf-purple
data/mtrl/turf-purple-check
data/mtrl/turf-red
data/mtrl/turf-shiny
data/mtrl/turf-shiny-light
data/mtrl/white
data/mtrl/wood
data/mtrl/wood-check
data/mtrl/wood-check-glossy
data/mtrl/wood-glossy
data/mtrl/wood-light
data/mtrl/wood-light-glossy
data/mtrl/words
data/mtrl/yellow
data/mtrl/yellow-decal
data/mtrl/yellow-glossy
data/mtrl/yellow-gradient
data/mtrl/yellow-gradient-bright
data/mtrl/yellow-natural
data/mtrl/zip
data/png/stars1 [new file with mode: 0644]
data/png/stars2 [new file with mode: 0644]
data/png/stars3 [new file with mode: 0644]
data/png/stars4 [new file with mode: 0644]
putt/game.c
putt/game.h
putt/hole.c
putt/hole.h
putt/hud.c
putt/main.c
putt/st_all.c
putt/st_conf.c
share/audio.c
share/back.c [deleted file]
share/back.h [deleted file]
share/ball.c
share/ball.h
share/fs_ov.h
share/geom.c
share/geom.h
share/glext.c [new file with mode: 0644]
share/glext.h
share/gui.c
share/gui.h
share/image.c
share/item.c
share/item.h
share/mapc.c
share/part.c
share/part.h
share/solid_base.c
share/solid_base.h
share/solid_draw.c
share/solid_draw.h
share/st_resol.c
share/state.c
share/sync.c
share/video.c

index 169b9f8..675a247 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -189,7 +189,6 @@ BALL_OBJS := \
        share/solid_cmd.o   \
        share/solid_all.o   \
        share/part.o        \
-       share/back.o        \
        share/geom.o        \
        share/item.o        \
        share/ball.o        \
@@ -197,6 +196,7 @@ BALL_OBJS := \
        share/base_config.o \
        share/config.o      \
        share/video.o       \
+       share/glext.o       \
        share/binary.o      \
        share/state.o       \
        share/audio.o       \
@@ -261,10 +261,10 @@ PUTT_OBJS := \
        share/part.o        \
        share/geom.o        \
        share/ball.o        \
-       share/back.o        \
        share/base_config.o \
        share/config.o      \
        share/video.o       \
+       share/glext.o       \
        share/binary.o      \
        share/audio.o       \
        share/state.o       \
index 86fea6b..a41a304 100644 (file)
@@ -20,7 +20,6 @@
 #include "vec3.h"
 #include "geom.h"
 #include "item.h"
-#include "back.h"
 #include "part.h"
 #include "ball.h"
 #include "image.h"
@@ -424,7 +423,7 @@ int  game_client_init(const char *file_name)
 
     /* Initialize particles. */
 
-    part_reset(GOAL_HEIGHT, JUMP_HEIGHT);
+    part_reset();
 
     /* Initialize command state. */
 
index 7d039fc..0591524 100644 (file)
@@ -19,7 +19,6 @@
 #include "part.h"
 #include "geom.h"
 #include "config.h"
-#include "back.h"
 #include "video.h"
 
 #include "solid_draw.h"
@@ -28,7 +27,8 @@
 
 /*---------------------------------------------------------------------------*/
 
-static void game_draw_balls(const struct s_vary *vary,
+static void game_draw_balls(struct s_rend *rend,
+                            const struct s_vary *vary,
                             const float *bill_M, float t)
 {
     float c[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
@@ -39,7 +39,6 @@ static void game_draw_balls(const struct s_vary *vary,
     m_basis(ball_M, vary->uv[0].e[0], vary->uv[0].e[1], vary->uv[0].e[2]);
     m_basis(pend_M, vary->uv[0].E[0], vary->uv[0].E[1], vary->uv[0].E[2]);
 
-    glPushAttrib(GL_LIGHTING_BIT);
     glPushMatrix();
     {
         glTranslatef(vary->uv[0].p[0],
@@ -49,81 +48,66 @@ static void game_draw_balls(const struct s_vary *vary,
                  vary->uv[0].r,
                  vary->uv[0].r);
 
-        glColor4fv(c);
-        ball_draw(ball_M, pend_M, bill_M, t);
+        glColor4f(c[0], c[1], c[2], c[3]);
+        ball_draw(rend, ball_M, pend_M, bill_M, t);
     }
     glPopMatrix();
-    glPopAttrib();
 }
 
-static void game_draw_items(const struct s_vary *vary, float t)
+static void game_draw_items(struct s_rend *rend,
+                            const struct s_vary *vary,
+                            const float *bill_M, float t)
 {
-    float r = 360.f * t;
     int hi;
 
-    glPushAttrib(GL_LIGHTING_BIT);
+    glEnable(GL_COLOR_MATERIAL);
     {
-        item_push(ITEM_COIN);
-        {
-            for (hi = 0; hi < vary->hc; hi++)
-
-                if (vary->hv[hi].t == ITEM_COIN && vary->hv[hi].n > 0)
+        for (hi = 0; hi < vary->hc; hi++)
+            if (vary->hv[hi].t == ITEM_COIN && vary->hv[hi].n > 0)
+            {
+                glPushMatrix();
                 {
-                    glPushMatrix();
-                    {
-                        glTranslatef(vary->hv[hi].p[0],
-                                     vary->hv[hi].p[1],
-                                     vary->hv[hi].p[2]);
-                        glRotatef(r, 0.0f, 1.0f, 0.0f);
-                        item_draw(&vary->hv[hi], r);
-                    }
-                    glPopMatrix();
+                    glTranslatef(vary->hv[hi].p[0],
+                                 vary->hv[hi].p[1],
+                                 vary->hv[hi].p[2]);
+                    item_draw(rend, &vary->hv[hi], bill_M, t);
                 }
-        }
-        item_pull();
-
-        item_push(ITEM_SHRINK);
-        {
-            for (hi = 0; hi < vary->hc; hi++)
+                glPopMatrix();
+            }
 
-                if (vary->hv[hi].t == ITEM_SHRINK)
+        for (hi = 0; hi < vary->hc; hi++)
+            if (vary->hv[hi].t == ITEM_SHRINK)
+            {
+                glPushMatrix();
                 {
-                    glPushMatrix();
-                    {
-                        glTranslatef(vary->hv[hi].p[0],
-                                     vary->hv[hi].p[1],
-                                     vary->hv[hi].p[2]);
-                        glRotatef(r, 0.0f, 1.0f, 0.0f);
-                        item_draw(&vary->hv[hi], r);
-                    }
-                    glPopMatrix();
+                    glTranslatef(vary->hv[hi].p[0],
+                                 vary->hv[hi].p[1],
+                                 vary->hv[hi].p[2]);
+                    item_draw(rend, &vary->hv[hi], bill_M, t);
                 }
-        }
-        item_pull();
-
-        item_push(ITEM_GROW);
-        {
-            for (hi = 0; hi < vary->hc; hi++)
+                glPopMatrix();
+            }
 
-                if (vary->hv[hi].t == ITEM_GROW)
+        for (hi = 0; hi < vary->hc; hi++)
+            if (vary->hv[hi].t == ITEM_GROW)
+            {
+                glPushMatrix();
                 {
-                    glPushMatrix();
-                    {
-                        glTranslatef(vary->hv[hi].p[0],
-                                     vary->hv[hi].p[1],
-                                     vary->hv[hi].p[2]);
-                        glRotatef(r, 0.0f, 1.0f, 0.0f);
-                        item_draw(&vary->hv[hi], r);
-                    }
-                    glPopMatrix();
+                    glTranslatef(vary->hv[hi].p[0],
+                                 vary->hv[hi].p[1],
+                                 vary->hv[hi].p[2]);
+                    item_draw(rend, &vary->hv[hi], bill_M, t);
                 }
-        }
-        item_pull();
+                glPopMatrix();
+            }
     }
-    glPopAttrib();
+
+    glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+    glDisable(GL_COLOR_MATERIAL);
 }
 
-static void game_draw_goals(const struct game_draw *gd,
+static void game_draw_goals(struct s_rend *rend,
+                            const struct game_draw *gd,
                             const float *M, float t)
 {
     const struct s_base *base = gd->vary.base;
@@ -132,25 +116,6 @@ static void game_draw_goals(const struct game_draw *gd,
     {
         int zi;
 
-        /* Draw the goal particles. */
-
-        glEnable(GL_TEXTURE_2D);
-        {
-            for (zi = 0; zi < base->zc; zi++)
-            {
-                glPushMatrix();
-                {
-                    glTranslatef(base->zv[zi].p[0],
-                                 base->zv[zi].p[1],
-                                 base->zv[zi].p[2]);
-
-                    part_draw_goal(M, base->zv[zi].r, gd->goal_k, t);
-                }
-                glPopMatrix();
-            }
-        }
-        glDisable(GL_TEXTURE_2D);
-
         /* Draw the goal column. */
 
         for (zi = 0; zi < base->zc; zi++)
@@ -165,37 +130,21 @@ static void game_draw_goals(const struct game_draw *gd,
                          gd->goal_k,
                          base->zv[zi].r);
 
-                goal_draw();
+                goal_draw(rend, t);
             }
             glPopMatrix();
         }
     }
 }
 
-static void game_draw_jumps(const struct game_draw *gd,
+static void game_draw_jumps(struct s_rend *rend,
+                            const struct game_draw *gd,
                             const float *M, float t)
 {
     const struct s_base *base = gd->vary.base;
 
     int ji;
 
-    glEnable(GL_TEXTURE_2D);
-    {
-        for (ji = 0; ji < base->jc; ji++)
-        {
-            glPushMatrix();
-            {
-                glTranslatef(base->jv[ji].p[0],
-                             base->jv[ji].p[1],
-                             base->jv[ji].p[2]);
-
-                part_draw_jump(M, base->jv[ji].r, 1.0f, t);
-            }
-            glPopMatrix();
-        }
-    }
-    glDisable(GL_TEXTURE_2D);
-
     for (ji = 0; ji < base->jc; ji++)
     {
         glPushMatrix();
@@ -207,13 +156,13 @@ static void game_draw_jumps(const struct game_draw *gd,
                      1.0f,
                      base->jv[ji].r);
 
-            jump_draw(!gd->jump_e);
+            jump_draw(rend, t, !gd->jump_e);
         }
         glPopMatrix();
     }
 }
 
-static void game_draw_swchs(const struct s_vary *vary)
+static void game_draw_swchs(struct s_rend *rend, const struct s_vary *vary)
 {
     int xi;
 
@@ -233,7 +182,7 @@ static void game_draw_swchs(const struct s_vary *vary)
                      1.0f,
                      xp->base->r);
 
-            swch_draw(xp->f, xp->e);
+            swch_draw(rend, xp->f, xp->e);
         }
         glPopMatrix();
     }
@@ -254,7 +203,7 @@ static void game_draw_tilt(const struct game_draw *gd, int d)
     glTranslatef(-ball_p[0], -ball_p[1] * d, -ball_p[2]);
 }
 
-static void game_refl_all(const struct game_draw *gd)
+static void game_refl_all(struct s_rend *rend, const struct game_draw *gd)
 {
     glPushMatrix();
     {
@@ -262,7 +211,7 @@ static void game_refl_all(const struct game_draw *gd)
 
         /* Draw the floor. */
 
-        sol_refl(&gd->draw);
+        sol_refl(&gd->draw, rend);
     }
     glPopMatrix();
 }
@@ -293,7 +242,9 @@ static void game_draw_light(void)
     glLightfv(GL_LIGHT1, GL_SPECULAR, light_c[1]);
 }
 
-static void game_draw_back(const struct game_draw *gd, int pose, int d, float t)
+static void game_draw_back(struct s_rend *rend,
+                           const struct game_draw *gd,
+                           int pose, int d, float t)
 {
     if (pose == POSE_BALL)
         return;
@@ -314,13 +265,10 @@ static void game_draw_back(const struct game_draw *gd, int pose, int d, float t)
 
         if (config_get_d(CONFIG_BACKGROUND))
         {
-            /* Draw all background layers back to front. */
-
-            sol_back(&gd->back.draw, BACK_DIST, FAR_DIST,  t);
-            back_draw(0);
-            sol_back(&gd->back.draw,         0, BACK_DIST, t);
+            back_draw(rend, 0);
+            sol_back(&gd->back.draw, rend, 0, FAR_DIST, t);
         }
-        else back_draw(0);
+        else back_draw(rend, 0);
     }
     glPopMatrix();
 }
@@ -329,19 +277,12 @@ static void game_clip_refl(int d)
 {
     /* Fudge to eliminate the floor from reflection. */
 
-    GLdouble e[4], k = -0.00001;
-
-    e[0] = 0;
-    e[1] = 1;
-    e[2] = 0;
-    e[3] = k;
-
-    glClipPlane(GL_CLIP_PLANE0, e);
+    glClipPlane4f_(GL_CLIP_PLANE0, 0, 1, 0, -0.00001);
 }
 
 static void game_clip_ball(const struct game_draw *gd, int d, const float *p)
 {
-    GLdouble r, c[3], pz[4], nz[4];
+    GLfloat r, c[3], pz[4], nz[4];
 
     /* Compute the plane giving the front of the ball, as seen from view.p. */
 
@@ -374,17 +315,18 @@ static void game_clip_ball(const struct game_draw *gd, int d, const float *p)
     pz[1] *= d;
     nz[1] *= d;
 
-    glClipPlane(GL_CLIP_PLANE1, nz);
-    glClipPlane(GL_CLIP_PLANE2, pz);
+    glClipPlane4f_(GL_CLIP_PLANE1, nz[0], nz[1], nz[2], nz[3]);
+    glClipPlane4f_(GL_CLIP_PLANE2, pz[0], pz[1], pz[2], pz[3]);
 }
 
-static void game_draw_fore(const struct game_draw *gd,
+static void game_draw_fore(struct s_rend *rend,
+                           struct game_draw *gd,
                            int pose, const float *M,
                            int d, float t)
 {
     const float *ball_p = gd->vary.uv[0].p;
 
-    const struct s_draw *draw = &gd->draw;
+    struct s_draw *draw = &gd->draw;
 
     glPushMatrix();
     {
@@ -403,58 +345,43 @@ static void game_draw_fore(const struct game_draw *gd,
         switch (pose)
         {
         case POSE_LEVEL:
-            sol_draw(draw, 0, 1);
+            sol_draw(draw, rend, 0, 1);
             break;
 
         case POSE_NONE:
-            /* Draw the coins. */
+            /* Draw the floor. */
 
-            game_draw_items(draw->vary, t);
+            sol_draw(draw, rend, 0, 1);
 
-            /* Draw the floor. */
+            /* Draw the coins. */
 
-            sol_draw(draw, 0, 1);
+            game_draw_items(rend, draw->vary, M, t);
 
             /* Fall through. */
 
         case POSE_BALL:
 
-            /* Draw the ball shadow. */
-
-            if (d > 0 && config_get_d(CONFIG_SHADOW))
-            {
-                shad_draw_set();
-                sol_shad(draw, 0);
-                shad_draw_clr();
-            }
-
             /* Draw the ball. */
 
-            game_draw_balls(draw->vary, M, t);
+            game_draw_balls(rend, draw->vary, M, t);
 
             break;
         }
 
-        /* Draw the particles and light columns. */
+        /* Draw the billboards, entities, and  particles. */
 
         glEnable(GL_COLOR_MATERIAL);
         glDisable(GL_LIGHTING);
         glDepthMask(GL_FALSE);
         {
-            glColor3f(1.0f, 1.0f, 1.0f);
+            sol_bill(draw, rend, M, t);
 
-            sol_bill(draw, M, t);
-            part_draw_coin(M, t);
+            game_draw_goals(rend, gd, M, t);
+            game_draw_jumps(rend, gd, M, t);
+            game_draw_swchs(rend, draw->vary);
 
-            glDisable(GL_TEXTURE_2D);
-            {
-                game_draw_goals(gd, M, t);
-                game_draw_jumps(gd, M, t);
-                game_draw_swchs(draw->vary);
-            }
-            glEnable(GL_TEXTURE_2D);
-
-            glColor3f(1.0f, 1.0f, 1.0f);
+            part_draw_coin(rend);
+            glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
         }
         glDepthMask(GL_TRUE);
         glEnable(GL_LIGHTING);
@@ -468,22 +395,30 @@ static void game_draw_fore(const struct game_draw *gd,
 
 /*---------------------------------------------------------------------------*/
 
-void game_draw(const struct game_draw *gd, int pose, float t)
+void game_draw(struct game_draw *gd, int pose, float t)
 {
     float fov = (float) config_get_d(CONFIG_VIEW_FOV);
+    int sh = config_get_d(CONFIG_SHADOW);
+
+    if (pose == POSE_LEVEL)
+        config_set_d(CONFIG_SHADOW, 0);
 
     if (gd->jump_b) fov *= 2.f * fabsf(gd->jump_dt - 0.5);
 
     if (gd->state)
     {
         const struct game_view *view = &gd->view;
+        struct s_rend rend;
+
+        gd->draw.shadow_ui = 0;
+
+        sol_draw_enable(&rend);
 
         video_push_persp(fov, 0.1f, FAR_DIST);
         glPushMatrix();
         {
             float T[16], U[16], M[16], v[3];
 
-
             /* Compute direct and reflected view bases. */
 
             v[0] = +view->p[0];
@@ -503,6 +438,12 @@ void game_draw(const struct game_draw *gd, int pose, float t)
             glMultMatrixf(M);
             glTranslatef(-view->c[0], -view->c[1], -view->c[2]);
 
+            /* Draw the background. */
+
+            game_draw_back(&rend, gd, pose, +1, t);
+
+            /* Draw the reflection. */
+
             if (gd->draw.reflective && config_get_d(CONFIG_REFLECTION))
             {
                 glEnable(GL_STENCIL_TEST);
@@ -514,7 +455,7 @@ void game_draw(const struct game_draw *gd, int pose, float t)
                     glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
                     glDepthMask(GL_FALSE);
 
-                    game_refl_all(gd);
+                    game_refl_all(&rend, gd);
 
                     glDepthMask(GL_TRUE);
                     glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
@@ -529,76 +470,52 @@ void game_draw(const struct game_draw *gd, int pose, float t)
                         glScalef(+1.0f, -1.0f, +1.0f);
 
                         game_draw_light();
-                        game_draw_back(gd, pose,    -1, t);
-                        game_draw_fore(gd, pose, U, -1, t);
+
+                        game_draw_back(&rend, gd, pose,    -1, t);
+                        game_draw_fore(&rend, gd, pose, U, -1, t);
                     }
                     glPopMatrix();
                     glFrontFace(GL_CCW);
+
+                    glStencilFunc(GL_ALWAYS, 0, 0xFFFFFFF);
                 }
                 glDisable(GL_STENCIL_TEST);
             }
 
-            /* Draw the scene normally. */
+            /* Ready the lights for foreground rendering. */
 
             game_draw_light();
 
-            if (gd->draw.reflective)
-            {
-                if (config_get_d(CONFIG_REFLECTION))
-                {
-                    /* Draw background while preserving reflections. */
-
-                    glEnable(GL_STENCIL_TEST);
-                    {
-                        glStencilFunc(GL_NOTEQUAL, 1, 0xFFFFFFFF);
-                        game_draw_back(gd, pose, +1, t);
-                    }
-                    glDisable(GL_STENCIL_TEST);
-
-                    /* Draw mirrors. */
+            /* When reflection is disabled, mirrors must be rendered opaque  */
+            /* to prevent the background from showing.                       */
 
-                    game_refl_all(gd);
-                }
-                else
+            if (gd->draw.reflective && !config_get_d(CONFIG_REFLECTION))
+            {
+                glEnable(GL_COLOR_MATERIAL);
                 {
-                    /* Draw background. */
-
-                    game_draw_back(gd, pose, +1, t);
-
-                    /*
-                     * Draw mirrors, first fully opaque with a custom
-                     * material color, then blending normally with the
-                     * opaque surfaces using their original material
-                     * properties.  (Keeps background from showing
-                     * through.)
-                     */
-
-                    glEnable(GL_COLOR_MATERIAL);
-                    {
-                        glColor4f(0.0, 0.0, 0.05, 1.0);
-                        game_refl_all(gd);
-                        glColor4f(1.0,  1.0,  1.0,  1.0);
-                    }
-                    glDisable(GL_COLOR_MATERIAL);
-
-                    game_refl_all(gd);
+                    glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
+                    game_refl_all(&rend, gd);
+                    glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
                 }
+                glDisable(GL_COLOR_MATERIAL);
             }
-            else
-            {
-                game_draw_back(gd, pose, +1, t);
-                game_refl_all(gd);
-            }
 
-            game_draw_fore(gd, pose, T, +1, t);
+            /* Draw the mirrors and the rest of the foreground. */
+
+            game_refl_all (&rend, gd);
+            game_draw_fore(&rend, gd, pose, T, +1, t);
         }
         glPopMatrix();
         video_pop_matrix();
 
         /* Draw the fade overlay. */
 
-        fade_draw(gd->fade_k);
+        sol_fade(&gd->draw, gd->fade_k);
+        sol_draw_disable(&rend);
     }
+
+    if (pose == POSE_LEVEL)
+        config_set_d(CONFIG_SHADOW, sh);
 }
 
 /*---------------------------------------------------------------------------*/
index f2d1744..2559590 100644 (file)
@@ -32,7 +32,7 @@ struct game_draw
 /* FIXME: this is just for POSE_* constants. */
 #include "game_client.h"
 
-void game_draw(const struct game_draw *, int, float);
+void game_draw(struct game_draw *, int, float);
 
 /*---------------------------------------------------------------------------*/
 
index 2cc790b..e9b6fdc 100644 (file)
@@ -291,7 +291,7 @@ void hud_speed_pulse(int speed)
 
     for (i = SPEED_NONE + 1; i < SPEED_MAX; i++)
     {
-        const GLfloat *c = gui_gry;
+        const GLubyte *c = gui_gry;
 
         if (speed != SPEED_NONE)
         {
index 6dd19f1..98a33d9 100644 (file)
@@ -42,18 +42,30 @@ const char ICON[] = "icon/neverball.png";
 
 /*---------------------------------------------------------------------------*/
 
-static void shot(void)
+static int shot_pending;
+
+static void shot_prep(void)
+{
+    shot_pending = 1;
+}
+
+static void shot_take(void)
 {
     static char filename[MAXSTR];
 
-    sprintf(filename, "Screenshots/screen%05d.png", config_screenshot());
-    image_snap(filename);
+    if (shot_pending)
+    {
+        sprintf(filename, "Screenshots/screen%05d.png", config_screenshot());
+        image_snap(filename);
+        shot_pending = 0;
+    }
 }
 
 /*---------------------------------------------------------------------------*/
 
 static void toggle_wire(void)
 {
+#if !ENABLE_OPENGLES
     static int wire = 0;
 
     if (wire)
@@ -70,6 +82,7 @@ static void toggle_wire(void)
         glDisable(GL_LIGHTING);
         wire = 1;
     }
+#endif
 }
 
 /*---------------------------------------------------------------------------*/
@@ -95,7 +108,7 @@ static int handle_key_dn(SDL_Event *e)
 
     else switch (c)
     {
-    case SDLK_F10:   shot();                    break;
+    case SDLK_F10:   shot_prep();               break;
     case SDLK_F9:    config_tgl_d(CONFIG_FPS);  break;
     case SDLK_F8:    config_tgl_d(CONFIG_NICE); break;
 
@@ -532,6 +545,7 @@ int main(int argc, char *argv[])
             /* Render. */
 
             st_paint(0.001f * t0);
+            shot_take();
             video_swap();
 
             if (config_get_d(CONFIG_NICE))
index 56f309a..7d0b813 100644 (file)
@@ -503,9 +503,9 @@ void level_snap(int i, const char *path)
         game_client_fly(1.0f);
         game_kill_fade();
         game_client_draw(POSE_LEVEL, 0);
-        SDL_GL_SwapBuffers();
-
         image_snap(filename);
+
+        SDL_GL_SwapBuffers();
     }
 
     free(filename);
index b8939ee..4c02ab1 100644 (file)
@@ -22,7 +22,7 @@
 #include "ball.h"
 #include "cmd.h"
 #include "audio.h"
-#include "back.h"
+#include "geom.h"
 #include "video.h"
 #include "demo.h"
 
@@ -224,7 +224,7 @@ static void ball_paint(int id, float t)
 {
     video_push_persp((float) config_get_d(CONFIG_VIEW_FOV), 0.1f, FAR_DIST);
     {
-        back_draw(0);
+        back_draw_easy();
     }
     video_pop_matrix();
 
index 2f2d289..12c1f6a 100644 (file)
@@ -14,7 +14,6 @@
 
 #include "gui.h"
 #include "hud.h"
-#include "back.h"
 #include "geom.h"
 #include "item.h"
 #include "ball.h"
@@ -124,7 +123,7 @@ static void conf_shared_paint(int id, float t)
 {
     video_push_persp((float) config_get_d(CONFIG_VIEW_FOV), 0.1f, FAR_DIST);
     {
-        back_draw(0);
+        back_draw_easy();
     }
     video_pop_matrix();
     gui_paint(id);
@@ -422,9 +421,7 @@ static int null_enter(struct state *st, struct state *prev)
 {
     hud_free();
     gui_free();
-    swch_free();
-    jump_free();
-    goal_free();
+    geom_free();
     item_free();
     ball_free();
     shad_free();
@@ -435,13 +432,11 @@ static int null_enter(struct state *st, struct state *prev)
 
 static void null_leave(struct state *st, struct state *next, int id)
 {
-    part_init(GOAL_HEIGHT, JUMP_HEIGHT);
+    part_init();
     shad_init();
     ball_init();
     item_init();
-    goal_init();
-    jump_init();
-    swch_init();
+    geom_init();
     gui_init();
     hud_init();
 }
index 6f381e4..44051c8 100644 (file)
@@ -22,7 +22,7 @@
 #include "config.h"
 #include "video.h"
 #include "text.h"
-#include "back.h"
+#include "geom.h"
 
 #include "game_common.h"
 #include "game_server.h"
@@ -152,7 +152,7 @@ static void name_paint(int id, float t)
     {
         video_push_persp((float) config_get_d(CONFIG_VIEW_FOV), 0.1f, FAR_DIST);
         {
-            back_draw(0);
+            back_draw_easy();
         }
         video_pop_matrix();
     }
index 83ad6eb..87ef31c 100644 (file)
@@ -46,7 +46,9 @@ static int challenge_id;
 static void gui_level(int id, int i)
 {
     struct level *l = get_level(i);
-    const GLfloat *fore = 0, *back = 0;
+
+    const GLubyte *fore = 0;
+    const GLubyte *back = 0;
 
     int jd;
 
index 9409a8c..0079da4 100644 (file)
@@ -36,8 +36,8 @@ static int time_btn_id;
 static int goal_btn_id;
 
 static void set_score_color(int id, int hi,
-                            const GLfloat *c0,
-                            const GLfloat *c1)
+                            const GLubyte *c0,
+                            const GLubyte *c1)
 {
     if (hi >= RANK_HARD)
     {
index a8c9f46..e4ef254 100644 (file)
Binary files a/data/back/alien.png and b/data/back/alien.png differ
index 4cb23b2..4dccbf5 100644 (file)
Binary files a/data/back/land.png and b/data/back/land.png differ
index 2aa2de9..876e1c9 100644 (file)
Binary files a/data/back/ocean.png and b/data/back/ocean.png differ
index dd23f0e..f72241f 100644 (file)
Binary files a/data/back/space.png and b/data/back/space.png differ
index f08550f..3e1fc2b 100644 (file)
Binary files a/data/back/volcano.png and b/data/back/volcano.png differ
index 013e7fc..c528fec 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.000000
-18
-45.000000
+1.0 1.0 1.0 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+1.0 1.0 1.0 1.0
+0.0
+additive clamp-s clamp-t transparent 
+45.0
index c347984..8288950 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-162
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+clamp-s clamp-t transparent two-sided 
+45.0
index 70162cd..2e1214e 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-34
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+clamp-t transparent 
+45.0
index 70162cd..2e1214e 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-34
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+clamp-t transparent 
+45.0
index dbed868..1dbd027 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-20.000000
-2
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+20.0
+transparent 
+45.0
index c18a9d1..88f285a 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.750000
-0.200000 0.200000 0.200000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-60.000000
-2
-45.000000
+1.0 1.0 1.0 0.75
+0.2 0.2 0.2 1.0
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+60.0
+transparent 
+45.0
index a6a22f3..0629167 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-2
-45.000000
+1.0 1.0 1.0 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+transparent 
+45.0
index 6eba1fc..9a47319 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-2
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+transparent 
+45.0
index a6a22f3..0629167 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-2
-45.000000
+1.0 1.0 1.0 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+transparent 
+45.0
index 50bf29d..da42a4a 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.800000 0.800000 0.800000 1.000000
-0.000000 0.000000 0.000000 1.000000
-20.000000
-2
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.8 0.8 0.8 1.0
+0.0 0.0 0.0 1.0
+20.0
+transparent 
+45.0
index 848933b..fb3e9b3 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-128.000000
-2
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+128.0
+transparent 
+45.0
index c2e0c61..8e473ff 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-18
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+additive clamp-s clamp-t transparent 
+45.0
index 7c2b1b7..f53b6b7 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.000000
-2
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+1.0 1.0 1.0 1.0
+0.0
+transparent 
+45.0
index 81ec4b8..3bcd68a 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.400000 0.400000 0.400000 1.000000
-0.000000 0.000000 0.000000 1.000000
-60.000000
-2
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.4 0.4 0.4 1.0
+0.0 0.0 0.0 1.0
+60.0
+transparent 
+45.0
index dbed868..1dbd027 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-20.000000
-2
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+20.0
+transparent 
+45.0
index 138a947..579c260 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-20.000000
-2
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+1.0 1.0 1.0 1.0
+0.0 0.0 0.0 1.0
+20.0
+transparent 
+45.0
index 70162cd..2e1214e 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-34
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+clamp-t transparent 
+45.0
index 8749c87..a075ce9 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-60.000000
-130
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+1.0 1.0 1.0 1.0
+0.0 0.0 0.0 1.0
+60.0
+transparent two-sided 
+45.0
index 7401926..56cb278 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+
+45.0
index 8d03692..e519048 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.300000 0.300000 0.300000 1.000000
-0.000000 0.000000 0.000000 1.000000
-10.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.3 0.3 0.3 1.0
+0.0 0.0 0.0 1.0
+10.0
+
+45.0
index a5d46e1..2015ea1 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-10.000000
-2
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+1.0 1.0 1.0 1.0
+0.0 0.0 0.0 1.0
+10.0
+transparent 
+45.0
index 938f122..248ed0b 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-40.000000
-2
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+1.0 1.0 1.0 1.0
+0.0 0.0 0.0 1.0
+40.0
+transparent 
+45.0
index 218786a..739d8e3 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-34
-45.000000
+1.0 1.0 1.0 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+clamp-t transparent 
+45.0
index 218786a..739d8e3 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-34
-45.000000
+1.0 1.0 1.0 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+clamp-t transparent 
+45.0
diff --git a/data/geom/back/back.map b/data/geom/back/back.map
new file mode 100644 (file)
index 0000000..81c22be
--- /dev/null
@@ -0,0 +1,4 @@
+{
+"classname" "worldspawn"
+"model" "geom/back/back.obj"
+}
diff --git a/data/geom/back/back.obj b/data/geom/back/back.obj
new file mode 100644 (file)
index 0000000..04584c6
--- /dev/null
@@ -0,0 +1,2708 @@
+v -0.000 1.000 -0.000
+v -0.000 1.000 -0.000
+v -0.000 1.000 -0.000
+v -0.000 1.000 -0.000
+v -0.000 1.000 -0.000
+v -0.000 1.000 -0.000
+v -0.000 1.000 -0.000
+v -0.000 1.000 -0.000
+v -0.000 1.000 -0.000
+v -0.000 1.000 0.000
+v -0.000 1.000 0.000
+v -0.000 1.000 0.000
+v -0.000 1.000 0.000
+v -0.000 1.000 0.000
+v -0.000 1.000 0.000
+v -0.000 1.000 0.000
+v -0.000 1.000 0.000
+v 0.000 1.000 0.000
+v 0.000 1.000 0.000
+v 0.000 1.000 0.000
+v 0.000 1.000 0.000
+v 0.000 1.000 0.000
+v 0.000 1.000 0.000
+v 0.000 1.000 0.000
+v 0.000 1.000 0.000
+v 0.000 1.000 -0.000
+v 0.000 1.000 -0.000
+v 0.000 1.000 -0.000
+v 0.000 1.000 -0.000
+v 0.000 1.000 -0.000
+v 0.000 1.000 -0.000
+v 0.000 1.000 -0.000
+v 0.000 1.000 -0.000
+v -0.000 0.981 -0.195
+v -0.038 0.981 -0.191
+v -0.075 0.981 -0.180
+v -0.108 0.981 -0.162
+v -0.138 0.981 -0.138
+v -0.162 0.981 -0.108
+v -0.180 0.981 -0.075
+v -0.191 0.981 -0.038
+v -0.195 0.981 -0.000
+v -0.191 0.981 0.038
+v -0.180 0.981 0.075
+v -0.162 0.981 0.108
+v -0.138 0.981 0.138
+v -0.108 0.981 0.162
+v -0.075 0.981 0.180
+v -0.038 0.981 0.191
+v -0.000 0.981 0.195
+v 0.038 0.981 0.191
+v 0.075 0.981 0.180
+v 0.108 0.981 0.162
+v 0.138 0.981 0.138
+v 0.162 0.981 0.108
+v 0.180 0.981 0.075
+v 0.191 0.981 0.038
+v 0.195 0.981 0.000
+v 0.191 0.981 -0.038
+v 0.180 0.981 -0.075
+v 0.162 0.981 -0.108
+v 0.138 0.981 -0.138
+v 0.108 0.981 -0.162
+v 0.075 0.981 -0.180
+v 0.038 0.981 -0.191
+v 0.000 0.981 -0.195
+v -0.000 0.924 -0.383
+v -0.075 0.924 -0.375
+v -0.146 0.924 -0.354
+v -0.213 0.924 -0.318
+v -0.271 0.924 -0.271
+v -0.318 0.924 -0.213
+v -0.354 0.924 -0.146
+v -0.375 0.924 -0.075
+v -0.383 0.924 -0.000
+v -0.375 0.924 0.075
+v -0.354 0.924 0.146
+v -0.318 0.924 0.213
+v -0.271 0.924 0.271
+v -0.213 0.924 0.318
+v -0.146 0.924 0.354
+v -0.075 0.924 0.375
+v -0.000 0.924 0.383
+v 0.075 0.924 0.375
+v 0.146 0.924 0.354
+v 0.213 0.924 0.318
+v 0.271 0.924 0.271
+v 0.318 0.924 0.213
+v 0.354 0.924 0.146
+v 0.375 0.924 0.075
+v 0.383 0.924 0.000
+v 0.375 0.924 -0.075
+v 0.354 0.924 -0.146
+v 0.318 0.924 -0.213
+v 0.271 0.924 -0.271
+v 0.213 0.924 -0.318
+v 0.146 0.924 -0.354
+v 0.075 0.924 -0.375
+v 0.000 0.924 -0.383
+v -0.000 0.831 -0.556
+v -0.108 0.831 -0.545
+v -0.213 0.831 -0.513
+v -0.309 0.831 -0.462
+v -0.393 0.831 -0.393
+v -0.462 0.831 -0.309
+v -0.513 0.831 -0.213
+v -0.545 0.831 -0.108
+v -0.556 0.831 -0.000
+v -0.545 0.831 0.108
+v -0.513 0.831 0.213
+v -0.462 0.831 0.309
+v -0.393 0.831 0.393
+v -0.309 0.831 0.462
+v -0.213 0.831 0.513
+v -0.108 0.831 0.545
+v -0.000 0.831 0.556
+v 0.108 0.831 0.545
+v 0.213 0.831 0.513
+v 0.309 0.831 0.462
+v 0.393 0.831 0.393
+v 0.462 0.831 0.309
+v 0.513 0.831 0.213
+v 0.545 0.831 0.108
+v 0.556 0.831 0.000
+v 0.545 0.831 -0.108
+v 0.513 0.831 -0.213
+v 0.462 0.831 -0.309
+v 0.393 0.831 -0.393
+v 0.309 0.831 -0.462
+v 0.213 0.831 -0.513
+v 0.108 0.831 -0.545
+v 0.000 0.831 -0.556
+v -0.000 0.707 -0.707
+v -0.138 0.707 -0.694
+v -0.271 0.707 -0.653
+v -0.393 0.707 -0.588
+v -0.500 0.707 -0.500
+v -0.588 0.707 -0.393
+v -0.653 0.707 -0.271
+v -0.694 0.707 -0.138
+v -0.707 0.707 -0.000
+v -0.694 0.707 0.138
+v -0.653 0.707 0.271
+v -0.588 0.707 0.393
+v -0.500 0.707 0.500
+v -0.393 0.707 0.588
+v -0.271 0.707 0.653
+v -0.138 0.707 0.694
+v -0.000 0.707 0.707
+v 0.138 0.707 0.694
+v 0.271 0.707 0.653
+v 0.393 0.707 0.588
+v 0.500 0.707 0.500
+v 0.588 0.707 0.393
+v 0.653 0.707 0.271
+v 0.694 0.707 0.138
+v 0.707 0.707 0.000
+v 0.694 0.707 -0.138
+v 0.653 0.707 -0.271
+v 0.588 0.707 -0.393
+v 0.500 0.707 -0.500
+v 0.393 0.707 -0.588
+v 0.271 0.707 -0.653
+v 0.138 0.707 -0.694
+v 0.000 0.707 -0.707
+v -0.000 0.556 -0.831
+v -0.162 0.556 -0.815
+v -0.318 0.556 -0.768
+v -0.462 0.556 -0.691
+v -0.588 0.556 -0.588
+v -0.691 0.556 -0.462
+v -0.768 0.556 -0.318
+v -0.815 0.556 -0.162
+v -0.831 0.556 -0.000
+v -0.815 0.556 0.162
+v -0.768 0.556 0.318
+v -0.691 0.556 0.462
+v -0.588 0.556 0.588
+v -0.462 0.556 0.691
+v -0.318 0.556 0.768
+v -0.162 0.556 0.815
+v -0.000 0.556 0.831
+v 0.162 0.556 0.815
+v 0.318 0.556 0.768
+v 0.462 0.556 0.691
+v 0.588 0.556 0.588
+v 0.691 0.556 0.462
+v 0.768 0.556 0.318
+v 0.815 0.556 0.162
+v 0.831 0.556 0.000
+v 0.815 0.556 -0.162
+v 0.768 0.556 -0.318
+v 0.691 0.556 -0.462
+v 0.588 0.556 -0.588
+v 0.462 0.556 -0.691
+v 0.318 0.556 -0.768
+v 0.162 0.556 -0.815
+v 0.000 0.556 -0.831
+v -0.000 0.383 -0.924
+v -0.180 0.383 -0.906
+v -0.354 0.383 -0.854
+v -0.513 0.383 -0.768
+v -0.653 0.383 -0.653
+v -0.768 0.383 -0.513
+v -0.854 0.383 -0.354
+v -0.906 0.383 -0.180
+v -0.924 0.383 -0.000
+v -0.906 0.383 0.180
+v -0.854 0.383 0.354
+v -0.768 0.383 0.513
+v -0.653 0.383 0.653
+v -0.513 0.383 0.768
+v -0.354 0.383 0.854
+v -0.180 0.383 0.906
+v -0.000 0.383 0.924
+v 0.180 0.383 0.906
+v 0.354 0.383 0.854
+v 0.513 0.383 0.768
+v 0.653 0.383 0.653
+v 0.768 0.383 0.513
+v 0.854 0.383 0.354
+v 0.906 0.383 0.180
+v 0.924 0.383 0.000
+v 0.906 0.383 -0.180
+v 0.854 0.383 -0.354
+v 0.768 0.383 -0.513
+v 0.653 0.383 -0.653
+v 0.513 0.383 -0.768
+v 0.354 0.383 -0.854
+v 0.180 0.383 -0.906
+v 0.000 0.383 -0.924
+v -0.000 0.195 -0.981
+v -0.191 0.195 -0.962
+v -0.375 0.195 -0.906
+v -0.545 0.195 -0.815
+v -0.694 0.195 -0.694
+v -0.815 0.195 -0.545
+v -0.906 0.195 -0.375
+v -0.962 0.195 -0.191
+v -0.981 0.195 -0.000
+v -0.962 0.195 0.191
+v -0.906 0.195 0.375
+v -0.815 0.195 0.545
+v -0.694 0.195 0.694
+v -0.545 0.195 0.815
+v -0.375 0.195 0.906
+v -0.191 0.195 0.962
+v -0.000 0.195 0.981
+v 0.191 0.195 0.962
+v 0.375 0.195 0.906
+v 0.545 0.195 0.815
+v 0.694 0.195 0.694
+v 0.815 0.195 0.545
+v 0.906 0.195 0.375
+v 0.962 0.195 0.191
+v 0.981 0.195 0.000
+v 0.962 0.195 -0.191
+v 0.906 0.195 -0.375
+v 0.815 0.195 -0.545
+v 0.694 0.195 -0.694
+v 0.545 0.195 -0.815
+v 0.375 0.195 -0.906
+v 0.191 0.195 -0.962
+v 0.000 0.195 -0.981
+v -0.000 -0.000 -1.000
+v -0.195 -0.000 -0.981
+v -0.383 -0.000 -0.924
+v -0.556 -0.000 -0.831
+v -0.707 -0.000 -0.707
+v -0.831 -0.000 -0.556
+v -0.924 -0.000 -0.383
+v -0.981 -0.000 -0.195
+v -1.000 -0.000 -0.000
+v -0.981 -0.000 0.195
+v -0.924 -0.000 0.383
+v -0.831 -0.000 0.556
+v -0.707 -0.000 0.707
+v -0.556 -0.000 0.831
+v -0.383 -0.000 0.924
+v -0.195 -0.000 0.981
+v -0.000 -0.000 1.000
+v 0.195 -0.000 0.981
+v 0.383 -0.000 0.924
+v 0.556 -0.000 0.831
+v 0.707 -0.000 0.707
+v 0.831 -0.000 0.556
+v 0.924 -0.000 0.383
+v 0.981 -0.000 0.195
+v 1.000 -0.000 0.000
+v 0.981 -0.000 -0.195
+v 0.924 -0.000 -0.383
+v 0.831 -0.000 -0.556
+v 0.707 -0.000 -0.707
+v 0.556 -0.000 -0.831
+v 0.383 -0.000 -0.924
+v 0.195 -0.000 -0.981
+v 0.000 -0.000 -1.000
+v -0.000 -0.195 -0.981
+v -0.191 -0.195 -0.962
+v -0.375 -0.195 -0.906
+v -0.545 -0.195 -0.815
+v -0.694 -0.195 -0.694
+v -0.815 -0.195 -0.545
+v -0.906 -0.195 -0.375
+v -0.962 -0.195 -0.191
+v -0.981 -0.195 -0.000
+v -0.962 -0.195 0.191
+v -0.906 -0.195 0.375
+v -0.815 -0.195 0.545
+v -0.694 -0.195 0.694
+v -0.545 -0.195 0.815
+v -0.375 -0.195 0.906
+v -0.191 -0.195 0.962
+v -0.000 -0.195 0.981
+v 0.191 -0.195 0.962
+v 0.375 -0.195 0.906
+v 0.545 -0.195 0.815
+v 0.694 -0.195 0.694
+v 0.815 -0.195 0.545
+v 0.906 -0.195 0.375
+v 0.962 -0.195 0.191
+v 0.981 -0.195 0.000
+v 0.962 -0.195 -0.191
+v 0.906 -0.195 -0.375
+v 0.815 -0.195 -0.545
+v 0.694 -0.195 -0.694
+v 0.545 -0.195 -0.815
+v 0.375 -0.195 -0.906
+v 0.191 -0.195 -0.962
+v 0.000 -0.195 -0.981
+v -0.000 -0.383 -0.924
+v -0.180 -0.383 -0.906
+v -0.354 -0.383 -0.854
+v -0.513 -0.383 -0.768
+v -0.653 -0.383 -0.653
+v -0.768 -0.383 -0.513
+v -0.854 -0.383 -0.354
+v -0.906 -0.383 -0.180
+v -0.924 -0.383 -0.000
+v -0.906 -0.383 0.180
+v -0.854 -0.383 0.354
+v -0.768 -0.383 0.513
+v -0.653 -0.383 0.653
+v -0.513 -0.383 0.768
+v -0.354 -0.383 0.854
+v -0.180 -0.383 0.906
+v -0.000 -0.383 0.924
+v 0.180 -0.383 0.906
+v 0.354 -0.383 0.854
+v 0.513 -0.383 0.768
+v 0.653 -0.383 0.653
+v 0.768 -0.383 0.513
+v 0.854 -0.383 0.354
+v 0.906 -0.383 0.180
+v 0.924 -0.383 0.000
+v 0.906 -0.383 -0.180
+v 0.854 -0.383 -0.354
+v 0.768 -0.383 -0.513
+v 0.653 -0.383 -0.653
+v 0.513 -0.383 -0.768
+v 0.354 -0.383 -0.854
+v 0.180 -0.383 -0.906
+v 0.000 -0.383 -0.924
+v -0.000 -0.556 -0.831
+v -0.162 -0.556 -0.815
+v -0.318 -0.556 -0.768
+v -0.462 -0.556 -0.691
+v -0.588 -0.556 -0.588
+v -0.691 -0.556 -0.462
+v -0.768 -0.556 -0.318
+v -0.815 -0.556 -0.162
+v -0.831 -0.556 -0.000
+v -0.815 -0.556 0.162
+v -0.768 -0.556 0.318
+v -0.691 -0.556 0.462
+v -0.588 -0.556 0.588
+v -0.462 -0.556 0.691
+v -0.318 -0.556 0.768
+v -0.162 -0.556 0.815
+v -0.000 -0.556 0.831
+v 0.162 -0.556 0.815
+v 0.318 -0.556 0.768
+v 0.462 -0.556 0.691
+v 0.588 -0.556 0.588
+v 0.691 -0.556 0.462
+v 0.768 -0.556 0.318
+v 0.815 -0.556 0.162
+v 0.831 -0.556 0.000
+v 0.815 -0.556 -0.162
+v 0.768 -0.556 -0.318
+v 0.691 -0.556 -0.462
+v 0.588 -0.556 -0.588
+v 0.462 -0.556 -0.691
+v 0.318 -0.556 -0.768
+v 0.162 -0.556 -0.815
+v 0.000 -0.556 -0.831
+v -0.000 -0.707 -0.707
+v -0.138 -0.707 -0.694
+v -0.271 -0.707 -0.653
+v -0.393 -0.707 -0.588
+v -0.500 -0.707 -0.500
+v -0.588 -0.707 -0.393
+v -0.653 -0.707 -0.271
+v -0.694 -0.707 -0.138
+v -0.707 -0.707 -0.000
+v -0.694 -0.707 0.138
+v -0.653 -0.707 0.271
+v -0.588 -0.707 0.393
+v -0.500 -0.707 0.500
+v -0.393 -0.707 0.588
+v -0.271 -0.707 0.653
+v -0.138 -0.707 0.694
+v -0.000 -0.707 0.707
+v 0.138 -0.707 0.694
+v 0.271 -0.707 0.653
+v 0.393 -0.707 0.588
+v 0.500 -0.707 0.500
+v 0.588 -0.707 0.393
+v 0.653 -0.707 0.271
+v 0.694 -0.707 0.138
+v 0.707 -0.707 0.000
+v 0.694 -0.707 -0.138
+v 0.653 -0.707 -0.271
+v 0.588 -0.707 -0.393
+v 0.500 -0.707 -0.500
+v 0.393 -0.707 -0.588
+v 0.271 -0.707 -0.653
+v 0.138 -0.707 -0.694
+v 0.000 -0.707 -0.707
+v -0.000 -0.831 -0.556
+v -0.108 -0.831 -0.545
+v -0.213 -0.831 -0.513
+v -0.309 -0.831 -0.462
+v -0.393 -0.831 -0.393
+v -0.462 -0.831 -0.309
+v -0.513 -0.831 -0.213
+v -0.545 -0.831 -0.108
+v -0.556 -0.831 -0.000
+v -0.545 -0.831 0.108
+v -0.513 -0.831 0.213
+v -0.462 -0.831 0.309
+v -0.393 -0.831 0.393
+v -0.309 -0.831 0.462
+v -0.213 -0.831 0.513
+v -0.108 -0.831 0.545
+v -0.000 -0.831 0.556
+v 0.108 -0.831 0.545
+v 0.213 -0.831 0.513
+v 0.309 -0.831 0.462
+v 0.393 -0.831 0.393
+v 0.462 -0.831 0.309
+v 0.513 -0.831 0.213
+v 0.545 -0.831 0.108
+v 0.556 -0.831 0.000
+v 0.545 -0.831 -0.108
+v 0.513 -0.831 -0.213
+v 0.462 -0.831 -0.309
+v 0.393 -0.831 -0.393
+v 0.309 -0.831 -0.462
+v 0.213 -0.831 -0.513
+v 0.108 -0.831 -0.545
+v 0.000 -0.831 -0.556
+v -0.000 -0.924 -0.383
+v -0.075 -0.924 -0.375
+v -0.146 -0.924 -0.354
+v -0.213 -0.924 -0.318
+v -0.271 -0.924 -0.271
+v -0.318 -0.924 -0.213
+v -0.354 -0.924 -0.146
+v -0.375 -0.924 -0.075
+v -0.383 -0.924 -0.000
+v -0.375 -0.924 0.075
+v -0.354 -0.924 0.146
+v -0.318 -0.924 0.213
+v -0.271 -0.924 0.271
+v -0.213 -0.924 0.318
+v -0.146 -0.924 0.354
+v -0.075 -0.924 0.375
+v -0.000 -0.924 0.383
+v 0.075 -0.924 0.375
+v 0.146 -0.924 0.354
+v 0.213 -0.924 0.318
+v 0.271 -0.924 0.271
+v 0.318 -0.924 0.213
+v 0.354 -0.924 0.146
+v 0.375 -0.924 0.075
+v 0.383 -0.924 0.000
+v 0.375 -0.924 -0.075
+v 0.354 -0.924 -0.146
+v 0.318 -0.924 -0.213
+v 0.271 -0.924 -0.271
+v 0.213 -0.924 -0.318
+v 0.146 -0.924 -0.354
+v 0.075 -0.924 -0.375
+v 0.000 -0.924 -0.383
+v -0.000 -0.981 -0.195
+v -0.038 -0.981 -0.191
+v -0.075 -0.981 -0.180
+v -0.108 -0.981 -0.162
+v -0.138 -0.981 -0.138
+v -0.162 -0.981 -0.108
+v -0.180 -0.981 -0.075
+v -0.191 -0.981 -0.038
+v -0.195 -0.981 -0.000
+v -0.191 -0.981 0.038
+v -0.180 -0.981 0.075
+v -0.162 -0.981 0.108
+v -0.138 -0.981 0.138
+v -0.108 -0.981 0.162
+v -0.075 -0.981 0.180
+v -0.038 -0.981 0.191
+v -0.000 -0.981 0.195
+v 0.038 -0.981 0.191
+v 0.075 -0.981 0.180
+v 0.108 -0.981 0.162
+v 0.138 -0.981 0.138
+v 0.162 -0.981 0.108
+v 0.180 -0.981 0.075
+v 0.191 -0.981 0.038
+v 0.195 -0.981 0.000
+v 0.191 -0.981 -0.038
+v 0.180 -0.981 -0.075
+v 0.162 -0.981 -0.108
+v 0.138 -0.981 -0.138
+v 0.108 -0.981 -0.162
+v 0.075 -0.981 -0.180
+v 0.038 -0.981 -0.191
+v 0.000 -0.981 -0.195
+v -0.000 -1.000 -0.000
+v -0.000 -1.000 -0.000
+v -0.000 -1.000 -0.000
+v -0.000 -1.000 -0.000
+v -0.000 -1.000 -0.000
+v -0.000 -1.000 -0.000
+v -0.000 -1.000 -0.000
+v -0.000 -1.000 -0.000
+v -0.000 -1.000 -0.000
+v -0.000 -1.000 0.000
+v -0.000 -1.000 0.000
+v -0.000 -1.000 0.000
+v -0.000 -1.000 0.000
+v -0.000 -1.000 0.000
+v -0.000 -1.000 0.000
+v -0.000 -1.000 0.000
+v -0.000 -1.000 0.000
+v 0.000 -1.000 0.000
+v 0.000 -1.000 0.000
+v 0.000 -1.000 0.000
+v 0.000 -1.000 0.000
+v 0.000 -1.000 0.000
+v 0.000 -1.000 0.000
+v 0.000 -1.000 0.000
+v 0.000 -1.000 0.000
+v 0.000 -1.000 -0.000
+v 0.000 -1.000 -0.000
+v 0.000 -1.000 -0.000
+v 0.000 -1.000 -0.000
+v 0.000 -1.000 -0.000
+v 0.000 -1.000 -0.000
+v 0.000 -1.000 -0.000
+v 0.000 -1.000 -0.000
+vt 0.000 1.000
+vt 0.031 1.000
+vt 0.062 1.000
+vt 0.094 1.000
+vt 0.125 1.000
+vt 0.156 1.000
+vt 0.188 1.000
+vt 0.219 1.000
+vt 0.250 1.000
+vt 0.281 1.000
+vt 0.312 1.000
+vt 0.344 1.000
+vt 0.375 1.000
+vt 0.406 1.000
+vt 0.438 1.000
+vt 0.469 1.000
+vt 0.500 1.000
+vt 0.531 1.000
+vt 0.562 1.000
+vt 0.594 1.000
+vt 0.625 1.000
+vt 0.656 1.000
+vt 0.688 1.000
+vt 0.719 1.000
+vt 0.750 1.000
+vt 0.781 1.000
+vt 0.812 1.000
+vt 0.844 1.000
+vt 0.875 1.000
+vt 0.906 1.000
+vt 0.938 1.000
+vt 0.969 1.000
+vt 1.000 1.000
+vt 0.000 0.938
+vt 0.031 0.938
+vt 0.062 0.938
+vt 0.094 0.938
+vt 0.125 0.938
+vt 0.156 0.938
+vt 0.188 0.938
+vt 0.219 0.938
+vt 0.250 0.938
+vt 0.281 0.938
+vt 0.312 0.938
+vt 0.344 0.938
+vt 0.375 0.938
+vt 0.406 0.938
+vt 0.438 0.938
+vt 0.469 0.938
+vt 0.500 0.938
+vt 0.531 0.938
+vt 0.562 0.938
+vt 0.594 0.938
+vt 0.625 0.938
+vt 0.656 0.938
+vt 0.688 0.938
+vt 0.719 0.938
+vt 0.750 0.938
+vt 0.781 0.938
+vt 0.812 0.938
+vt 0.844 0.938
+vt 0.875 0.938
+vt 0.906 0.938
+vt 0.938 0.938
+vt 0.969 0.938
+vt 1.000 0.938
+vt 0.000 0.875
+vt 0.031 0.875
+vt 0.062 0.875
+vt 0.094 0.875
+vt 0.125 0.875
+vt 0.156 0.875
+vt 0.188 0.875
+vt 0.219 0.875
+vt 0.250 0.875
+vt 0.281 0.875
+vt 0.312 0.875
+vt 0.344 0.875
+vt 0.375 0.875
+vt 0.406 0.875
+vt 0.438 0.875
+vt 0.469 0.875
+vt 0.500 0.875
+vt 0.531 0.875
+vt 0.562 0.875
+vt 0.594 0.875
+vt 0.625 0.875
+vt 0.656 0.875
+vt 0.688 0.875
+vt 0.719 0.875
+vt 0.750 0.875
+vt 0.781 0.875
+vt 0.812 0.875
+vt 0.844 0.875
+vt 0.875 0.875
+vt 0.906 0.875
+vt 0.938 0.875
+vt 0.969 0.875
+vt 1.000 0.875
+vt 0.000 0.812
+vt 0.031 0.812
+vt 0.062 0.812
+vt 0.094 0.812
+vt 0.125 0.812
+vt 0.156 0.812
+vt 0.188 0.812
+vt 0.219 0.812
+vt 0.250 0.812
+vt 0.281 0.812
+vt 0.312 0.812
+vt 0.344 0.812
+vt 0.375 0.812
+vt 0.406 0.812
+vt 0.438 0.812
+vt 0.469 0.812
+vt 0.500 0.812
+vt 0.531 0.812
+vt 0.562 0.812
+vt 0.594 0.812
+vt 0.625 0.812
+vt 0.656 0.812
+vt 0.688 0.812
+vt 0.719 0.812
+vt 0.750 0.812
+vt 0.781 0.812
+vt 0.812 0.812
+vt 0.844 0.812
+vt 0.875 0.812
+vt 0.906 0.812
+vt 0.938 0.812
+vt 0.969 0.812
+vt 1.000 0.812
+vt 0.000 0.750
+vt 0.031 0.750
+vt 0.062 0.750
+vt 0.094 0.750
+vt 0.125 0.750
+vt 0.156 0.750
+vt 0.188 0.750
+vt 0.219 0.750
+vt 0.250 0.750
+vt 0.281 0.750
+vt 0.312 0.750
+vt 0.344 0.750
+vt 0.375 0.750
+vt 0.406 0.750
+vt 0.438 0.750
+vt 0.469 0.750
+vt 0.500 0.750
+vt 0.531 0.750
+vt 0.562 0.750
+vt 0.594 0.750
+vt 0.625 0.750
+vt 0.656 0.750
+vt 0.688 0.750
+vt 0.719 0.750
+vt 0.750 0.750
+vt 0.781 0.750
+vt 0.812 0.750
+vt 0.844 0.750
+vt 0.875 0.750
+vt 0.906 0.750
+vt 0.938 0.750
+vt 0.969 0.750
+vt 1.000 0.750
+vt 0.000 0.688
+vt 0.031 0.688
+vt 0.062 0.688
+vt 0.094 0.688
+vt 0.125 0.688
+vt 0.156 0.688
+vt 0.188 0.688
+vt 0.219 0.688
+vt 0.250 0.688
+vt 0.281 0.688
+vt 0.312 0.688
+vt 0.344 0.688
+vt 0.375 0.688
+vt 0.406 0.688
+vt 0.438 0.688
+vt 0.469 0.688
+vt 0.500 0.688
+vt 0.531 0.688
+vt 0.562 0.688
+vt 0.594 0.688
+vt 0.625 0.688
+vt 0.656 0.688
+vt 0.688 0.688
+vt 0.719 0.688
+vt 0.750 0.688
+vt 0.781 0.688
+vt 0.812 0.688
+vt 0.844 0.688
+vt 0.875 0.688
+vt 0.906 0.688
+vt 0.938 0.688
+vt 0.969 0.688
+vt 1.000 0.688
+vt 0.000 0.625
+vt 0.031 0.625
+vt 0.062 0.625
+vt 0.094 0.625
+vt 0.125 0.625
+vt 0.156 0.625
+vt 0.188 0.625
+vt 0.219 0.625
+vt 0.250 0.625
+vt 0.281 0.625
+vt 0.312 0.625
+vt 0.344 0.625
+vt 0.375 0.625
+vt 0.406 0.625
+vt 0.438 0.625
+vt 0.469 0.625
+vt 0.500 0.625
+vt 0.531 0.625
+vt 0.562 0.625
+vt 0.594 0.625
+vt 0.625 0.625
+vt 0.656 0.625
+vt 0.688 0.625
+vt 0.719 0.625
+vt 0.750 0.625
+vt 0.781 0.625
+vt 0.812 0.625
+vt 0.844 0.625
+vt 0.875 0.625
+vt 0.906 0.625
+vt 0.938 0.625
+vt 0.969 0.625
+vt 1.000 0.625
+vt 0.000 0.562
+vt 0.031 0.562
+vt 0.062 0.562
+vt 0.094 0.562
+vt 0.125 0.562
+vt 0.156 0.562
+vt 0.188 0.562
+vt 0.219 0.562
+vt 0.250 0.562
+vt 0.281 0.562
+vt 0.312 0.562
+vt 0.344 0.562
+vt 0.375 0.562
+vt 0.406 0.562
+vt 0.438 0.562
+vt 0.469 0.562
+vt 0.500 0.562
+vt 0.531 0.562
+vt 0.562 0.562
+vt 0.594 0.562
+vt 0.625 0.562
+vt 0.656 0.562
+vt 0.688 0.562
+vt 0.719 0.562
+vt 0.750 0.562
+vt 0.781 0.562
+vt 0.812 0.562
+vt 0.844 0.562
+vt 0.875 0.562
+vt 0.906 0.562
+vt 0.938 0.562
+vt 0.969 0.562
+vt 1.000 0.562
+vt 0.000 0.500
+vt 0.031 0.500
+vt 0.062 0.500
+vt 0.094 0.500
+vt 0.125 0.500
+vt 0.156 0.500
+vt 0.188 0.500
+vt 0.219 0.500
+vt 0.250 0.500
+vt 0.281 0.500
+vt 0.312 0.500
+vt 0.344 0.500
+vt 0.375 0.500
+vt 0.406 0.500
+vt 0.438 0.500
+vt 0.469 0.500
+vt 0.500 0.500
+vt 0.531 0.500
+vt 0.562 0.500
+vt 0.594 0.500
+vt 0.625 0.500
+vt 0.656 0.500
+vt 0.688 0.500
+vt 0.719 0.500
+vt 0.750 0.500
+vt 0.781 0.500
+vt 0.812 0.500
+vt 0.844 0.500
+vt 0.875 0.500
+vt 0.906 0.500
+vt 0.938 0.500
+vt 0.969 0.500
+vt 1.000 0.500
+vt 0.000 0.438
+vt 0.031 0.438
+vt 0.062 0.438
+vt 0.094 0.438
+vt 0.125 0.438
+vt 0.156 0.438
+vt 0.188 0.438
+vt 0.219 0.438
+vt 0.250 0.438
+vt 0.281 0.438
+vt 0.312 0.438
+vt 0.344 0.438
+vt 0.375 0.438
+vt 0.406 0.438
+vt 0.438 0.438
+vt 0.469 0.438
+vt 0.500 0.438
+vt 0.531 0.438
+vt 0.562 0.438
+vt 0.594 0.438
+vt 0.625 0.438
+vt 0.656 0.438
+vt 0.688 0.438
+vt 0.719 0.438
+vt 0.750 0.438
+vt 0.781 0.438
+vt 0.812 0.438
+vt 0.844 0.438
+vt 0.875 0.438
+vt 0.906 0.438
+vt 0.938 0.438
+vt 0.969 0.438
+vt 1.000 0.438
+vt 0.000 0.375
+vt 0.031 0.375
+vt 0.062 0.375
+vt 0.094 0.375
+vt 0.125 0.375
+vt 0.156 0.375
+vt 0.188 0.375
+vt 0.219 0.375
+vt 0.250 0.375
+vt 0.281 0.375
+vt 0.312 0.375
+vt 0.344 0.375
+vt 0.375 0.375
+vt 0.406 0.375
+vt 0.438 0.375
+vt 0.469 0.375
+vt 0.500 0.375
+vt 0.531 0.375
+vt 0.562 0.375
+vt 0.594 0.375
+vt 0.625 0.375
+vt 0.656 0.375
+vt 0.688 0.375
+vt 0.719 0.375
+vt 0.750 0.375
+vt 0.781 0.375
+vt 0.812 0.375
+vt 0.844 0.375
+vt 0.875 0.375
+vt 0.906 0.375
+vt 0.938 0.375
+vt 0.969 0.375
+vt 1.000 0.375
+vt 0.000 0.312
+vt 0.031 0.312
+vt 0.062 0.312
+vt 0.094 0.312
+vt 0.125 0.312
+vt 0.156 0.312
+vt 0.188 0.312
+vt 0.219 0.312
+vt 0.250 0.312
+vt 0.281 0.312
+vt 0.312 0.312
+vt 0.344 0.312
+vt 0.375 0.312
+vt 0.406 0.312
+vt 0.438 0.312
+vt 0.469 0.312
+vt 0.500 0.312
+vt 0.531 0.312
+vt 0.562 0.312
+vt 0.594 0.312
+vt 0.625 0.312
+vt 0.656 0.312
+vt 0.688 0.312
+vt 0.719 0.312
+vt 0.750 0.312
+vt 0.781 0.312
+vt 0.812 0.312
+vt 0.844 0.312
+vt 0.875 0.312
+vt 0.906 0.312
+vt 0.938 0.312
+vt 0.969 0.312
+vt 1.000 0.312
+vt 0.000 0.250
+vt 0.031 0.250
+vt 0.062 0.250
+vt 0.094 0.250
+vt 0.125 0.250
+vt 0.156 0.250
+vt 0.188 0.250
+vt 0.219 0.250
+vt 0.250 0.250
+vt 0.281 0.250
+vt 0.312 0.250
+vt 0.344 0.250
+vt 0.375 0.250
+vt 0.406 0.250
+vt 0.438 0.250
+vt 0.469 0.250
+vt 0.500 0.250
+vt 0.531 0.250
+vt 0.562 0.250
+vt 0.594 0.250
+vt 0.625 0.250
+vt 0.656 0.250
+vt 0.688 0.250
+vt 0.719 0.250
+vt 0.750 0.250
+vt 0.781 0.250
+vt 0.812 0.250
+vt 0.844 0.250
+vt 0.875 0.250
+vt 0.906 0.250
+vt 0.938 0.250
+vt 0.969 0.250
+vt 1.000 0.250
+vt 0.000 0.188
+vt 0.031 0.188
+vt 0.062 0.188
+vt 0.094 0.188
+vt 0.125 0.188
+vt 0.156 0.188
+vt 0.188 0.188
+vt 0.219 0.188
+vt 0.250 0.188
+vt 0.281 0.188
+vt 0.312 0.188
+vt 0.344 0.188
+vt 0.375 0.188
+vt 0.406 0.188
+vt 0.438 0.188
+vt 0.469 0.188
+vt 0.500 0.188
+vt 0.531 0.188
+vt 0.562 0.188
+vt 0.594 0.188
+vt 0.625 0.188
+vt 0.656 0.188
+vt 0.688 0.188
+vt 0.719 0.188
+vt 0.750 0.188
+vt 0.781 0.188
+vt 0.812 0.188
+vt 0.844 0.188
+vt 0.875 0.188
+vt 0.906 0.188
+vt 0.938 0.188
+vt 0.969 0.188
+vt 1.000 0.188
+vt 0.000 0.125
+vt 0.031 0.125
+vt 0.062 0.125
+vt 0.094 0.125
+vt 0.125 0.125
+vt 0.156 0.125
+vt 0.188 0.125
+vt 0.219 0.125
+vt 0.250 0.125
+vt 0.281 0.125
+vt 0.312 0.125
+vt 0.344 0.125
+vt 0.375 0.125
+vt 0.406 0.125
+vt 0.438 0.125
+vt 0.469 0.125
+vt 0.500 0.125
+vt 0.531 0.125
+vt 0.562 0.125
+vt 0.594 0.125
+vt 0.625 0.125
+vt 0.656 0.125
+vt 0.688 0.125
+vt 0.719 0.125
+vt 0.750 0.125
+vt 0.781 0.125
+vt 0.812 0.125
+vt 0.844 0.125
+vt 0.875 0.125
+vt 0.906 0.125
+vt 0.938 0.125
+vt 0.969 0.125
+vt 1.000 0.125
+vt 0.000 0.062
+vt 0.031 0.062
+vt 0.062 0.062
+vt 0.094 0.062
+vt 0.125 0.062
+vt 0.156 0.062
+vt 0.188 0.062
+vt 0.219 0.062
+vt 0.250 0.062
+vt 0.281 0.062
+vt 0.312 0.062
+vt 0.344 0.062
+vt 0.375 0.062
+vt 0.406 0.062
+vt 0.438 0.062
+vt 0.469 0.062
+vt 0.500 0.062
+vt 0.531 0.062
+vt 0.562 0.062
+vt 0.594 0.062
+vt 0.625 0.062
+vt 0.656 0.062
+vt 0.688 0.062
+vt 0.719 0.062
+vt 0.750 0.062
+vt 0.781 0.062
+vt 0.812 0.062
+vt 0.844 0.062
+vt 0.875 0.062
+vt 0.906 0.062
+vt 0.938 0.062
+vt 0.969 0.062
+vt 1.000 0.062
+vt 0.000 0.000
+vt 0.031 0.000
+vt 0.062 0.000
+vt 0.094 0.000
+vt 0.125 0.000
+vt 0.156 0.000
+vt 0.188 0.000
+vt 0.219 0.000
+vt 0.250 0.000
+vt 0.281 0.000
+vt 0.312 0.000
+vt 0.344 0.000
+vt 0.375 0.000
+vt 0.406 0.000
+vt 0.438 0.000
+vt 0.469 0.000
+vt 0.500 0.000
+vt 0.531 0.000
+vt 0.562 0.000
+vt 0.594 0.000
+vt 0.625 0.000
+vt 0.656 0.000
+vt 0.688 0.000
+vt 0.719 0.000
+vt 0.750 0.000
+vt 0.781 0.000
+vt 0.812 0.000
+vt 0.844 0.000
+vt 0.875 0.000
+vt 0.906 0.000
+vt 0.938 0.000
+vt 0.969 0.000
+vt 1.000 0.000
+vn -0.000 1.000 -0.000
+vn -0.000 1.000 -0.000
+vn -0.000 1.000 -0.000
+vn -0.000 1.000 -0.000
+vn -0.000 1.000 -0.000
+vn -0.000 1.000 -0.000
+vn -0.000 1.000 -0.000
+vn -0.000 1.000 -0.000
+vn -0.000 1.000 -0.000
+vn -0.000 1.000 0.000
+vn -0.000 1.000 0.000
+vn -0.000 1.000 0.000
+vn -0.000 1.000 0.000
+vn -0.000 1.000 0.000
+vn -0.000 1.000 0.000
+vn -0.000 1.000 0.000
+vn -0.000 1.000 0.000
+vn 0.000 1.000 0.000
+vn 0.000 1.000 0.000
+vn 0.000 1.000 0.000
+vn 0.000 1.000 0.000
+vn 0.000 1.000 0.000
+vn 0.000 1.000 0.000
+vn 0.000 1.000 0.000
+vn 0.000 1.000 0.000
+vn 0.000 1.000 -0.000
+vn 0.000 1.000 -0.000
+vn 0.000 1.000 -0.000
+vn 0.000 1.000 -0.000
+vn 0.000 1.000 -0.000
+vn 0.000 1.000 -0.000
+vn 0.000 1.000 -0.000
+vn 0.000 1.000 -0.000
+vn -0.000 0.981 -0.195
+vn -0.038 0.981 -0.191
+vn -0.075 0.981 -0.180
+vn -0.108 0.981 -0.162
+vn -0.138 0.981 -0.138
+vn -0.162 0.981 -0.108
+vn -0.180 0.981 -0.075
+vn -0.191 0.981 -0.038
+vn -0.195 0.981 -0.000
+vn -0.191 0.981 0.038
+vn -0.180 0.981 0.075
+vn -0.162 0.981 0.108
+vn -0.138 0.981 0.138
+vn -0.108 0.981 0.162
+vn -0.075 0.981 0.180
+vn -0.038 0.981 0.191
+vn -0.000 0.981 0.195
+vn 0.038 0.981 0.191
+vn 0.075 0.981 0.180
+vn 0.108 0.981 0.162
+vn 0.138 0.981 0.138
+vn 0.162 0.981 0.108
+vn 0.180 0.981 0.075
+vn 0.191 0.981 0.038
+vn 0.195 0.981 0.000
+vn 0.191 0.981 -0.038
+vn 0.180 0.981 -0.075
+vn 0.162 0.981 -0.108
+vn 0.138 0.981 -0.138
+vn 0.108 0.981 -0.162
+vn 0.075 0.981 -0.180
+vn 0.038 0.981 -0.191
+vn 0.000 0.981 -0.195
+vn -0.000 0.924 -0.383
+vn -0.075 0.924 -0.375
+vn -0.146 0.924 -0.354
+vn -0.213 0.924 -0.318
+vn -0.271 0.924 -0.271
+vn -0.318 0.924 -0.213
+vn -0.354 0.924 -0.146
+vn -0.375 0.924 -0.075
+vn -0.383 0.924 -0.000
+vn -0.375 0.924 0.075
+vn -0.354 0.924 0.146
+vn -0.318 0.924 0.213
+vn -0.271 0.924 0.271
+vn -0.213 0.924 0.318
+vn -0.146 0.924 0.354
+vn -0.075 0.924 0.375
+vn -0.000 0.924 0.383
+vn 0.075 0.924 0.375
+vn 0.146 0.924 0.354
+vn 0.213 0.924 0.318
+vn 0.271 0.924 0.271
+vn 0.318 0.924 0.213
+vn 0.354 0.924 0.146
+vn 0.375 0.924 0.075
+vn 0.383 0.924 0.000
+vn 0.375 0.924 -0.075
+vn 0.354 0.924 -0.146
+vn 0.318 0.924 -0.213
+vn 0.271 0.924 -0.271
+vn 0.213 0.924 -0.318
+vn 0.146 0.924 -0.354
+vn 0.075 0.924 -0.375
+vn 0.000 0.924 -0.383
+vn -0.000 0.831 -0.556
+vn -0.108 0.831 -0.545
+vn -0.213 0.831 -0.513
+vn -0.309 0.831 -0.462
+vn -0.393 0.831 -0.393
+vn -0.462 0.831 -0.309
+vn -0.513 0.831 -0.213
+vn -0.545 0.831 -0.108
+vn -0.556 0.831 -0.000
+vn -0.545 0.831 0.108
+vn -0.513 0.831 0.213
+vn -0.462 0.831 0.309
+vn -0.393 0.831 0.393
+vn -0.309 0.831 0.462
+vn -0.213 0.831 0.513
+vn -0.108 0.831 0.545
+vn -0.000 0.831 0.556
+vn 0.108 0.831 0.545
+vn 0.213 0.831 0.513
+vn 0.309 0.831 0.462
+vn 0.393 0.831 0.393
+vn 0.462 0.831 0.309
+vn 0.513 0.831 0.213
+vn 0.545 0.831 0.108
+vn 0.556 0.831 0.000
+vn 0.545 0.831 -0.108
+vn 0.513 0.831 -0.213
+vn 0.462 0.831 -0.309
+vn 0.393 0.831 -0.393
+vn 0.309 0.831 -0.462
+vn 0.213 0.831 -0.513
+vn 0.108 0.831 -0.545
+vn 0.000 0.831 -0.556
+vn -0.000 0.707 -0.707
+vn -0.138 0.707 -0.694
+vn -0.271 0.707 -0.653
+vn -0.393 0.707 -0.588
+vn -0.500 0.707 -0.500
+vn -0.588 0.707 -0.393
+vn -0.653 0.707 -0.271
+vn -0.694 0.707 -0.138
+vn -0.707 0.707 -0.000
+vn -0.694 0.707 0.138
+vn -0.653 0.707 0.271
+vn -0.588 0.707 0.393
+vn -0.500 0.707 0.500
+vn -0.393 0.707 0.588
+vn -0.271 0.707 0.653
+vn -0.138 0.707 0.694
+vn -0.000 0.707 0.707
+vn 0.138 0.707 0.694
+vn 0.271 0.707 0.653
+vn 0.393 0.707 0.588
+vn 0.500 0.707 0.500
+vn 0.588 0.707 0.393
+vn 0.653 0.707 0.271
+vn 0.694 0.707 0.138
+vn 0.707 0.707 0.000
+vn 0.694 0.707 -0.138
+vn 0.653 0.707 -0.271
+vn 0.588 0.707 -0.393
+vn 0.500 0.707 -0.500
+vn 0.393 0.707 -0.588
+vn 0.271 0.707 -0.653
+vn 0.138 0.707 -0.694
+vn 0.000 0.707 -0.707
+vn -0.000 0.556 -0.831
+vn -0.162 0.556 -0.815
+vn -0.318 0.556 -0.768
+vn -0.462 0.556 -0.691
+vn -0.588 0.556 -0.588
+vn -0.691 0.556 -0.462
+vn -0.768 0.556 -0.318
+vn -0.815 0.556 -0.162
+vn -0.831 0.556 -0.000
+vn -0.815 0.556 0.162
+vn -0.768 0.556 0.318
+vn -0.691 0.556 0.462
+vn -0.588 0.556 0.588
+vn -0.462 0.556 0.691
+vn -0.318 0.556 0.768
+vn -0.162 0.556 0.815
+vn -0.000 0.556 0.831
+vn 0.162 0.556 0.815
+vn 0.318 0.556 0.768
+vn 0.462 0.556 0.691
+vn 0.588 0.556 0.588
+vn 0.691 0.556 0.462
+vn 0.768 0.556 0.318
+vn 0.815 0.556 0.162
+vn 0.831 0.556 0.000
+vn 0.815 0.556 -0.162
+vn 0.768 0.556 -0.318
+vn 0.691 0.556 -0.462
+vn 0.588 0.556 -0.588
+vn 0.462 0.556 -0.691
+vn 0.318 0.556 -0.768
+vn 0.162 0.556 -0.815
+vn 0.000 0.556 -0.831
+vn -0.000 0.383 -0.924
+vn -0.180 0.383 -0.906
+vn -0.354 0.383 -0.854
+vn -0.513 0.383 -0.768
+vn -0.653 0.383 -0.653
+vn -0.768 0.383 -0.513
+vn -0.854 0.383 -0.354
+vn -0.906 0.383 -0.180
+vn -0.924 0.383 -0.000
+vn -0.906 0.383 0.180
+vn -0.854 0.383 0.354
+vn -0.768 0.383 0.513
+vn -0.653 0.383 0.653
+vn -0.513 0.383 0.768
+vn -0.354 0.383 0.854
+vn -0.180 0.383 0.906
+vn -0.000 0.383 0.924
+vn 0.180 0.383 0.906
+vn 0.354 0.383 0.854
+vn 0.513 0.383 0.768
+vn 0.653 0.383 0.653
+vn 0.768 0.383 0.513
+vn 0.854 0.383 0.354
+vn 0.906 0.383 0.180
+vn 0.924 0.383 0.000
+vn 0.906 0.383 -0.180
+vn 0.854 0.383 -0.354
+vn 0.768 0.383 -0.513
+vn 0.653 0.383 -0.653
+vn 0.513 0.383 -0.768
+vn 0.354 0.383 -0.854
+vn 0.180 0.383 -0.906
+vn 0.000 0.383 -0.924
+vn -0.000 0.195 -0.981
+vn -0.191 0.195 -0.962
+vn -0.375 0.195 -0.906
+vn -0.545 0.195 -0.815
+vn -0.694 0.195 -0.694
+vn -0.815 0.195 -0.545
+vn -0.906 0.195 -0.375
+vn -0.962 0.195 -0.191
+vn -0.981 0.195 -0.000
+vn -0.962 0.195 0.191
+vn -0.906 0.195 0.375
+vn -0.815 0.195 0.545
+vn -0.694 0.195 0.694
+vn -0.545 0.195 0.815
+vn -0.375 0.195 0.906
+vn -0.191 0.195 0.962
+vn -0.000 0.195 0.981
+vn 0.191 0.195 0.962
+vn 0.375 0.195 0.906
+vn 0.545 0.195 0.815
+vn 0.694 0.195 0.694
+vn 0.815 0.195 0.545
+vn 0.906 0.195 0.375
+vn 0.962 0.195 0.191
+vn 0.981 0.195 0.000
+vn 0.962 0.195 -0.191
+vn 0.906 0.195 -0.375
+vn 0.815 0.195 -0.545
+vn 0.694 0.195 -0.694
+vn 0.545 0.195 -0.815
+vn 0.375 0.195 -0.906
+vn 0.191 0.195 -0.962
+vn 0.000 0.195 -0.981
+vn -0.000 -0.000 -1.000
+vn -0.195 -0.000 -0.981
+vn -0.383 -0.000 -0.924
+vn -0.556 -0.000 -0.831
+vn -0.707 -0.000 -0.707
+vn -0.831 -0.000 -0.556
+vn -0.924 -0.000 -0.383
+vn -0.981 -0.000 -0.195
+vn -1.000 -0.000 -0.000
+vn -0.981 -0.000 0.195
+vn -0.924 -0.000 0.383
+vn -0.831 -0.000 0.556
+vn -0.707 -0.000 0.707
+vn -0.556 -0.000 0.831
+vn -0.383 -0.000 0.924
+vn -0.195 -0.000 0.981
+vn -0.000 -0.000 1.000
+vn 0.195 -0.000 0.981
+vn 0.383 -0.000 0.924
+vn 0.556 -0.000 0.831
+vn 0.707 -0.000 0.707
+vn 0.831 -0.000 0.556
+vn 0.924 -0.000 0.383
+vn 0.981 -0.000 0.195
+vn 1.000 -0.000 0.000
+vn 0.981 -0.000 -0.195
+vn 0.924 -0.000 -0.383
+vn 0.831 -0.000 -0.556
+vn 0.707 -0.000 -0.707
+vn 0.556 -0.000 -0.831
+vn 0.383 -0.000 -0.924
+vn 0.195 -0.000 -0.981
+vn 0.000 -0.000 -1.000
+vn -0.000 -0.195 -0.981
+vn -0.191 -0.195 -0.962
+vn -0.375 -0.195 -0.906
+vn -0.545 -0.195 -0.815
+vn -0.694 -0.195 -0.694
+vn -0.815 -0.195 -0.545
+vn -0.906 -0.195 -0.375
+vn -0.962 -0.195 -0.191
+vn -0.981 -0.195 -0.000
+vn -0.962 -0.195 0.191
+vn -0.906 -0.195 0.375
+vn -0.815 -0.195 0.545
+vn -0.694 -0.195 0.694
+vn -0.545 -0.195 0.815
+vn -0.375 -0.195 0.906
+vn -0.191 -0.195 0.962
+vn -0.000 -0.195 0.981
+vn 0.191 -0.195 0.962
+vn 0.375 -0.195 0.906
+vn 0.545 -0.195 0.815
+vn 0.694 -0.195 0.694
+vn 0.815 -0.195 0.545
+vn 0.906 -0.195 0.375
+vn 0.962 -0.195 0.191
+vn 0.981 -0.195 0.000
+vn 0.962 -0.195 -0.191
+vn 0.906 -0.195 -0.375
+vn 0.815 -0.195 -0.545
+vn 0.694 -0.195 -0.694
+vn 0.545 -0.195 -0.815
+vn 0.375 -0.195 -0.906
+vn 0.191 -0.195 -0.962
+vn 0.000 -0.195 -0.981
+vn -0.000 -0.383 -0.924
+vn -0.180 -0.383 -0.906
+vn -0.354 -0.383 -0.854
+vn -0.513 -0.383 -0.768
+vn -0.653 -0.383 -0.653
+vn -0.768 -0.383 -0.513
+vn -0.854 -0.383 -0.354
+vn -0.906 -0.383 -0.180
+vn -0.924 -0.383 -0.000
+vn -0.906 -0.383 0.180
+vn -0.854 -0.383 0.354
+vn -0.768 -0.383 0.513
+vn -0.653 -0.383 0.653
+vn -0.513 -0.383 0.768
+vn -0.354 -0.383 0.854
+vn -0.180 -0.383 0.906
+vn -0.000 -0.383 0.924
+vn 0.180 -0.383 0.906
+vn 0.354 -0.383 0.854
+vn 0.513 -0.383 0.768
+vn 0.653 -0.383 0.653
+vn 0.768 -0.383 0.513
+vn 0.854 -0.383 0.354
+vn 0.906 -0.383 0.180
+vn 0.924 -0.383 0.000
+vn 0.906 -0.383 -0.180
+vn 0.854 -0.383 -0.354
+vn 0.768 -0.383 -0.513
+vn 0.653 -0.383 -0.653
+vn 0.513 -0.383 -0.768
+vn 0.354 -0.383 -0.854
+vn 0.180 -0.383 -0.906
+vn 0.000 -0.383 -0.924
+vn -0.000 -0.556 -0.831
+vn -0.162 -0.556 -0.815
+vn -0.318 -0.556 -0.768
+vn -0.462 -0.556 -0.691
+vn -0.588 -0.556 -0.588
+vn -0.691 -0.556 -0.462
+vn -0.768 -0.556 -0.318
+vn -0.815 -0.556 -0.162
+vn -0.831 -0.556 -0.000
+vn -0.815 -0.556 0.162
+vn -0.768 -0.556 0.318
+vn -0.691 -0.556 0.462
+vn -0.588 -0.556 0.588
+vn -0.462 -0.556 0.691
+vn -0.318 -0.556 0.768
+vn -0.162 -0.556 0.815
+vn -0.000 -0.556 0.831
+vn 0.162 -0.556 0.815
+vn 0.318 -0.556 0.768
+vn 0.462 -0.556 0.691
+vn 0.588 -0.556 0.588
+vn 0.691 -0.556 0.462
+vn 0.768 -0.556 0.318
+vn 0.815 -0.556 0.162
+vn 0.831 -0.556 0.000
+vn 0.815 -0.556 -0.162
+vn 0.768 -0.556 -0.318
+vn 0.691 -0.556 -0.462
+vn 0.588 -0.556 -0.588
+vn 0.462 -0.556 -0.691
+vn 0.318 -0.556 -0.768
+vn 0.162 -0.556 -0.815
+vn 0.000 -0.556 -0.831
+vn -0.000 -0.707 -0.707
+vn -0.138 -0.707 -0.694
+vn -0.271 -0.707 -0.653
+vn -0.393 -0.707 -0.588
+vn -0.500 -0.707 -0.500
+vn -0.588 -0.707 -0.393
+vn -0.653 -0.707 -0.271
+vn -0.694 -0.707 -0.138
+vn -0.707 -0.707 -0.000
+vn -0.694 -0.707 0.138
+vn -0.653 -0.707 0.271
+vn -0.588 -0.707 0.393
+vn -0.500 -0.707 0.500
+vn -0.393 -0.707 0.588
+vn -0.271 -0.707 0.653
+vn -0.138 -0.707 0.694
+vn -0.000 -0.707 0.707
+vn 0.138 -0.707 0.694
+vn 0.271 -0.707 0.653
+vn 0.393 -0.707 0.588
+vn 0.500 -0.707 0.500
+vn 0.588 -0.707 0.393
+vn 0.653 -0.707 0.271
+vn 0.694 -0.707 0.138
+vn 0.707 -0.707 0.000
+vn 0.694 -0.707 -0.138
+vn 0.653 -0.707 -0.271
+vn 0.588 -0.707 -0.393
+vn 0.500 -0.707 -0.500
+vn 0.393 -0.707 -0.588
+vn 0.271 -0.707 -0.653
+vn 0.138 -0.707 -0.694
+vn 0.000 -0.707 -0.707
+vn -0.000 -0.831 -0.556
+vn -0.108 -0.831 -0.545
+vn -0.213 -0.831 -0.513
+vn -0.309 -0.831 -0.462
+vn -0.393 -0.831 -0.393
+vn -0.462 -0.831 -0.309
+vn -0.513 -0.831 -0.213
+vn -0.545 -0.831 -0.108
+vn -0.556 -0.831 -0.000
+vn -0.545 -0.831 0.108
+vn -0.513 -0.831 0.213
+vn -0.462 -0.831 0.309
+vn -0.393 -0.831 0.393
+vn -0.309 -0.831 0.462
+vn -0.213 -0.831 0.513
+vn -0.108 -0.831 0.545
+vn -0.000 -0.831 0.556
+vn 0.108 -0.831 0.545
+vn 0.213 -0.831 0.513
+vn 0.309 -0.831 0.462
+vn 0.393 -0.831 0.393
+vn 0.462 -0.831 0.309
+vn 0.513 -0.831 0.213
+vn 0.545 -0.831 0.108
+vn 0.556 -0.831 0.000
+vn 0.545 -0.831 -0.108
+vn 0.513 -0.831 -0.213
+vn 0.462 -0.831 -0.309
+vn 0.393 -0.831 -0.393
+vn 0.309 -0.831 -0.462
+vn 0.213 -0.831 -0.513
+vn 0.108 -0.831 -0.545
+vn 0.000 -0.831 -0.556
+vn -0.000 -0.924 -0.383
+vn -0.075 -0.924 -0.375
+vn -0.146 -0.924 -0.354
+vn -0.213 -0.924 -0.318
+vn -0.271 -0.924 -0.271
+vn -0.318 -0.924 -0.213
+vn -0.354 -0.924 -0.146
+vn -0.375 -0.924 -0.075
+vn -0.383 -0.924 -0.000
+vn -0.375 -0.924 0.075
+vn -0.354 -0.924 0.146
+vn -0.318 -0.924 0.213
+vn -0.271 -0.924 0.271
+vn -0.213 -0.924 0.318
+vn -0.146 -0.924 0.354
+vn -0.075 -0.924 0.375
+vn -0.000 -0.924 0.383
+vn 0.075 -0.924 0.375
+vn 0.146 -0.924 0.354
+vn 0.213 -0.924 0.318
+vn 0.271 -0.924 0.271
+vn 0.318 -0.924 0.213
+vn 0.354 -0.924 0.146
+vn 0.375 -0.924 0.075
+vn 0.383 -0.924 0.000
+vn 0.375 -0.924 -0.075
+vn 0.354 -0.924 -0.146
+vn 0.318 -0.924 -0.213
+vn 0.271 -0.924 -0.271
+vn 0.213 -0.924 -0.318
+vn 0.146 -0.924 -0.354
+vn 0.075 -0.924 -0.375
+vn 0.000 -0.924 -0.383
+vn -0.000 -0.981 -0.195
+vn -0.038 -0.981 -0.191
+vn -0.075 -0.981 -0.180
+vn -0.108 -0.981 -0.162
+vn -0.138 -0.981 -0.138
+vn -0.162 -0.981 -0.108
+vn -0.180 -0.981 -0.075
+vn -0.191 -0.981 -0.038
+vn -0.195 -0.981 -0.000
+vn -0.191 -0.981 0.038
+vn -0.180 -0.981 0.075
+vn -0.162 -0.981 0.108
+vn -0.138 -0.981 0.138
+vn -0.108 -0.981 0.162
+vn -0.075 -0.981 0.180
+vn -0.038 -0.981 0.191
+vn -0.000 -0.981 0.195
+vn 0.038 -0.981 0.191
+vn 0.075 -0.981 0.180
+vn 0.108 -0.981 0.162
+vn 0.138 -0.981 0.138
+vn 0.162 -0.981 0.108
+vn 0.180 -0.981 0.075
+vn 0.191 -0.981 0.038
+vn 0.195 -0.981 0.000
+vn 0.191 -0.981 -0.038
+vn 0.180 -0.981 -0.075
+vn 0.162 -0.981 -0.108
+vn 0.138 -0.981 -0.138
+vn 0.108 -0.981 -0.162
+vn 0.075 -0.981 -0.180
+vn 0.038 -0.981 -0.191
+vn 0.000 -0.981 -0.195
+vn -0.000 -1.000 -0.000
+vn -0.000 -1.000 -0.000
+vn -0.000 -1.000 -0.000
+vn -0.000 -1.000 -0.000
+vn -0.000 -1.000 -0.000
+vn -0.000 -1.000 -0.000
+vn -0.000 -1.000 -0.000
+vn -0.000 -1.000 -0.000
+vn -0.000 -1.000 -0.000
+vn -0.000 -1.000 0.000
+vn -0.000 -1.000 0.000
+vn -0.000 -1.000 0.000
+vn -0.000 -1.000 0.000
+vn -0.000 -1.000 0.000
+vn -0.000 -1.000 0.000
+vn -0.000 -1.000 0.000
+vn -0.000 -1.000 0.000
+vn 0.000 -1.000 0.000
+vn 0.000 -1.000 0.000
+vn 0.000 -1.000 0.000
+vn 0.000 -1.000 0.000
+vn 0.000 -1.000 0.000
+vn 0.000 -1.000 0.000
+vn 0.000 -1.000 0.000
+vn 0.000 -1.000 0.000
+vn 0.000 -1.000 -0.000
+vn 0.000 -1.000 -0.000
+vn 0.000 -1.000 -0.000
+vn 0.000 -1.000 -0.000
+vn 0.000 -1.000 -0.000
+vn 0.000 -1.000 -0.000
+vn 0.000 -1.000 -0.000
+vn 0.000 -1.000 -0.000
+usemtl default
+f 1/1/1 2/2/2 35/35/35
+f 35/35/35 34/34/34 1/1/1
+f 34/34/34 35/35/35 68/68/68
+f 68/68/68 67/67/67 34/34/34
+f 67/67/67 68/68/68 101/101/101
+f 101/101/101 100/100/100 67/67/67
+f 100/100/100 101/101/101 134/134/134
+f 134/134/134 133/133/133 100/100/100
+f 133/133/133 134/134/134 167/167/167
+f 167/167/167 166/166/166 133/133/133
+f 166/166/166 167/167/167 200/200/200
+f 200/200/200 199/199/199 166/166/166
+f 199/199/199 200/200/200 233/233/233
+f 233/233/233 232/232/232 199/199/199
+f 232/232/232 233/233/233 266/266/266
+f 266/266/266 265/265/265 232/232/232
+f 265/265/265 266/266/266 299/299/299
+f 299/299/299 298/298/298 265/265/265
+f 298/298/298 299/299/299 332/332/332
+f 332/332/332 331/331/331 298/298/298
+f 331/331/331 332/332/332 365/365/365
+f 365/365/365 364/364/364 331/331/331
+f 364/364/364 365/365/365 398/398/398
+f 398/398/398 397/397/397 364/364/364
+f 397/397/397 398/398/398 431/431/431
+f 431/431/431 430/430/430 397/397/397
+f 430/430/430 431/431/431 464/464/464
+f 464/464/464 463/463/463 430/430/430
+f 463/463/463 464/464/464 497/497/497
+f 497/497/497 496/496/496 463/463/463
+f 496/496/496 497/497/497 530/530/530
+f 530/530/530 529/529/529 496/496/496
+f 531/531/531 530/530/530 497/497/497
+f 497/497/497 498/498/498 531/531/531
+f 498/498/498 497/497/497 464/464/464
+f 532/532/532 531/531/531 498/498/498
+f 498/498/498 499/499/499 532/532/532
+f 533/533/533 532/532/532 499/499/499
+f 499/499/499 500/500/500 533/533/533
+f 534/534/534 533/533/533 500/500/500
+f 500/500/500 501/501/501 534/534/534
+f 535/535/535 534/534/534 501/501/501
+f 501/501/501 502/502/502 535/535/535
+f 536/536/536 535/535/535 502/502/502
+f 502/502/502 503/503/503 536/536/536
+f 537/537/537 536/536/536 503/503/503
+f 503/503/503 504/504/504 537/537/537
+f 538/538/538 537/537/537 504/504/504
+f 504/504/504 505/505/505 538/538/538
+f 539/539/539 538/538/538 505/505/505
+f 505/505/505 506/506/506 539/539/539
+f 540/540/540 539/539/539 506/506/506
+f 506/506/506 507/507/507 540/540/540
+f 541/541/541 540/540/540 507/507/507
+f 507/507/507 508/508/508 541/541/541
+f 542/542/542 541/541/541 508/508/508
+f 508/508/508 509/509/509 542/542/542
+f 543/543/543 542/542/542 509/509/509
+f 509/509/509 510/510/510 543/543/543
+f 544/544/544 543/543/543 510/510/510
+f 510/510/510 511/511/511 544/544/544
+f 545/545/545 544/544/544 511/511/511
+f 511/511/511 512/512/512 545/545/545
+f 546/546/546 545/545/545 512/512/512
+f 512/512/512 513/513/513 546/546/546
+f 547/547/547 546/546/546 513/513/513
+f 513/513/513 514/514/514 547/547/547
+f 548/548/548 547/547/547 514/514/514
+f 514/514/514 515/515/515 548/548/548
+f 549/549/549 548/548/548 515/515/515
+f 515/515/515 516/516/516 549/549/549
+f 550/550/550 549/549/549 516/516/516
+f 516/516/516 517/517/517 550/550/550
+f 551/551/551 550/550/550 517/517/517
+f 517/517/517 518/518/518 551/551/551
+f 552/552/552 551/551/551 518/518/518
+f 518/518/518 519/519/519 552/552/552
+f 553/553/553 552/552/552 519/519/519
+f 519/519/519 520/520/520 553/553/553
+f 554/554/554 553/553/553 520/520/520
+f 520/520/520 521/521/521 554/554/554
+f 555/555/555 554/554/554 521/521/521
+f 521/521/521 522/522/522 555/555/555
+f 556/556/556 555/555/555 522/522/522
+f 522/522/522 523/523/523 556/556/556
+f 557/557/557 556/556/556 523/523/523
+f 523/523/523 524/524/524 557/557/557
+f 558/558/558 557/557/557 524/524/524
+f 524/524/524 525/525/525 558/558/558
+f 559/559/559 558/558/558 525/525/525
+f 525/525/525 526/526/526 559/559/559
+f 560/560/560 559/559/559 526/526/526
+f 526/526/526 527/527/527 560/560/560
+f 561/561/561 560/560/560 527/527/527
+f 527/527/527 528/528/528 561/561/561
+f 528/528/528 527/527/527 494/494/494
+f 494/494/494 495/495/495 528/528/528
+f 495/495/495 494/494/494 461/461/461
+f 461/461/461 462/462/462 495/495/495
+f 462/462/462 461/461/461 428/428/428
+f 428/428/428 429/429/429 462/462/462
+f 429/429/429 428/428/428 395/395/395
+f 395/395/395 396/396/396 429/429/429
+f 396/396/396 395/395/395 362/362/362
+f 362/362/362 363/363/363 396/396/396
+f 363/363/363 362/362/362 329/329/329
+f 329/329/329 330/330/330 363/363/363
+f 330/330/330 329/329/329 296/296/296
+f 296/296/296 297/297/297 330/330/330
+f 297/297/297 296/296/296 263/263/263
+f 263/263/263 264/264/264 297/297/297
+f 264/264/264 263/263/263 230/230/230
+f 230/230/230 231/231/231 264/264/264
+f 231/231/231 230/230/230 197/197/197
+f 197/197/197 198/198/198 231/231/231
+f 198/198/198 197/197/197 164/164/164
+f 164/164/164 165/165/165 198/198/198
+f 165/165/165 164/164/164 131/131/131
+f 131/131/131 132/132/132 165/165/165
+f 132/132/132 131/131/131 98/98/98
+f 98/98/98 99/99/99 132/132/132
+f 99/99/99 98/98/98 65/65/65
+f 65/65/65 66/66/66 99/99/99
+f 66/66/66 65/65/65 32/32/32
+f 32/32/32 33/33/33 66/66/66
+f 31/31/31 32/32/32 65/65/65
+f 65/65/65 64/64/64 31/31/31
+f 64/64/64 65/65/65 98/98/98
+f 30/30/30 31/31/31 64/64/64
+f 64/64/64 63/63/63 30/30/30
+f 29/29/29 30/30/30 63/63/63
+f 63/63/63 62/62/62 29/29/29
+f 28/28/28 29/29/29 62/62/62
+f 62/62/62 61/61/61 28/28/28
+f 27/27/27 28/28/28 61/61/61
+f 61/61/61 60/60/60 27/27/27
+f 26/26/26 27/27/27 60/60/60
+f 60/60/60 59/59/59 26/26/26
+f 25/25/25 26/26/26 59/59/59
+f 59/59/59 58/58/58 25/25/25
+f 24/24/24 25/25/25 58/58/58
+f 58/58/58 57/57/57 24/24/24
+f 23/23/23 24/24/24 57/57/57
+f 57/57/57 56/56/56 23/23/23
+f 22/22/22 23/23/23 56/56/56
+f 56/56/56 55/55/55 22/22/22
+f 21/21/21 22/22/22 55/55/55
+f 55/55/55 54/54/54 21/21/21
+f 20/20/20 21/21/21 54/54/54
+f 54/54/54 53/53/53 20/20/20
+f 19/19/19 20/20/20 53/53/53
+f 53/53/53 52/52/52 19/19/19
+f 18/18/18 19/19/19 52/52/52
+f 52/52/52 51/51/51 18/18/18
+f 17/17/17 18/18/18 51/51/51
+f 51/51/51 50/50/50 17/17/17
+f 16/16/16 17/17/17 50/50/50
+f 50/50/50 49/49/49 16/16/16
+f 15/15/15 16/16/16 49/49/49
+f 49/49/49 48/48/48 15/15/15
+f 14/14/14 15/15/15 48/48/48
+f 48/48/48 47/47/47 14/14/14
+f 13/13/13 14/14/14 47/47/47
+f 47/47/47 46/46/46 13/13/13
+f 12/12/12 13/13/13 46/46/46
+f 46/46/46 45/45/45 12/12/12
+f 11/11/11 12/12/12 45/45/45
+f 45/45/45 44/44/44 11/11/11
+f 10/10/10 11/11/11 44/44/44
+f 44/44/44 43/43/43 10/10/10
+f 9/9/9 10/10/10 43/43/43
+f 43/43/43 42/42/42 9/9/9
+f 8/8/8 9/9/9 42/42/42
+f 42/42/42 41/41/41 8/8/8
+f 7/7/7 8/8/8 41/41/41
+f 41/41/41 40/40/40 7/7/7
+f 6/6/6 7/7/7 40/40/40
+f 40/40/40 39/39/39 6/6/6
+f 5/5/5 6/6/6 39/39/39
+f 39/39/39 38/38/38 5/5/5
+f 4/4/4 5/5/5 38/38/38
+f 38/38/38 37/37/37 4/4/4
+f 3/3/3 4/4/4 37/37/37
+f 37/37/37 36/36/36 3/3/3
+f 2/2/2 3/3/3 36/36/36
+f 36/36/36 35/35/35 2/2/2
+f 35/35/35 36/36/36 69/69/69
+f 69/69/69 68/68/68 35/35/35
+f 68/68/68 69/69/69 102/102/102
+f 102/102/102 101/101/101 68/68/68
+f 101/101/101 102/102/102 135/135/135
+f 135/135/135 134/134/134 101/101/101
+f 134/134/134 135/135/135 168/168/168
+f 168/168/168 167/167/167 134/134/134
+f 167/167/167 168/168/168 201/201/201
+f 201/201/201 200/200/200 167/167/167
+f 200/200/200 201/201/201 234/234/234
+f 234/234/234 233/233/233 200/200/200
+f 233/233/233 234/234/234 267/267/267
+f 267/267/267 266/266/266 233/233/233
+f 266/266/266 267/267/267 300/300/300
+f 300/300/300 299/299/299 266/266/266
+f 299/299/299 300/300/300 333/333/333
+f 333/333/333 332/332/332 299/299/299
+f 332/332/332 333/333/333 366/366/366
+f 366/366/366 365/365/365 332/332/332
+f 365/365/365 366/366/366 399/399/399
+f 399/399/399 398/398/398 365/365/365
+f 398/398/398 399/399/399 432/432/432
+f 432/432/432 431/431/431 398/398/398
+f 431/431/431 432/432/432 465/465/465
+f 465/465/465 464/464/464 431/431/431
+f 464/464/464 465/465/465 498/498/498
+f 499/499/499 498/498/498 465/465/465
+f 465/465/465 466/466/466 499/499/499
+f 466/466/466 465/465/465 432/432/432
+f 500/500/500 499/499/499 466/466/466
+f 466/466/466 467/467/467 500/500/500
+f 501/501/501 500/500/500 467/467/467
+f 467/467/467 468/468/468 501/501/501
+f 502/502/502 501/501/501 468/468/468
+f 468/468/468 469/469/469 502/502/502
+f 503/503/503 502/502/502 469/469/469
+f 469/469/469 470/470/470 503/503/503
+f 504/504/504 503/503/503 470/470/470
+f 470/470/470 471/471/471 504/504/504
+f 505/505/505 504/504/504 471/471/471
+f 471/471/471 472/472/472 505/505/505
+f 506/506/506 505/505/505 472/472/472
+f 472/472/472 473/473/473 506/506/506
+f 507/507/507 506/506/506 473/473/473
+f 473/473/473 474/474/474 507/507/507
+f 508/508/508 507/507/507 474/474/474
+f 474/474/474 475/475/475 508/508/508
+f 509/509/509 508/508/508 475/475/475
+f 475/475/475 476/476/476 509/509/509
+f 510/510/510 509/509/509 476/476/476
+f 476/476/476 477/477/477 510/510/510
+f 511/511/511 510/510/510 477/477/477
+f 477/477/477 478/478/478 511/511/511
+f 512/512/512 511/511/511 478/478/478
+f 478/478/478 479/479/479 512/512/512
+f 513/513/513 512/512/512 479/479/479
+f 479/479/479 480/480/480 513/513/513
+f 514/514/514 513/513/513 480/480/480
+f 480/480/480 481/481/481 514/514/514
+f 515/515/515 514/514/514 481/481/481
+f 481/481/481 482/482/482 515/515/515
+f 516/516/516 515/515/515 482/482/482
+f 482/482/482 483/483/483 516/516/516
+f 517/517/517 516/516/516 483/483/483
+f 483/483/483 484/484/484 517/517/517
+f 518/518/518 517/517/517 484/484/484
+f 484/484/484 485/485/485 518/518/518
+f 519/519/519 518/518/518 485/485/485
+f 485/485/485 486/486/486 519/519/519
+f 520/520/520 519/519/519 486/486/486
+f 486/486/486 487/487/487 520/520/520
+f 521/521/521 520/520/520 487/487/487
+f 487/487/487 488/488/488 521/521/521
+f 522/522/522 521/521/521 488/488/488
+f 488/488/488 489/489/489 522/522/522
+f 523/523/523 522/522/522 489/489/489
+f 489/489/489 490/490/490 523/523/523
+f 524/524/524 523/523/523 490/490/490
+f 490/490/490 491/491/491 524/524/524
+f 525/525/525 524/524/524 491/491/491
+f 491/491/491 492/492/492 525/525/525
+f 526/526/526 525/525/525 492/492/492
+f 492/492/492 493/493/493 526/526/526
+f 527/527/527 526/526/526 493/493/493
+f 493/493/493 494/494/494 527/527/527
+f 494/494/494 493/493/493 460/460/460
+f 460/460/460 461/461/461 494/494/494
+f 461/461/461 460/460/460 427/427/427
+f 427/427/427 428/428/428 461/461/461
+f 428/428/428 427/427/427 394/394/394
+f 394/394/394 395/395/395 428/428/428
+f 395/395/395 394/394/394 361/361/361
+f 361/361/361 362/362/362 395/395/395
+f 362/362/362 361/361/361 328/328/328
+f 328/328/328 329/329/329 362/362/362
+f 329/329/329 328/328/328 295/295/295
+f 295/295/295 296/296/296 329/329/329
+f 296/296/296 295/295/295 262/262/262
+f 262/262/262 263/263/263 296/296/296
+f 263/263/263 262/262/262 229/229/229
+f 229/229/229 230/230/230 263/263/263
+f 230/230/230 229/229/229 196/196/196
+f 196/196/196 197/197/197 230/230/230
+f 197/197/197 196/196/196 163/163/163
+f 163/163/163 164/164/164 197/197/197
+f 164/164/164 163/163/163 130/130/130
+f 130/130/130 131/131/131 164/164/164
+f 131/131/131 130/130/130 97/97/97
+f 97/97/97 98/98/98 131/131/131
+f 98/98/98 97/97/97 64/64/64
+f 63/63/63 64/64/64 97/97/97
+f 97/97/97 96/96/96 63/63/63
+f 96/96/96 97/97/97 130/130/130
+f 62/62/62 63/63/63 96/96/96
+f 96/96/96 95/95/95 62/62/62
+f 61/61/61 62/62/62 95/95/95
+f 95/95/95 94/94/94 61/61/61
+f 60/60/60 61/61/61 94/94/94
+f 94/94/94 93/93/93 60/60/60
+f 59/59/59 60/60/60 93/93/93
+f 93/93/93 92/92/92 59/59/59
+f 58/58/58 59/59/59 92/92/92
+f 92/92/92 91/91/91 58/58/58
+f 57/57/57 58/58/58 91/91/91
+f 91/91/91 90/90/90 57/57/57
+f 56/56/56 57/57/57 90/90/90
+f 90/90/90 89/89/89 56/56/56
+f 55/55/55 56/56/56 89/89/89
+f 89/89/89 88/88/88 55/55/55
+f 54/54/54 55/55/55 88/88/88
+f 88/88/88 87/87/87 54/54/54
+f 53/53/53 54/54/54 87/87/87
+f 87/87/87 86/86/86 53/53/53
+f 52/52/52 53/53/53 86/86/86
+f 86/86/86 85/85/85 52/52/52
+f 51/51/51 52/52/52 85/85/85
+f 85/85/85 84/84/84 51/51/51
+f 50/50/50 51/51/51 84/84/84
+f 84/84/84 83/83/83 50/50/50
+f 49/49/49 50/50/50 83/83/83
+f 83/83/83 82/82/82 49/49/49
+f 48/48/48 49/49/49 82/82/82
+f 82/82/82 81/81/81 48/48/48
+f 47/47/47 48/48/48 81/81/81
+f 81/81/81 80/80/80 47/47/47
+f 46/46/46 47/47/47 80/80/80
+f 80/80/80 79/79/79 46/46/46
+f 45/45/45 46/46/46 79/79/79
+f 79/79/79 78/78/78 45/45/45
+f 44/44/44 45/45/45 78/78/78
+f 78/78/78 77/77/77 44/44/44
+f 43/43/43 44/44/44 77/77/77
+f 77/77/77 76/76/76 43/43/43
+f 42/42/42 43/43/43 76/76/76
+f 76/76/76 75/75/75 42/42/42
+f 41/41/41 42/42/42 75/75/75
+f 75/75/75 74/74/74 41/41/41
+f 40/40/40 41/41/41 74/74/74
+f 74/74/74 73/73/73 40/40/40
+f 39/39/39 40/40/40 73/73/73
+f 73/73/73 72/72/72 39/39/39
+f 38/38/38 39/39/39 72/72/72
+f 72/72/72 71/71/71 38/38/38
+f 37/37/37 38/38/38 71/71/71
+f 71/71/71 70/70/70 37/37/37
+f 36/36/36 37/37/37 70/70/70
+f 70/70/70 69/69/69 36/36/36
+f 69/69/69 70/70/70 103/103/103
+f 103/103/103 102/102/102 69/69/69
+f 102/102/102 103/103/103 136/136/136
+f 136/136/136 135/135/135 102/102/102
+f 135/135/135 136/136/136 169/169/169
+f 169/169/169 168/168/168 135/135/135
+f 168/168/168 169/169/169 202/202/202
+f 202/202/202 201/201/201 168/168/168
+f 201/201/201 202/202/202 235/235/235
+f 235/235/235 234/234/234 201/201/201
+f 234/234/234 235/235/235 268/268/268
+f 268/268/268 267/267/267 234/234/234
+f 267/267/267 268/268/268 301/301/301
+f 301/301/301 300/300/300 267/267/267
+f 300/300/300 301/301/301 334/334/334
+f 334/334/334 333/333/333 300/300/300
+f 333/333/333 334/334/334 367/367/367
+f 367/367/367 366/366/366 333/333/333
+f 366/366/366 367/367/367 400/400/400
+f 400/400/400 399/399/399 366/366/366
+f 399/399/399 400/400/400 433/433/433
+f 433/433/433 432/432/432 399/399/399
+f 432/432/432 433/433/433 466/466/466
+f 467/467/467 466/466/466 433/433/433
+f 433/433/433 434/434/434 467/467/467
+f 434/434/434 433/433/433 400/400/400
+f 468/468/468 467/467/467 434/434/434
+f 434/434/434 435/435/435 468/468/468
+f 469/469/469 468/468/468 435/435/435
+f 435/435/435 436/436/436 469/469/469
+f 470/470/470 469/469/469 436/436/436
+f 436/436/436 437/437/437 470/470/470
+f 471/471/471 470/470/470 437/437/437
+f 437/437/437 438/438/438 471/471/471
+f 472/472/472 471/471/471 438/438/438
+f 438/438/438 439/439/439 472/472/472
+f 473/473/473 472/472/472 439/439/439
+f 439/439/439 440/440/440 473/473/473
+f 474/474/474 473/473/473 440/440/440
+f 440/440/440 441/441/441 474/474/474
+f 475/475/475 474/474/474 441/441/441
+f 441/441/441 442/442/442 475/475/475
+f 476/476/476 475/475/475 442/442/442
+f 442/442/442 443/443/443 476/476/476
+f 477/477/477 476/476/476 443/443/443
+f 443/443/443 444/444/444 477/477/477
+f 478/478/478 477/477/477 444/444/444
+f 444/444/444 445/445/445 478/478/478
+f 479/479/479 478/478/478 445/445/445
+f 445/445/445 446/446/446 479/479/479
+f 480/480/480 479/479/479 446/446/446
+f 446/446/446 447/447/447 480/480/480
+f 481/481/481 480/480/480 447/447/447
+f 447/447/447 448/448/448 481/481/481
+f 482/482/482 481/481/481 448/448/448
+f 448/448/448 449/449/449 482/482/482
+f 483/483/483 482/482/482 449/449/449
+f 449/449/449 450/450/450 483/483/483
+f 484/484/484 483/483/483 450/450/450
+f 450/450/450 451/451/451 484/484/484
+f 485/485/485 484/484/484 451/451/451
+f 451/451/451 452/452/452 485/485/485
+f 486/486/486 485/485/485 452/452/452
+f 452/452/452 453/453/453 486/486/486
+f 487/487/487 486/486/486 453/453/453
+f 453/453/453 454/454/454 487/487/487
+f 488/488/488 487/487/487 454/454/454
+f 454/454/454 455/455/455 488/488/488
+f 489/489/489 488/488/488 455/455/455
+f 455/455/455 456/456/456 489/489/489
+f 490/490/490 489/489/489 456/456/456
+f 456/456/456 457/457/457 490/490/490
+f 491/491/491 490/490/490 457/457/457
+f 457/457/457 458/458/458 491/491/491
+f 492/492/492 491/491/491 458/458/458
+f 458/458/458 459/459/459 492/492/492
+f 493/493/493 492/492/492 459/459/459
+f 459/459/459 460/460/460 493/493/493
+f 460/460/460 459/459/459 426/426/426
+f 426/426/426 427/427/427 460/460/460
+f 427/427/427 426/426/426 393/393/393
+f 393/393/393 394/394/394 427/427/427
+f 394/394/394 393/393/393 360/360/360
+f 360/360/360 361/361/361 394/394/394
+f 361/361/361 360/360/360 327/327/327
+f 327/327/327 328/328/328 361/361/361
+f 328/328/328 327/327/327 294/294/294
+f 294/294/294 295/295/295 328/328/328
+f 295/295/295 294/294/294 261/261/261
+f 261/261/261 262/262/262 295/295/295
+f 262/262/262 261/261/261 228/228/228
+f 228/228/228 229/229/229 262/262/262
+f 229/229/229 228/228/228 195/195/195
+f 195/195/195 196/196/196 229/229/229
+f 196/196/196 195/195/195 162/162/162
+f 162/162/162 163/163/163 196/196/196
+f 163/163/163 162/162/162 129/129/129
+f 129/129/129 130/130/130 163/163/163
+f 130/130/130 129/129/129 96/96/96
+f 95/95/95 96/96/96 129/129/129
+f 129/129/129 128/128/128 95/95/95
+f 128/128/128 129/129/129 162/162/162
+f 94/94/94 95/95/95 128/128/128
+f 128/128/128 127/127/127 94/94/94
+f 93/93/93 94/94/94 127/127/127
+f 127/127/127 126/126/126 93/93/93
+f 92/92/92 93/93/93 126/126/126
+f 126/126/126 125/125/125 92/92/92
+f 91/91/91 92/92/92 125/125/125
+f 125/125/125 124/124/124 91/91/91
+f 90/90/90 91/91/91 124/124/124
+f 124/124/124 123/123/123 90/90/90
+f 89/89/89 90/90/90 123/123/123
+f 123/123/123 122/122/122 89/89/89
+f 88/88/88 89/89/89 122/122/122
+f 122/122/122 121/121/121 88/88/88
+f 87/87/87 88/88/88 121/121/121
+f 121/121/121 120/120/120 87/87/87
+f 86/86/86 87/87/87 120/120/120
+f 120/120/120 119/119/119 86/86/86
+f 85/85/85 86/86/86 119/119/119
+f 119/119/119 118/118/118 85/85/85
+f 84/84/84 85/85/85 118/118/118
+f 118/118/118 117/117/117 84/84/84
+f 83/83/83 84/84/84 117/117/117
+f 117/117/117 116/116/116 83/83/83
+f 82/82/82 83/83/83 116/116/116
+f 116/116/116 115/115/115 82/82/82
+f 81/81/81 82/82/82 115/115/115
+f 115/115/115 114/114/114 81/81/81
+f 80/80/80 81/81/81 114/114/114
+f 114/114/114 113/113/113 80/80/80
+f 79/79/79 80/80/80 113/113/113
+f 113/113/113 112/112/112 79/79/79
+f 78/78/78 79/79/79 112/112/112
+f 112/112/112 111/111/111 78/78/78
+f 77/77/77 78/78/78 111/111/111
+f 111/111/111 110/110/110 77/77/77
+f 76/76/76 77/77/77 110/110/110
+f 110/110/110 109/109/109 76/76/76
+f 75/75/75 76/76/76 109/109/109
+f 109/109/109 108/108/108 75/75/75
+f 74/74/74 75/75/75 108/108/108
+f 108/108/108 107/107/107 74/74/74
+f 73/73/73 74/74/74 107/107/107
+f 107/107/107 106/106/106 73/73/73
+f 72/72/72 73/73/73 106/106/106
+f 106/106/106 105/105/105 72/72/72
+f 71/71/71 72/72/72 105/105/105
+f 105/105/105 104/104/104 71/71/71
+f 70/70/70 71/71/71 104/104/104
+f 104/104/104 103/103/103 70/70/70
+f 103/103/103 104/104/104 137/137/137
+f 137/137/137 136/136/136 103/103/103
+f 136/136/136 137/137/137 170/170/170
+f 170/170/170 169/169/169 136/136/136
+f 169/169/169 170/170/170 203/203/203
+f 203/203/203 202/202/202 169/169/169
+f 202/202/202 203/203/203 236/236/236
+f 236/236/236 235/235/235 202/202/202
+f 235/235/235 236/236/236 269/269/269
+f 269/269/269 268/268/268 235/235/235
+f 268/268/268 269/269/269 302/302/302
+f 302/302/302 301/301/301 268/268/268
+f 301/301/301 302/302/302 335/335/335
+f 335/335/335 334/334/334 301/301/301
+f 334/334/334 335/335/335 368/368/368
+f 368/368/368 367/367/367 334/334/334
+f 367/367/367 368/368/368 401/401/401
+f 401/401/401 400/400/400 367/367/367
+f 400/400/400 401/401/401 434/434/434
+f 435/435/435 434/434/434 401/401/401
+f 401/401/401 402/402/402 435/435/435
+f 402/402/402 401/401/401 368/368/368
+f 436/436/436 435/435/435 402/402/402
+f 402/402/402 403/403/403 436/436/436
+f 437/437/437 436/436/436 403/403/403
+f 403/403/403 404/404/404 437/437/437
+f 438/438/438 437/437/437 404/404/404
+f 404/404/404 405/405/405 438/438/438
+f 439/439/439 438/438/438 405/405/405
+f 405/405/405 406/406/406 439/439/439
+f 440/440/440 439/439/439 406/406/406
+f 406/406/406 407/407/407 440/440/440
+f 441/441/441 440/440/440 407/407/407
+f 407/407/407 408/408/408 441/441/441
+f 442/442/442 441/441/441 408/408/408
+f 408/408/408 409/409/409 442/442/442
+f 443/443/443 442/442/442 409/409/409
+f 409/409/409 410/410/410 443/443/443
+f 444/444/444 443/443/443 410/410/410
+f 410/410/410 411/411/411 444/444/444
+f 445/445/445 444/444/444 411/411/411
+f 411/411/411 412/412/412 445/445/445
+f 446/446/446 445/445/445 412/412/412
+f 412/412/412 413/413/413 446/446/446
+f 447/447/447 446/446/446 413/413/413
+f 413/413/413 414/414/414 447/447/447
+f 448/448/448 447/447/447 414/414/414
+f 414/414/414 415/415/415 448/448/448
+f 449/449/449 448/448/448 415/415/415
+f 415/415/415 416/416/416 449/449/449
+f 450/450/450 449/449/449 416/416/416
+f 416/416/416 417/417/417 450/450/450
+f 451/451/451 450/450/450 417/417/417
+f 417/417/417 418/418/418 451/451/451
+f 452/452/452 451/451/451 418/418/418
+f 418/418/418 419/419/419 452/452/452
+f 453/453/453 452/452/452 419/419/419
+f 419/419/419 420/420/420 453/453/453
+f 454/454/454 453/453/453 420/420/420
+f 420/420/420 421/421/421 454/454/454
+f 455/455/455 454/454/454 421/421/421
+f 421/421/421 422/422/422 455/455/455
+f 456/456/456 455/455/455 422/422/422
+f 422/422/422 423/423/423 456/456/456
+f 457/457/457 456/456/456 423/423/423
+f 423/423/423 424/424/424 457/457/457
+f 458/458/458 457/457/457 424/424/424
+f 424/424/424 425/425/425 458/458/458
+f 459/459/459 458/458/458 425/425/425
+f 425/425/425 426/426/426 459/459/459
+f 426/426/426 425/425/425 392/392/392
+f 392/392/392 393/393/393 426/426/426
+f 393/393/393 392/392/392 359/359/359
+f 359/359/359 360/360/360 393/393/393
+f 360/360/360 359/359/359 326/326/326
+f 326/326/326 327/327/327 360/360/360
+f 327/327/327 326/326/326 293/293/293
+f 293/293/293 294/294/294 327/327/327
+f 294/294/294 293/293/293 260/260/260
+f 260/260/260 261/261/261 294/294/294
+f 261/261/261 260/260/260 227/227/227
+f 227/227/227 228/228/228 261/261/261
+f 228/228/228 227/227/227 194/194/194
+f 194/194/194 195/195/195 228/228/228
+f 195/195/195 194/194/194 161/161/161
+f 161/161/161 162/162/162 195/195/195
+f 162/162/162 161/161/161 128/128/128
+f 127/127/127 128/128/128 161/161/161
+f 161/161/161 160/160/160 127/127/127
+f 160/160/160 161/161/161 194/194/194
+f 126/126/126 127/127/127 160/160/160
+f 160/160/160 159/159/159 126/126/126
+f 125/125/125 126/126/126 159/159/159
+f 159/159/159 158/158/158 125/125/125
+f 124/124/124 125/125/125 158/158/158
+f 158/158/158 157/157/157 124/124/124
+f 123/123/123 124/124/124 157/157/157
+f 157/157/157 156/156/156 123/123/123
+f 122/122/122 123/123/123 156/156/156
+f 156/156/156 155/155/155 122/122/122
+f 121/121/121 122/122/122 155/155/155
+f 155/155/155 154/154/154 121/121/121
+f 120/120/120 121/121/121 154/154/154
+f 154/154/154 153/153/153 120/120/120
+f 119/119/119 120/120/120 153/153/153
+f 153/153/153 152/152/152 119/119/119
+f 118/118/118 119/119/119 152/152/152
+f 152/152/152 151/151/151 118/118/118
+f 117/117/117 118/118/118 151/151/151
+f 151/151/151 150/150/150 117/117/117
+f 116/116/116 117/117/117 150/150/150
+f 150/150/150 149/149/149 116/116/116
+f 115/115/115 116/116/116 149/149/149
+f 149/149/149 148/148/148 115/115/115
+f 114/114/114 115/115/115 148/148/148
+f 148/148/148 147/147/147 114/114/114
+f 113/113/113 114/114/114 147/147/147
+f 147/147/147 146/146/146 113/113/113
+f 112/112/112 113/113/113 146/146/146
+f 146/146/146 145/145/145 112/112/112
+f 111/111/111 112/112/112 145/145/145
+f 145/145/145 144/144/144 111/111/111
+f 110/110/110 111/111/111 144/144/144
+f 144/144/144 143/143/143 110/110/110
+f 109/109/109 110/110/110 143/143/143
+f 143/143/143 142/142/142 109/109/109
+f 108/108/108 109/109/109 142/142/142
+f 142/142/142 141/141/141 108/108/108
+f 107/107/107 108/108/108 141/141/141
+f 141/141/141 140/140/140 107/107/107
+f 106/106/106 107/107/107 140/140/140
+f 140/140/140 139/139/139 106/106/106
+f 105/105/105 106/106/106 139/139/139
+f 139/139/139 138/138/138 105/105/105
+f 104/104/104 105/105/105 138/138/138
+f 138/138/138 137/137/137 104/104/104
+f 137/137/137 138/138/138 171/171/171
+f 171/171/171 170/170/170 137/137/137
+f 170/170/170 171/171/171 204/204/204
+f 204/204/204 203/203/203 170/170/170
+f 203/203/203 204/204/204 237/237/237
+f 237/237/237 236/236/236 203/203/203
+f 236/236/236 237/237/237 270/270/270
+f 270/270/270 269/269/269 236/236/236
+f 269/269/269 270/270/270 303/303/303
+f 303/303/303 302/302/302 269/269/269
+f 302/302/302 303/303/303 336/336/336
+f 336/336/336 335/335/335 302/302/302
+f 335/335/335 336/336/336 369/369/369
+f 369/369/369 368/368/368 335/335/335
+f 368/368/368 369/369/369 402/402/402
+f 403/403/403 402/402/402 369/369/369
+f 369/369/369 370/370/370 403/403/403
+f 370/370/370 369/369/369 336/336/336
+f 404/404/404 403/403/403 370/370/370
+f 370/370/370 371/371/371 404/404/404
+f 405/405/405 404/404/404 371/371/371
+f 371/371/371 372/372/372 405/405/405
+f 406/406/406 405/405/405 372/372/372
+f 372/372/372 373/373/373 406/406/406
+f 407/407/407 406/406/406 373/373/373
+f 373/373/373 374/374/374 407/407/407
+f 408/408/408 407/407/407 374/374/374
+f 374/374/374 375/375/375 408/408/408
+f 409/409/409 408/408/408 375/375/375
+f 375/375/375 376/376/376 409/409/409
+f 410/410/410 409/409/409 376/376/376
+f 376/376/376 377/377/377 410/410/410
+f 411/411/411 410/410/410 377/377/377
+f 377/377/377 378/378/378 411/411/411
+f 412/412/412 411/411/411 378/378/378
+f 378/378/378 379/379/379 412/412/412
+f 413/413/413 412/412/412 379/379/379
+f 379/379/379 380/380/380 413/413/413
+f 414/414/414 413/413/413 380/380/380
+f 380/380/380 381/381/381 414/414/414
+f 415/415/415 414/414/414 381/381/381
+f 381/381/381 382/382/382 415/415/415
+f 416/416/416 415/415/415 382/382/382
+f 382/382/382 383/383/383 416/416/416
+f 417/417/417 416/416/416 383/383/383
+f 383/383/383 384/384/384 417/417/417
+f 418/418/418 417/417/417 384/384/384
+f 384/384/384 385/385/385 418/418/418
+f 419/419/419 418/418/418 385/385/385
+f 385/385/385 386/386/386 419/419/419
+f 420/420/420 419/419/419 386/386/386
+f 386/386/386 387/387/387 420/420/420
+f 421/421/421 420/420/420 387/387/387
+f 387/387/387 388/388/388 421/421/421
+f 422/422/422 421/421/421 388/388/388
+f 388/388/388 389/389/389 422/422/422
+f 423/423/423 422/422/422 389/389/389
+f 389/389/389 390/390/390 423/423/423
+f 424/424/424 423/423/423 390/390/390
+f 390/390/390 391/391/391 424/424/424
+f 425/425/425 424/424/424 391/391/391
+f 391/391/391 392/392/392 425/425/425
+f 392/392/392 391/391/391 358/358/358
+f 358/358/358 359/359/359 392/392/392
+f 359/359/359 358/358/358 325/325/325
+f 325/325/325 326/326/326 359/359/359
+f 326/326/326 325/325/325 292/292/292
+f 292/292/292 293/293/293 326/326/326
+f 293/293/293 292/292/292 259/259/259
+f 259/259/259 260/260/260 293/293/293
+f 260/260/260 259/259/259 226/226/226
+f 226/226/226 227/227/227 260/260/260
+f 227/227/227 226/226/226 193/193/193
+f 193/193/193 194/194/194 227/227/227
+f 194/194/194 193/193/193 160/160/160
+f 159/159/159 160/160/160 193/193/193
+f 193/193/193 192/192/192 159/159/159
+f 192/192/192 193/193/193 226/226/226
+f 158/158/158 159/159/159 192/192/192
+f 192/192/192 191/191/191 158/158/158
+f 157/157/157 158/158/158 191/191/191
+f 191/191/191 190/190/190 157/157/157
+f 156/156/156 157/157/157 190/190/190
+f 190/190/190 189/189/189 156/156/156
+f 155/155/155 156/156/156 189/189/189
+f 189/189/189 188/188/188 155/155/155
+f 154/154/154 155/155/155 188/188/188
+f 188/188/188 187/187/187 154/154/154
+f 153/153/153 154/154/154 187/187/187
+f 187/187/187 186/186/186 153/153/153
+f 152/152/152 153/153/153 186/186/186
+f 186/186/186 185/185/185 152/152/152
+f 151/151/151 152/152/152 185/185/185
+f 185/185/185 184/184/184 151/151/151
+f 150/150/150 151/151/151 184/184/184
+f 184/184/184 183/183/183 150/150/150
+f 149/149/149 150/150/150 183/183/183
+f 183/183/183 182/182/182 149/149/149
+f 148/148/148 149/149/149 182/182/182
+f 182/182/182 181/181/181 148/148/148
+f 147/147/147 148/148/148 181/181/181
+f 181/181/181 180/180/180 147/147/147
+f 146/146/146 147/147/147 180/180/180
+f 180/180/180 179/179/179 146/146/146
+f 145/145/145 146/146/146 179/179/179
+f 179/179/179 178/178/178 145/145/145
+f 144/144/144 145/145/145 178/178/178
+f 178/178/178 177/177/177 144/144/144
+f 143/143/143 144/144/144 177/177/177
+f 177/177/177 176/176/176 143/143/143
+f 142/142/142 143/143/143 176/176/176
+f 176/176/176 175/175/175 142/142/142
+f 141/141/141 142/142/142 175/175/175
+f 175/175/175 174/174/174 141/141/141
+f 140/140/140 141/141/141 174/174/174
+f 174/174/174 173/173/173 140/140/140
+f 139/139/139 140/140/140 173/173/173
+f 173/173/173 172/172/172 139/139/139
+f 138/138/138 139/139/139 172/172/172
+f 172/172/172 171/171/171 138/138/138
+f 171/171/171 172/172/172 205/205/205
+f 205/205/205 204/204/204 171/171/171
+f 204/204/204 205/205/205 238/238/238
+f 238/238/238 237/237/237 204/204/204
+f 237/237/237 238/238/238 271/271/271
+f 271/271/271 270/270/270 237/237/237
+f 270/270/270 271/271/271 304/304/304
+f 304/304/304 303/303/303 270/270/270
+f 303/303/303 304/304/304 337/337/337
+f 337/337/337 336/336/336 303/303/303
+f 336/336/336 337/337/337 370/370/370
+f 371/371/371 370/370/370 337/337/337
+f 337/337/337 338/338/338 371/371/371
+f 338/338/338 337/337/337 304/304/304
+f 372/372/372 371/371/371 338/338/338
+f 338/338/338 339/339/339 372/372/372
+f 373/373/373 372/372/372 339/339/339
+f 339/339/339 340/340/340 373/373/373
+f 374/374/374 373/373/373 340/340/340
+f 340/340/340 341/341/341 374/374/374
+f 375/375/375 374/374/374 341/341/341
+f 341/341/341 342/342/342 375/375/375
+f 376/376/376 375/375/375 342/342/342
+f 342/342/342 343/343/343 376/376/376
+f 377/377/377 376/376/376 343/343/343
+f 343/343/343 344/344/344 377/377/377
+f 378/378/378 377/377/377 344/344/344
+f 344/344/344 345/345/345 378/378/378
+f 379/379/379 378/378/378 345/345/345
+f 345/345/345 346/346/346 379/379/379
+f 380/380/380 379/379/379 346/346/346
+f 346/346/346 347/347/347 380/380/380
+f 381/381/381 380/380/380 347/347/347
+f 347/347/347 348/348/348 381/381/381
+f 382/382/382 381/381/381 348/348/348
+f 348/348/348 349/349/349 382/382/382
+f 383/383/383 382/382/382 349/349/349
+f 349/349/349 350/350/350 383/383/383
+f 384/384/384 383/383/383 350/350/350
+f 350/350/350 351/351/351 384/384/384
+f 385/385/385 384/384/384 351/351/351
+f 351/351/351 352/352/352 385/385/385
+f 386/386/386 385/385/385 352/352/352
+f 352/352/352 353/353/353 386/386/386
+f 387/387/387 386/386/386 353/353/353
+f 353/353/353 354/354/354 387/387/387
+f 388/388/388 387/387/387 354/354/354
+f 354/354/354 355/355/355 388/388/388
+f 389/389/389 388/388/388 355/355/355
+f 355/355/355 356/356/356 389/389/389
+f 390/390/390 389/389/389 356/356/356
+f 356/356/356 357/357/357 390/390/390
+f 391/391/391 390/390/390 357/357/357
+f 357/357/357 358/358/358 391/391/391
+f 358/358/358 357/357/357 324/324/324
+f 324/324/324 325/325/325 358/358/358
+f 325/325/325 324/324/324 291/291/291
+f 291/291/291 292/292/292 325/325/325
+f 292/292/292 291/291/291 258/258/258
+f 258/258/258 259/259/259 292/292/292
+f 259/259/259 258/258/258 225/225/225
+f 225/225/225 226/226/226 259/259/259
+f 226/226/226 225/225/225 192/192/192
+f 191/191/191 192/192/192 225/225/225
+f 225/225/225 224/224/224 191/191/191
+f 224/224/224 225/225/225 258/258/258
+f 190/190/190 191/191/191 224/224/224
+f 224/224/224 223/223/223 190/190/190
+f 189/189/189 190/190/190 223/223/223
+f 223/223/223 222/222/222 189/189/189
+f 188/188/188 189/189/189 222/222/222
+f 222/222/222 221/221/221 188/188/188
+f 187/187/187 188/188/188 221/221/221
+f 221/221/221 220/220/220 187/187/187
+f 186/186/186 187/187/187 220/220/220
+f 220/220/220 219/219/219 186/186/186
+f 185/185/185 186/186/186 219/219/219
+f 219/219/219 218/218/218 185/185/185
+f 184/184/184 185/185/185 218/218/218
+f 218/218/218 217/217/217 184/184/184
+f 183/183/183 184/184/184 217/217/217
+f 217/217/217 216/216/216 183/183/183
+f 182/182/182 183/183/183 216/216/216
+f 216/216/216 215/215/215 182/182/182
+f 181/181/181 182/182/182 215/215/215
+f 215/215/215 214/214/214 181/181/181
+f 180/180/180 181/181/181 214/214/214
+f 214/214/214 213/213/213 180/180/180
+f 179/179/179 180/180/180 213/213/213
+f 213/213/213 212/212/212 179/179/179
+f 178/178/178 179/179/179 212/212/212
+f 212/212/212 211/211/211 178/178/178
+f 177/177/177 178/178/178 211/211/211
+f 211/211/211 210/210/210 177/177/177
+f 176/176/176 177/177/177 210/210/210
+f 210/210/210 209/209/209 176/176/176
+f 175/175/175 176/176/176 209/209/209
+f 209/209/209 208/208/208 175/175/175
+f 174/174/174 175/175/175 208/208/208
+f 208/208/208 207/207/207 174/174/174
+f 173/173/173 174/174/174 207/207/207
+f 207/207/207 206/206/206 173/173/173
+f 172/172/172 173/173/173 206/206/206
+f 206/206/206 205/205/205 172/172/172
+f 205/205/205 206/206/206 239/239/239
+f 239/239/239 238/238/238 205/205/205
+f 238/238/238 239/239/239 272/272/272
+f 272/272/272 271/271/271 238/238/238
+f 271/271/271 272/272/272 305/305/305
+f 305/305/305 304/304/304 271/271/271
+f 304/304/304 305/305/305 338/338/338
+f 339/339/339 338/338/338 305/305/305
+f 305/305/305 306/306/306 339/339/339
+f 306/306/306 305/305/305 272/272/272
+f 340/340/340 339/339/339 306/306/306
+f 306/306/306 307/307/307 340/340/340
+f 341/341/341 340/340/340 307/307/307
+f 307/307/307 308/308/308 341/341/341
+f 342/342/342 341/341/341 308/308/308
+f 308/308/308 309/309/309 342/342/342
+f 343/343/343 342/342/342 309/309/309
+f 309/309/309 310/310/310 343/343/343
+f 344/344/344 343/343/343 310/310/310
+f 310/310/310 311/311/311 344/344/344
+f 345/345/345 344/344/344 311/311/311
+f 311/311/311 312/312/312 345/345/345
+f 346/346/346 345/345/345 312/312/312
+f 312/312/312 313/313/313 346/346/346
+f 347/347/347 346/346/346 313/313/313
+f 313/313/313 314/314/314 347/347/347
+f 348/348/348 347/347/347 314/314/314
+f 314/314/314 315/315/315 348/348/348
+f 349/349/349 348/348/348 315/315/315
+f 315/315/315 316/316/316 349/349/349
+f 350/350/350 349/349/349 316/316/316
+f 316/316/316 317/317/317 350/350/350
+f 351/351/351 350/350/350 317/317/317
+f 317/317/317 318/318/318 351/351/351
+f 352/352/352 351/351/351 318/318/318
+f 318/318/318 319/319/319 352/352/352
+f 353/353/353 352/352/352 319/319/319
+f 319/319/319 320/320/320 353/353/353
+f 354/354/354 353/353/353 320/320/320
+f 320/320/320 321/321/321 354/354/354
+f 355/355/355 354/354/354 321/321/321
+f 321/321/321 322/322/322 355/355/355
+f 356/356/356 355/355/355 322/322/322
+f 322/322/322 323/323/323 356/356/356
+f 357/357/357 356/356/356 323/323/323
+f 323/323/323 324/324/324 357/357/357
+f 324/324/324 323/323/323 290/290/290
+f 290/290/290 291/291/291 324/324/324
+f 291/291/291 290/290/290 257/257/257
+f 257/257/257 258/258/258 291/291/291
+f 258/258/258 257/257/257 224/224/224
+f 223/223/223 224/224/224 257/257/257
+f 257/257/257 256/256/256 223/223/223
+f 256/256/256 257/257/257 290/290/290
+f 222/222/222 223/223/223 256/256/256
+f 256/256/256 255/255/255 222/222/222
+f 221/221/221 222/222/222 255/255/255
+f 255/255/255 254/254/254 221/221/221
+f 220/220/220 221/221/221 254/254/254
+f 254/254/254 253/253/253 220/220/220
+f 219/219/219 220/220/220 253/253/253
+f 253/253/253 252/252/252 219/219/219
+f 218/218/218 219/219/219 252/252/252
+f 252/252/252 251/251/251 218/218/218
+f 217/217/217 218/218/218 251/251/251
+f 251/251/251 250/250/250 217/217/217
+f 216/216/216 217/217/217 250/250/250
+f 250/250/250 249/249/249 216/216/216
+f 215/215/215 216/216/216 249/249/249
+f 249/249/249 248/248/248 215/215/215
+f 214/214/214 215/215/215 248/248/248
+f 248/248/248 247/247/247 214/214/214
+f 213/213/213 214/214/214 247/247/247
+f 247/247/247 246/246/246 213/213/213
+f 212/212/212 213/213/213 246/246/246
+f 246/246/246 245/245/245 212/212/212
+f 211/211/211 212/212/212 245/245/245
+f 245/245/245 244/244/244 211/211/211
+f 210/210/210 211/211/211 244/244/244
+f 244/244/244 243/243/243 210/210/210
+f 209/209/209 210/210/210 243/243/243
+f 243/243/243 242/242/242 209/209/209
+f 208/208/208 209/209/209 242/242/242
+f 242/242/242 241/241/241 208/208/208
+f 207/207/207 208/208/208 241/241/241
+f 241/241/241 240/240/240 207/207/207
+f 206/206/206 207/207/207 240/240/240
+f 240/240/240 239/239/239 206/206/206
+f 239/239/239 240/240/240 273/273/273
+f 273/273/273 272/272/272 239/239/239
+f 272/272/272 273/273/273 306/306/306
+f 307/307/307 306/306/306 273/273/273
+f 273/273/273 274/274/274 307/307/307
+f 274/274/274 273/273/273 240/240/240
+f 240/240/240 241/241/241 274/274/274
+f 308/308/308 307/307/307 274/274/274
+f 274/274/274 275/275/275 308/308/308
+f 275/275/275 274/274/274 241/241/241
+f 241/241/241 242/242/242 275/275/275
+f 309/309/309 308/308/308 275/275/275
+f 275/275/275 276/276/276 309/309/309
+f 276/276/276 275/275/275 242/242/242
+f 242/242/242 243/243/243 276/276/276
+f 310/310/310 309/309/309 276/276/276
+f 276/276/276 277/277/277 310/310/310
+f 277/277/277 276/276/276 243/243/243
+f 311/311/311 310/310/310 277/277/277
+f 277/277/277 278/278/278 311/311/311
+f 278/278/278 277/277/277 244/244/244
+f 312/312/312 311/311/311 278/278/278
+f 278/278/278 279/279/279 312/312/312
+f 279/279/279 278/278/278 245/245/245
+f 313/313/313 312/312/312 279/279/279
+f 279/279/279 280/280/280 313/313/313
+f 314/314/314 313/313/313 280/280/280
+f 280/280/280 279/279/279 246/246/246
+f 245/245/245 246/246/246 279/279/279
+f 244/244/244 245/245/245 278/278/278
+f 246/246/246 247/247/247 280/280/280
+f 281/281/281 280/280/280 247/247/247
+f 280/280/280 281/281/281 314/314/314
+f 247/247/247 248/248/248 281/281/281
+f 282/282/282 281/281/281 248/248/248
+f 248/248/248 249/249/249 282/282/282
+f 281/281/281 282/282/282 315/315/315
+f 315/315/315 314/314/314 281/281/281
+f 316/316/316 315/315/315 282/282/282
+f 282/282/282 283/283/283 316/316/316
+f 283/283/283 282/282/282 249/249/249
+f 317/317/317 316/316/316 283/283/283
+f 249/249/249 250/250/250 283/283/283
+f 284/284/284 283/283/283 250/250/250
+f 283/283/283 284/284/284 317/317/317
+f 250/250/250 251/251/251 284/284/284
+f 318/318/318 317/317/317 284/284/284
+f 284/284/284 285/285/285 318/318/318
+f 285/285/285 284/284/284 251/251/251
+f 319/319/319 318/318/318 285/285/285
+f 251/251/251 252/252/252 285/285/285
+f 286/286/286 285/285/285 252/252/252
+f 285/285/285 286/286/286 319/319/319
+f 252/252/252 253/253/253 286/286/286
+f 320/320/320 319/319/319 286/286/286
+f 286/286/286 287/287/287 320/320/320
+f 287/287/287 286/286/286 253/253/253
+f 321/321/321 320/320/320 287/287/287
+f 253/253/253 254/254/254 287/287/287
+f 288/288/288 287/287/287 254/254/254
+f 287/287/287 288/288/288 321/321/321
+f 254/254/254 255/255/255 288/288/288
+f 322/322/322 321/321/321 288/288/288
+f 288/288/288 289/289/289 322/322/322
+f 289/289/289 288/288/288 255/255/255
+f 323/323/323 322/322/322 289/289/289
+f 289/289/289 290/290/290 323/323/323
+f 290/290/290 289/289/289 256/256/256
+f 255/255/255 256/256/256 289/289/289
+f 243/243/243 244/244/244 277/277/277
diff --git a/data/geom/beam/beam b/data/geom/beam/beam
new file mode 100644 (file)
index 0000000..d9d7181
--- /dev/null
@@ -0,0 +1,7 @@
+0.8 0.8 0.8 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+clamp-t 
+45.0
diff --git a/data/geom/beam/beam.map b/data/geom/beam/beam.map
new file mode 100644 (file)
index 0000000..739657f
--- /dev/null
@@ -0,0 +1,4 @@
+{
+"classname" "worldspawn"
+"model" "geom/beam/beam.obj"
+}
diff --git a/data/geom/beam/beam.mtl b/data/geom/beam/beam.mtl
new file mode 100644 (file)
index 0000000..d0d08e6
--- /dev/null
@@ -0,0 +1,20 @@
+# Exported from Wings 3D 1.4.1\r
+newmtl default\r
+Ns 100.0\r
+d 1.0\r
+illum 2\r
+Kd 1.0 1.0 1.0\r
+Ka 1.0 1.0 1.0\r
+Ks 1.0 1.0 1.0\r
+Ke 0.0 0.0 0.0\r
+\r
+newmtl geom/beam/beam\r
+Ns 100.0\r
+d 1.0\r
+illum 2\r
+Kd 1.0 1.0 1.0\r
+Ka 1.0 1.0 1.0\r
+Ks 1.0 1.0 1.0\r
+Ke 0.0 0.0 0.0\r
+map_Kd beam.png\r
+\r
diff --git a/data/geom/beam/beam.obj b/data/geom/beam/beam.obj
new file mode 100644 (file)
index 0000000..a5bae1e
--- /dev/null
@@ -0,0 +1,521 @@
+# Exported from Wings 3D 1.4.1\r
+mtllib beam.mtl\r
+o cylinder1\r
+#128 vertices, 128 faces\r
+v 1.00000000 1.00000000 3.6768006e-17\r
+v 0.99518473 1.00000000 9.8017140e-2\r
+v 0.98078528 1.00000000 0.19509032\r
+v 0.95694034 1.00000000 0.29028468\r
+v 0.92387953 1.00000000 0.38268343\r
+v 0.88192126 1.00000000 0.47139674\r
+v 0.83146961 1.00000000 0.55557023\r
+v 0.77301045 1.00000000 0.63439328\r
+v 0.70710678 1.00000000 0.70710678\r
+v 0.63439328 1.00000000 0.77301045\r
+v 0.55557023 1.00000000 0.83146961\r
+v 0.47139674 1.00000000 0.88192126\r
+v 0.38268343 1.00000000 0.92387953\r
+v 0.29028468 1.00000000 0.95694034\r
+v 0.19509032 1.00000000 0.98078528\r
+v 9.8017140e-2 1.00000000 0.99518473\r
+v 9.5926809e-17 1.00000000 1.00000000\r
+v -9.8017140e-2 1.00000000 0.99518473\r
+v -0.19509032 1.00000000 0.98078528\r
+v -0.29028468 1.00000000 0.95694034\r
+v -0.38268343 1.00000000 0.92387953\r
+v -0.47139674 1.00000000 0.88192126\r
+v -0.55557023 1.00000000 0.83146961\r
+v -0.63439328 1.00000000 0.77301045\r
+v -0.70710678 1.00000000 0.70710678\r
+v -0.77301045 1.00000000 0.63439328\r
+v -0.83146961 1.00000000 0.55557023\r
+v -0.88192126 1.00000000 0.47139674\r
+v -0.92387953 1.00000000 0.38268343\r
+v -0.95694034 1.00000000 0.29028468\r
+v -0.98078528 1.00000000 0.19509032\r
+v -0.99518473 1.00000000 9.8017140e-2\r
+v -1.00000000 1.00000000 1.5923269e-16\r
+v -0.99518473 1.00000000 -9.8017140e-2\r
+v -0.98078528 1.00000000 -0.19509032\r
+v -0.95694034 1.00000000 -0.29028468\r
+v -0.92387953 1.00000000 -0.38268343\r
+v -0.88192126 1.00000000 -0.47139674\r
+v -0.83146961 1.00000000 -0.55557023\r
+v -0.77301045 1.00000000 -0.63439328\r
+v -0.70710678 1.00000000 -0.70710678\r
+v -0.63439328 1.00000000 -0.77301045\r
+v -0.55557023 1.00000000 -0.83146961\r
+v -0.47139674 1.00000000 -0.88192126\r
+v -0.38268343 1.00000000 -0.92387953\r
+v -0.29028468 1.00000000 -0.95694034\r
+v -0.19509032 1.00000000 -0.98078528\r
+v -9.8017140e-2 1.00000000 -0.99518473\r
+v -1.4900255e-16 1.00000000 -1.00000000\r
+v 9.8017140e-2 1.00000000 -0.99518473\r
+v 0.19509032 1.00000000 -0.98078528\r
+v 0.29028468 1.00000000 -0.95694034\r
+v 0.38268343 1.00000000 -0.92387953\r
+v 0.47139674 1.00000000 -0.88192126\r
+v 0.55557023 1.00000000 -0.83146961\r
+v 0.63439328 1.00000000 -0.77301045\r
+v 0.70710678 1.00000000 -0.70710678\r
+v 0.77301045 1.00000000 -0.63439328\r
+v 0.83146961 1.00000000 -0.55557023\r
+v 0.88192126 1.00000000 -0.47139674\r
+v 0.92387953 1.00000000 -0.38268343\r
+v 0.95694034 1.00000000 -0.29028468\r
+v 0.98078528 1.00000000 -0.19509032\r
+v 0.99518473 1.00000000 -9.8017140e-2\r
+v 1.00000000 0.0000000e+0 4.7704896e-17\r
+v 0.99518473 0.0000000e+0 9.8017140e-2\r
+v 0.98078528 0.0000000e+0 0.19509032\r
+v 0.95694034 0.0000000e+0 0.29028468\r
+v 0.92387953 0.0000000e+0 0.38268343\r
+v 0.88192126 0.0000000e+0 0.47139674\r
+v 0.83146961 0.0000000e+0 0.55557023\r
+v 0.77301045 0.0000000e+0 0.63439328\r
+v 0.70710678 0.0000000e+0 0.70710678\r
+v 0.63439328 0.0000000e+0 0.77301045\r
+v 0.55557023 0.0000000e+0 0.83146961\r
+v 0.47139674 0.0000000e+0 0.88192126\r
+v 0.38268343 0.0000000e+0 0.92387953\r
+v 0.29028468 0.0000000e+0 0.95694034\r
+v 0.19509032 0.0000000e+0 0.98078528\r
+v 9.8017140e-2 0.0000000e+0 0.99518473\r
+v 7.8579575e-17 0.0000000e+0 1.00000000\r
+v -9.8017140e-2 0.0000000e+0 0.99518473\r
+v -0.19509032 0.0000000e+0 0.98078528\r
+v -0.29028468 0.0000000e+0 0.95694034\r
+v -0.38268343 0.0000000e+0 0.92387953\r
+v -0.47139674 0.0000000e+0 0.88192126\r
+v -0.55557023 0.0000000e+0 0.83146961\r
+v -0.63439328 0.0000000e+0 0.77301045\r
+v -0.70710678 0.0000000e+0 0.70710678\r
+v -0.77301045 0.0000000e+0 0.63439328\r
+v -0.83146961 0.0000000e+0 0.55557023\r
+v -0.88192126 0.0000000e+0 0.47139674\r
+v -0.92387953 0.0000000e+0 0.38268343\r
+v -0.95694034 0.0000000e+0 0.29028468\r
+v -0.98078528 0.0000000e+0 0.19509032\r
+v -0.99518473 0.0000000e+0 9.8017140e-2\r
+v -1.00000000 0.0000000e+0 1.7016958e-16\r
+v -0.99518473 0.0000000e+0 -9.8017140e-2\r
+v -0.98078528 0.0000000e+0 -0.19509032\r
+v -0.95694034 0.0000000e+0 -0.29028468\r
+v -0.92387953 0.0000000e+0 -0.38268343\r
+v -0.88192126 0.0000000e+0 -0.47139674\r
+v -0.83146961 0.0000000e+0 -0.55557023\r
+v -0.77301045 0.0000000e+0 -0.63439328\r
+v -0.70710678 0.0000000e+0 -0.70710678\r
+v -0.63439328 0.0000000e+0 -0.77301045\r
+v -0.55557023 0.0000000e+0 -0.83146961\r
+v -0.47139674 0.0000000e+0 -0.88192126\r
+v -0.38268343 0.0000000e+0 -0.92387953\r
+v -0.29028468 0.0000000e+0 -0.95694034\r
+v -0.19509032 0.0000000e+0 -0.98078528\r
+v -9.8017140e-2 0.0000000e+0 -0.99518473\r
+v -1.6634979e-16 0.0000000e+0 -1.00000000\r
+v 9.8017140e-2 0.0000000e+0 -0.99518473\r
+v 0.19509032 0.0000000e+0 -0.98078528\r
+v 0.29028468 0.0000000e+0 -0.95694034\r
+v 0.38268343 0.0000000e+0 -0.92387953\r
+v 0.47139674 0.0000000e+0 -0.88192126\r
+v 0.55557023 0.0000000e+0 -0.83146961\r
+v 0.63439328 0.0000000e+0 -0.77301045\r
+v 0.70710678 0.0000000e+0 -0.70710678\r
+v 0.77301045 0.0000000e+0 -0.63439328\r
+v 0.83146961 0.0000000e+0 -0.55557023\r
+v 0.88192126 0.0000000e+0 -0.47139674\r
+v 0.92387953 0.0000000e+0 -0.38268343\r
+v 0.95694034 0.0000000e+0 -0.29028468\r
+v 0.98078528 0.0000000e+0 -0.19509032\r
+v 0.99518473 0.0000000e+0 -9.8017140e-2\r
+vt 0.0000000e+0 1.1272913e-14\r
+vt 3.4972025e-15 1.00000000\r
+vt 1.5625000e-2 1.00000000\r
+vt 1.5625000e-2 2.1616101e-14\r
+vt 3.1250000e-2 6.1013189e-15\r
+vt 3.1250000e-2 1.00000000\r
+vt 4.6875000e-2 1.00000000\r
+vt 4.6875000e-2 2.3533659e-14\r
+vt 6.2500000e-2 9.0648167e-15\r
+vt 6.2500000e-2 1.00000000\r
+vt 7.8125000e-2 1.00000000\r
+vt 7.8125000e-2 1.9872867e-14\r
+vt 9.3750000e-2 9.0648167e-15\r
+vt 9.3750000e-2 1.00000000\r
+vt 0.10937500 1.00000000\r
+vt 0.10937500 2.1499886e-14\r
+vt 0.12500000 5.3459175e-15\r
+vt 0.12500000 1.00000000\r
+vt 0.14062500 2.1209347e-14\r
+vt 0.14062500 1.00000000\r
+vt 0.15625000 7.4377983e-15\r
+vt 0.15625000 1.00000000\r
+vt 0.17187500 2.0453945e-14\r
+vt 0.17187500 1.00000000\r
+vt 0.18750000 9.1810323e-15\r
+vt 0.18750000 1.00000000\r
+vt 0.20312500 1.6618831e-14\r
+vt 0.20312500 1.00000000\r
+vt 0.21875000 8.3094153e-15\r
+vt 0.21875000 1.00000000\r
+vt 0.23437500 1.5398567e-14\r
+vt 0.23437500 1.00000000\r
+vt 0.25000000 1.2144530e-14\r
+vt 0.25000000 1.00000000\r
+vt 0.26562500 1.00000000\r
+vt 0.26562500 1.2609392e-14\r
+vt 0.28125000 9.6458947e-15\r
+vt 0.28125000 1.00000000\r
+vt 0.29687500 1.5979645e-14\r
+vt 0.29687500 1.00000000\r
+vt 0.31250000 8.0188763e-15\r
+vt 0.31250000 1.00000000\r
+vt 0.32812500 1.00000000\r
+vt 0.32812500 1.4817489e-14\r
+vt 0.34375000 1.1272913e-14\r
+vt 0.34375000 1.00000000\r
+vt 0.35937500 1.2725608e-14\r
+vt 0.35937500 1.00000000\r
+vt 0.37500000 7.8445529e-15\r
+vt 0.37500000 1.00000000\r
+vt 0.39062500 1.3481009e-14\r
+vt 0.39062500 1.00000000\r
+vt 0.40625000 7.5540139e-15\r
+vt 0.40625000 1.00000000\r
+vt 0.42187500 1.00000000\r
+vt 0.42187500 1.1563452e-14\r
+vt 0.43750000 1.1853991e-14\r
+vt 0.43750000 1.00000000\r
+vt 0.45312500 1.00000000\r
+vt 0.45312500 7.8445529e-15\r
+vt 0.46875000 9.9364337e-15\r
+vt 0.46875000 1.00000000\r
+vt 0.48437500 1.00000000\r
+vt 0.48437500 1.0401296e-14\r
+vt 0.50000000 8.5999543e-15\r
+vt 0.50000000 1.00000000\r
+vt 0.51562500 6.7986125e-15\r
+vt 0.51562500 1.00000000\r
+vt 0.53125000 1.0982374e-14\r
+vt 0.53125000 1.00000000\r
+vt 0.54687500 4.5905161e-15\r
+vt 0.54687500 1.00000000\r
+vt 0.56250000 7.7283373e-15\r
+vt 0.56250000 1.00000000\r
+vt 0.57812500 6.1013189e-15\r
+vt 0.57812500 1.00000000\r
+vt 0.59375000 6.5080735e-15\r
+vt 0.59375000 1.00000000\r
+vt 0.60937500 5.3459175e-15\r
+vt 0.60937500 1.00000000\r
+vt 0.62500000 1.00000000\r
+vt 0.62500000 8.4256309e-15\r
+vt 0.64062500 3.5445758e-15\r
+vt 0.64062500 1.00000000\r
+vt 0.65625000 1.0691835e-14\r
+vt 0.65625000 1.00000000\r
+vt 0.67187500 1.00000000\r
+vt 0.67187500 2.0918808e-15\r
+vt 0.68750000 1.0052649e-14\r
+vt 0.68750000 1.00000000\r
+vt 0.70312500 1.00000000\r
+vt 0.70312500 3.1378212e-15\r
+vt 0.71875000 1.0517512e-14\r
+vt 0.71875000 1.00000000\r
+vt 0.73437500 1.00000000\r
+vt 0.73437500 5.3459175e-15\r
+vt 0.75000000 1.2725608e-14\r
+vt 0.75000000 1.00000000\r
+vt 0.76562500 1.00000000\r
+vt 0.76562500 3.1378212e-15\r
+vt 0.78125000 1.0226973e-14\r
+vt 0.78125000 1.00000000\r
+vt 0.79687500 1.00000000\r
+vt 0.79687500 3.7188992e-15\r
+vt 0.81250000 9.7621103e-15\r
+vt 0.81250000 1.00000000\r
+vt 0.82812500 1.00000000\r
+vt 0.82812500 4.8810551e-15\r
+vt 0.84375000 1.1563452e-14\r
+vt 0.84375000 1.00000000\r
+vt 0.85937500 1.00000000\r
+vt 0.85937500 3.1378212e-15\r
+vt 0.87500000 8.8904933e-15\r
+vt 0.87500000 1.00000000\r
+vt 0.89062500 1.00000000\r
+vt 0.89062500 1.8013418e-15\r
+vt 0.90625000 1.2144530e-14\r
+vt 0.90625000 1.00000000\r
+vt 0.92187500 1.00000000\r
+vt 0.92187500 0.0000000e+0\r
+vt 0.93750000 1.0691835e-14\r
+vt 0.93750000 1.00000000\r
+vt 0.95312500 1.00000000\r
+vt 0.95312500 1.5108028e-15\r
+vt 0.96875000 1.1853991e-14\r
+vt 0.96875000 1.00000000\r
+vt 0.98437500 1.00000000\r
+vt 0.98437500 3.1378212e-15\r
+vt 1.00000000 1.1272913e-14\r
+vt 1.00000000 1.00000000\r
+vn 1.00000000 -7.4044900e-32 -1.3894524e-17\r
+vn 0.99518473 7.0792658e-17 9.8017140e-2\r
+vn 0.98078528 0.0000000e+0 0.19509032\r
+vn 0.95694034 0.0000000e+0 0.29028468\r
+vn 0.92387953 0.0000000e+0 0.38268343\r
+vn 0.88192126 0.0000000e+0 0.47139674\r
+vn 0.83146961 0.0000000e+0 0.55557023\r
+vn 0.77301045 0.0000000e+0 0.63439328\r
+vn 0.70710678 0.0000000e+0 0.70710678\r
+vn 0.63439328 0.0000000e+0 0.77301045\r
+vn 0.55557023 0.0000000e+0 0.83146961\r
+vn 0.47139674 0.0000000e+0 0.88192126\r
+vn 0.38268343 0.0000000e+0 0.92387953\r
+vn 0.29028468 -4.4245411e-18 0.95694034\r
+vn 0.19509032 -1.3273623e-17 0.98078528\r
+vn 9.8017140e-2 -2.6270713e-18 0.99518473\r
+vn 1.1358774e-15 -2.7653382e-19 1.00000000\r
+vn -9.8017140e-2 2.4888044e-18 0.99518473\r
+vn -0.19509032 4.4245411e-18 0.98078528\r
+vn -0.29028468 0.0000000e+0 0.95694034\r
+vn -0.38268343 0.0000000e+0 0.92387953\r
+vn -0.47139674 0.0000000e+0 0.88192126\r
+vn -0.55557023 0.0000000e+0 0.83146961\r
+vn -0.63439328 0.0000000e+0 0.77301045\r
+vn -0.70710678 0.0000000e+0 0.70710678\r
+vn -0.77301045 0.0000000e+0 0.63439328\r
+vn -0.83146961 0.0000000e+0 0.55557023\r
+vn -0.88192126 0.0000000e+0 0.47139674\r
+vn -0.92387953 0.0000000e+0 0.38268343\r
+vn -0.95694034 0.0000000e+0 0.29028468\r
+vn -0.98078528 0.0000000e+0 0.19509032\r
+vn -0.99518473 -1.4461895e-34 9.8017140e-2\r
+vn -1.00000000 0.0000000e+0 5.6967550e-16\r
+vn -0.99518473 0.0000000e+0 -9.8017140e-2\r
+vn -0.98078528 0.0000000e+0 -0.19509032\r
+vn -0.95694034 0.0000000e+0 -0.29028468\r
+vn -0.92387953 0.0000000e+0 -0.38268343\r
+vn -0.88192126 0.0000000e+0 -0.47139674\r
+vn -0.83146961 0.0000000e+0 -0.55557023\r
+vn -0.77301045 0.0000000e+0 -0.63439328\r
+vn -0.70710678 0.0000000e+0 -0.70710678\r
+vn -0.63439328 0.0000000e+0 -0.77301045\r
+vn -0.55557023 0.0000000e+0 -0.83146961\r
+vn -0.47139674 0.0000000e+0 -0.88192126\r
+vn -0.38268343 0.0000000e+0 -0.92387953\r
+vn -0.29028468 0.0000000e+0 -0.95694034\r
+vn -0.19509032 4.4245411e-18 -0.98078528\r
+vn -9.8017140e-2 2.6270713e-18 -0.99518473\r
+vn 0.0000000e+0 2.7653382e-19 -1.00000000\r
+vn 9.8017140e-2 -2.4888044e-18 -0.99518473\r
+vn 0.19509032 -4.4245411e-18 -0.98078528\r
+vn 0.29028468 0.0000000e+0 -0.95694034\r
+vn 0.38268343 0.0000000e+0 -0.92387953\r
+vn 0.47139674 0.0000000e+0 -0.88192126\r
+vn 0.55557023 0.0000000e+0 -0.83146961\r
+vn 0.63439328 0.0000000e+0 -0.77301045\r
+vn 0.70710678 0.0000000e+0 -0.70710678\r
+vn 0.77301045 0.0000000e+0 -0.63439328\r
+vn 0.83146961 0.0000000e+0 -0.55557023\r
+vn 0.88192126 0.0000000e+0 -0.47139674\r
+vn 0.92387953 0.0000000e+0 -0.38268343\r
+vn 0.95694034 0.0000000e+0 -0.29028468\r
+vn 0.98078528 0.0000000e+0 -0.19509032\r
+vn 0.99518473 -7.0792658e-17 -9.8017140e-2\r
+vn 1.00000000 -3.7022450e-32 -1.3894524e-17\r
+vn 0.99518473 3.8565052e-34 9.8017140e-2\r
+vn 0.98078528 -3.4088600e-19 0.19509032\r
+vn 0.95694034 0.0000000e+0 0.29028468\r
+vn 0.92387953 0.0000000e+0 0.38268343\r
+vn 0.88192126 0.0000000e+0 0.47139674\r
+vn 0.83146961 0.0000000e+0 0.55557023\r
+vn 0.77301045 0.0000000e+0 0.63439328\r
+vn 0.70710678 0.0000000e+0 0.70710678\r
+vn 0.63439328 0.0000000e+0 0.77301045\r
+vn 0.55557023 0.0000000e+0 0.83146961\r
+vn 0.47139674 0.0000000e+0 0.88192126\r
+vn 0.38268343 0.0000000e+0 0.92387953\r
+vn 0.29028468 0.0000000e+0 0.95694034\r
+vn 0.19509032 -6.6368117e-18 0.98078528\r
+vn 9.8017140e-2 -2.7653382e-19 0.99518473\r
+vn 5.7141231e-16 -1.3826691e-19 1.00000000\r
+vn -9.8017140e-2 2.7653382e-19 0.99518473\r
+vn -0.19509032 2.2122706e-18 0.98078528\r
+vn -0.29028468 0.0000000e+0 0.95694034\r
+vn -0.38268343 0.0000000e+0 0.92387953\r
+vn -0.47139674 0.0000000e+0 0.88192126\r
+vn -0.55557023 0.0000000e+0 0.83146961\r
+vn -0.63439328 0.0000000e+0 0.77301045\r
+vn -0.70710678 0.0000000e+0 0.70710678\r
+vn -0.77301045 0.0000000e+0 0.63439328\r
+vn -0.83146961 0.0000000e+0 0.55557023\r
+vn -0.88192126 0.0000000e+0 0.47139674\r
+vn -0.92387953 0.0000000e+0 0.38268343\r
+vn -0.95694034 0.0000000e+0 0.29028468\r
+vn -0.98078528 -3.4088600e-19 0.19509032\r
+vn -0.99518473 -2.8923789e-34 9.8017140e-2\r
+vn -1.00000000 7.7612168e-33 5.6446505e-16\r
+vn -0.99518473 0.0000000e+0 -9.8017140e-2\r
+vn -0.98078528 3.4088600e-19 -0.19509032\r
+vn -0.95694034 0.0000000e+0 -0.29028468\r
+vn -0.92387953 0.0000000e+0 -0.38268343\r
+vn -0.88192126 0.0000000e+0 -0.47139674\r
+vn -0.83146961 0.0000000e+0 -0.55557023\r
+vn -0.77301045 0.0000000e+0 -0.63439328\r
+vn -0.70710678 0.0000000e+0 -0.70710678\r
+vn -0.63439328 0.0000000e+0 -0.77301045\r
+vn -0.55557023 0.0000000e+0 -0.83146961\r
+vn -0.47139674 0.0000000e+0 -0.88192126\r
+vn -0.38268343 0.0000000e+0 -0.92387953\r
+vn -0.29028468 0.0000000e+0 -0.95694034\r
+vn -0.19509032 2.2122706e-18 -0.98078528\r
+vn -9.8017140e-2 2.7653382e-19 -0.99518473\r
+vn 0.0000000e+0 1.3826691e-19 -1.00000000\r
+vn 9.8017140e-2 -2.7653382e-19 -0.99518473\r
+vn 0.19509032 -2.2122706e-18 -0.98078528\r
+vn 0.29028468 0.0000000e+0 -0.95694034\r
+vn 0.38268343 0.0000000e+0 -0.92387953\r
+vn 0.47139674 0.0000000e+0 -0.88192126\r
+vn 0.55557023 0.0000000e+0 -0.83146961\r
+vn 0.63439328 0.0000000e+0 -0.77301045\r
+vn 0.70710678 0.0000000e+0 -0.70710678\r
+vn 0.77301045 0.0000000e+0 -0.63439328\r
+vn 0.83146961 0.0000000e+0 -0.55557023\r
+vn 0.88192126 0.0000000e+0 -0.47139674\r
+vn 0.92387953 0.0000000e+0 -0.38268343\r
+vn 0.95694034 0.0000000e+0 -0.29028468\r
+vn 0.98078528 3.4088600e-19 -0.19509032\r
+vn 0.99518473 -4.2421557e-33 -9.8017140e-2\r
+g cylinder1_geom/beam/beam\r
+usemtl geom/beam/beam\r
+s 1\r
+f 1/34/1 65/33/65 64/35/64\r
+f 2/32/2 65/33/65 1/34/1\r
+f 2/32/2 67/29/67 66/31/66\r
+f 3/30/3 67/29/67 2/32/2\r
+f 4/28/4 67/29/67 3/30/3\r
+f 4/28/4 69/25/69 68/27/68\r
+f 5/26/5 69/25/69 4/28/4\r
+f 6/24/6 69/25/69 5/26/5\r
+f 6/24/6 71/21/71 70/23/70\r
+f 7/22/7 71/21/71 6/24/6\r
+f 8/20/8 71/21/71 7/22/7\r
+f 8/20/8 73/17/73 72/19/72\r
+f 9/18/9 73/17/73 8/20/8\r
+f 10/15/10 73/17/73 9/18/9\r
+f 10/15/10 75/13/75 74/16/74\r
+f 11/14/11 75/13/75 10/15/10\r
+f 12/11/12 75/13/75 11/14/11\r
+f 12/11/12 77/9/77 76/12/76\r
+f 13/10/13 77/9/77 12/11/12\r
+f 14/7/14 77/9/77 13/10/13\r
+f 14/7/14 79/5/79 78/8/78\r
+f 15/6/15 79/5/79 14/7/14\r
+f 16/3/16 79/5/79 15/6/15\r
+f 16/3/16 81/1/81 80/4/80\r
+f 17/2/17 81/1/81 16/3/16\r
+f 18/127/18 81/129/81 17/130/17\r
+f 18/127/18 83/125/83 82/128/82\r
+f 19/126/19 83/125/83 18/127/18\r
+f 20/123/20 83/125/83 19/126/19\r
+f 20/123/20 85/121/85 84/124/84\r
+f 21/122/21 85/121/85 20/123/20\r
+f 22/119/22 85/121/85 21/122/21\r
+f 22/119/22 87/117/87 86/120/86\r
+f 23/118/23 87/117/87 22/119/22\r
+f 24/115/24 87/117/87 23/118/23\r
+f 24/115/24 89/113/89 88/116/88\r
+f 25/114/25 89/113/89 24/115/24\r
+f 26/111/26 89/113/89 25/114/25\r
+f 26/111/26 91/109/91 90/112/90\r
+f 27/110/27 91/109/91 26/111/26\r
+f 28/107/28 91/109/91 27/110/27\r
+f 28/107/28 93/105/93 92/108/92\r
+f 29/106/29 93/105/93 28/107/28\r
+f 30/103/30 93/105/93 29/106/29\r
+f 30/103/30 95/101/95 94/104/94\r
+f 31/102/31 95/101/95 30/103/30\r
+f 32/99/32 95/101/95 31/102/31\r
+f 32/99/32 97/97/97 96/100/96\r
+f 33/98/33 97/97/97 32/99/32\r
+f 34/95/34 97/97/97 33/98/33\r
+f 34/95/34 99/93/99 98/96/98\r
+f 35/94/35 99/93/99 34/95/34\r
+f 36/91/36 99/93/99 35/94/35\r
+f 36/91/36 101/89/101 100/92/100\r
+f 37/90/37 101/89/101 36/91/36\r
+f 38/87/38 101/89/101 37/90/37\r
+f 38/87/38 103/85/103 102/88/102\r
+f 39/86/39 103/85/103 38/87/38\r
+f 40/84/40 103/85/103 39/86/39\r
+f 40/84/40 105/82/105 104/83/104\r
+f 41/81/41 105/82/105 40/84/40\r
+f 42/80/42 105/82/105 41/81/41\r
+f 42/80/42 107/77/107 106/79/106\r
+f 43/78/43 107/77/107 42/80/42\r
+f 44/76/44 107/77/107 43/78/43\r
+f 44/76/44 109/73/109 108/75/108\r
+f 45/74/45 109/73/109 44/76/44\r
+f 46/72/46 109/73/109 45/74/45\r
+f 46/72/46 111/69/111 110/71/110\r
+f 47/70/47 111/69/111 46/72/46\r
+f 48/68/48 111/69/111 47/70/47\r
+f 48/68/48 113/65/113 112/67/112\r
+f 49/66/49 113/65/113 48/68/48\r
+f 50/63/50 113/65/113 49/66/49\r
+f 50/63/50 115/61/115 114/64/114\r
+f 51/62/51 115/61/115 50/63/50\r
+f 52/59/52 115/61/115 51/62/51\r
+f 52/59/52 117/57/117 116/60/116\r
+f 53/58/53 117/57/117 52/59/52\r
+f 54/55/54 117/57/117 53/58/53\r
+f 54/55/54 119/53/119 118/56/118\r
+f 55/54/55 119/53/119 54/55/54\r
+f 56/52/56 119/53/119 55/54/55\r
+f 56/52/56 121/49/121 120/51/120\r
+f 57/50/57 121/49/121 56/52/56\r
+f 58/48/58 121/49/121 57/50/57\r
+f 58/48/58 123/45/123 122/47/122\r
+f 59/46/59 123/45/123 58/48/58\r
+f 60/43/60 123/45/123 59/46/59\r
+f 60/43/60 125/41/125 124/44/124\r
+f 61/42/61 125/41/125 60/43/60\r
+f 62/40/62 125/41/125 61/42/61\r
+f 62/40/62 127/37/127 126/39/126\r
+f 63/38/63 127/37/127 62/40/62\r
+f 64/35/64 65/33/65 128/36/128\r
+f 64/35/64 127/37/127 63/38/63\r
+f 66/31/66 65/33/65 2/32/2\r
+f 68/27/68 67/29/67 4/28/4\r
+f 70/23/70 69/25/69 6/24/6\r
+f 72/19/72 71/21/71 8/20/8\r
+f 74/16/74 73/17/73 10/15/10\r
+f 76/12/76 75/13/75 12/11/12\r
+f 78/8/78 77/9/77 14/7/14\r
+f 80/4/80 79/5/79 16/3/16\r
+f 82/128/82 81/129/81 18/127/18\r
+f 84/124/84 83/125/83 20/123/20\r
+f 86/120/86 85/121/85 22/119/22\r
+f 88/116/88 87/117/87 24/115/24\r
+f 90/112/90 89/113/89 26/111/26\r
+f 92/108/92 91/109/91 28/107/28\r
+f 94/104/94 93/105/93 30/103/30\r
+f 96/100/96 95/101/95 32/99/32\r
+f 98/96/98 97/97/97 34/95/34\r
+f 100/92/100 99/93/99 36/91/36\r
+f 102/88/102 101/89/101 38/87/38\r
+f 104/83/104 103/85/103 40/84/40\r
+f 106/79/106 105/82/105 42/80/42\r
+f 108/75/108 107/77/107 44/76/44\r
+f 110/71/110 109/73/109 46/72/46\r
+f 112/67/112 111/69/111 48/68/48\r
+f 114/64/114 113/65/113 50/63/50\r
+f 116/60/116 115/61/115 52/59/52\r
+f 118/56/118 117/57/117 54/55/54\r
+f 120/51/120 119/53/119 56/52/56\r
+f 122/47/122 121/49/121 58/48/58\r
+f 124/44/124 123/45/123 60/43/60\r
+f 126/39/126 125/41/125 62/40/62\r
+f 128/36/128 127/37/127 64/35/64\r
diff --git a/data/geom/beam/beam.png b/data/geom/beam/beam.png
new file mode 100644 (file)
index 0000000..04bbb2b
Binary files /dev/null and b/data/geom/beam/beam.png differ
diff --git a/data/geom/beam/beam.wings b/data/geom/beam/beam.wings
new file mode 100644 (file)
index 0000000..341b635
Binary files /dev/null and b/data/geom/beam/beam.wings differ
diff --git a/data/geom/flag/flag.map b/data/geom/flag/flag.map
new file mode 100644 (file)
index 0000000..74dc238
--- /dev/null
@@ -0,0 +1,4 @@
+{
+"classname" "worldspawn"
+"model" "geom/flag/flag.obj"
+}
diff --git a/data/geom/flag/flag.mtl b/data/geom/flag/flag.mtl
new file mode 100644 (file)
index 0000000..58b079a
--- /dev/null
@@ -0,0 +1,19 @@
+# Exported from Wings 3D 1.4.1\r
+newmtl mtrl/red\r
+Ns 100.0\r
+d 1.0\r
+illum 2\r
+Kd 1.0 0.0 0.0\r
+Ka 1.0 1.0 1.0\r
+Ks 1.0 1.0 1.0\r
+Ke 0.0 0.0 0.0\r
+\r
+newmtl mtrl/white\r
+Ns 100.0\r
+d 1.0\r
+illum 2\r
+Kd 1.0 1.0 1.0\r
+Ka 1.0 1.0 1.0\r
+Ks 1.0 1.0 1.0\r
+Ke 0.0 0.0 0.0\r
+\r
diff --git a/data/geom/flag/flag.obj b/data/geom/flag/flag.obj
new file mode 100644 (file)
index 0000000..f9e76bc
--- /dev/null
@@ -0,0 +1,476 @@
+# Exported from Wings 3D 1.4.1\r
+mtllib flag.mtl\r
+o cylinder1\r
+#49 vertices, 94 faces\r
+v 1.2500000e-2 3.00000000 4.7772658e-19\r
+v 1.1548494e-2 3.00000000 4.7835429e-3\r
+v 8.8388348e-3 3.00000000 8.8388348e-3\r
+v 4.7835429e-3 3.00000000 1.1548494e-2\r
+v 6.4627287e-21 3.00000000 1.2500000e-2\r
+v -4.7835429e-3 3.00000000 1.1548494e-2\r
+v -8.8388348e-3 3.00000000 8.8388348e-3\r
+v -1.1548494e-2 3.00000000 4.7835429e-3\r
+v -1.2500000e-2 3.00000000 2.0085351e-18\r
+v -1.1548494e-2 3.00000000 -4.7835429e-3\r
+v -8.8388348e-3 3.00000000 -8.8388348e-3\r
+v -4.7835429e-3 3.00000000 -1.1548494e-2\r
+v -3.0551543e-18 3.00000000 -1.2500000e-2\r
+v 4.7835429e-3 3.00000000 -1.1548494e-2\r
+v 8.8388348e-3 3.00000000 -8.8388348e-3\r
+v 1.1548494e-2 3.00000000 -4.7835429e-3\r
+v 1.2500000e-2 0.0000000e+0 4.7772658e-19\r
+v 1.1548494e-2 0.0000000e+0 4.7835429e-3\r
+v 8.8388348e-3 0.0000000e+0 8.8388348e-3\r
+v 4.7835429e-3 0.0000000e+0 1.1548494e-2\r
+v 6.4627287e-21 0.0000000e+0 1.2500000e-2\r
+v -4.7835429e-3 0.0000000e+0 1.1548494e-2\r
+v -8.8388348e-3 0.0000000e+0 8.8388348e-3\r
+v -1.1548494e-2 0.0000000e+0 4.7835429e-3\r
+v -1.2500000e-2 0.0000000e+0 2.0085351e-18\r
+v -1.1548494e-2 0.0000000e+0 -4.7835429e-3\r
+v -8.8388348e-3 0.0000000e+0 -8.8388348e-3\r
+v -4.7835429e-3 0.0000000e+0 -1.1548494e-2\r
+v -3.0551543e-18 0.0000000e+0 -1.2500000e-2\r
+v 4.7835429e-3 0.0000000e+0 -1.1548494e-2\r
+v 8.8388348e-3 0.0000000e+0 -8.8388348e-3\r
+v 1.1548494e-2 0.0000000e+0 -4.7835429e-3\r
+v 1.2500000e-2 2.50335000 4.7772658e-19\r
+v 1.1548494e-2 2.50335000 4.7835429e-3\r
+v 8.8388348e-3 2.50335000 8.8388348e-3\r
+v 4.7835429e-3 2.50335000 1.1548494e-2\r
+v 6.4627287e-21 2.50335000 1.2500000e-2\r
+v -4.7835429e-3 2.50335000 1.1548494e-2\r
+v -8.8388348e-3 2.50335000 8.8388348e-3\r
+v -1.1548494e-2 2.50335000 4.7835429e-3\r
+v -1.2500000e-2 2.50335000 2.0085351e-18\r
+v -1.1548494e-2 2.50335000 -4.7835429e-3\r
+v -8.8388348e-3 2.50335000 -8.8388348e-3\r
+v -4.7835429e-3 2.50335000 -1.1548494e-2\r
+v -3.0551543e-18 2.50335000 -1.2500000e-2\r
+v 4.7835429e-3 2.50335000 -1.1548494e-2\r
+v 8.8388348e-3 2.50335000 -8.8388348e-3\r
+v 1.1548494e-2 2.50335000 -4.7835429e-3\r
+v 0.81374768 2.75167500 -2.1684043e-19\r
+vt 0.0000000e+0 3.5125839e-5\r
+vt 2.9469936e-4 0.99993695\r
+vt 9.7432183e-4 2.8057961e-5\r
+vt 1.9486742e-3 2.3109579e-5\r
+vt 2.9229849e-3 1.8161670e-5\r
+vt 3.8971636e-3 0.0000000e+0\r
+vt 5.2035517e-3 1.00000000\r
+vt 6.7155612e-3 0.50006971\r
+vt 8.3413460e-3 0.50006923\r
+vt 9.9672776e-3 0.50005595\r
+vt 1.0113395e-2 0.99999645\r
+vt 1.1593168e-2 0.50004268\r
+vt 1.3219003e-2 0.50001661\r
+vt 1.5023197e-2 0.99999289\r
+vt 1.9933928e-2 1.00000000\r
+vt 1.9933928e-2 3.5125839e-5\r
+vt 2.0228628e-2 0.99993695\r
+vt 2.0908250e-2 2.8057961e-5\r
+vt 2.1882602e-2 2.3109579e-5\r
+vt 2.2856913e-2 1.8161670e-5\r
+vt 2.3831092e-2 0.0000000e+0\r
+vt 2.5137480e-2 1.00000000\r
+vt 2.6649490e-2 0.50006971\r
+vt 2.8275274e-2 0.50006923\r
+vt 2.9901206e-2 0.50005595\r
+vt 3.0047323e-2 0.99999645\r
+vt 3.1527096e-2 0.50004268\r
+vt 3.3152931e-2 0.50001661\r
+vt 3.4957125e-2 0.99999289\r
+vt 3.9867857e-2 3.5125839e-5\r
+vt 3.9867857e-2 1.00000000\r
+vt 4.0162556e-2 0.99993695\r
+vt 4.0842178e-2 2.8057961e-5\r
+vt 4.1816531e-2 2.3109579e-5\r
+vt 4.2790842e-2 1.8161670e-5\r
+vt 4.3765020e-2 0.0000000e+0\r
+vt 4.5071408e-2 1.00000000\r
+vt 4.6583418e-2 0.50006971\r
+vt 4.8209203e-2 0.50006923\r
+vt 4.9835134e-2 0.50005595\r
+vt 4.9981252e-2 0.99999645\r
+vt 5.1461024e-2 0.50004268\r
+vt 5.3086860e-2 0.50001661\r
+vt 5.4891053e-2 0.99999289\r
+vt 5.9801785e-2 0.49108183\r
+vt 5.9801785e-2 1.00000000\r
+vt 6.1104796e-2 3.0511289e-6\r
+vt 6.1597856e-2 0.98124397\r
+vt 6.2396127e-2 0.98124949\r
+vt 6.3016552e-2 2.1368669e-6\r
+vt 6.4307862e-2 0.98123786\r
+vt 6.4615121e-2 0.49110363\r
+vt 6.4619433e-2 0.49092702\r
+vt 6.4928317e-2 1.1898399e-6\r
+vt 6.6219572e-2 0.98122594\r
+vt 6.6840067e-2 0.0000000e+0\r
+vt 6.7017595e-2 0.98122168\r
+vt 6.8751758e-2 3.0511289e-6\r
+vt 6.9434428e-2 4.9461914e-3\r
+vt 6.9434428e-2 1.3678863e-2\r
+vt 6.9434428e-2 0.30800898\r
+vt 6.9434428e-2 0.49091130\r
+vt 6.9434428e-2 1.1785673e-2\r
+vt 6.9434428e-2 0.20989894\r
+vt 6.9810921e-2 6.8390404e-3\r
+vt 6.9810959e-2 3.0533500e-3\r
+vt 7.0883116e-2 8.4437276e-3\r
+vt 7.0883186e-2 1.4486844e-3\r
+vt 7.2487782e-2 9.5159538e-3\r
+vt 7.2487874e-2 3.7649046e-4\r
+vt 7.4380624e-2 9.8924824e-3\r
+vt 7.4380724e-2 0.0000000e+0\r
+vt 7.6273473e-2 9.5159902e-3\r
+vt 7.6273565e-2 3.7653025e-4\r
+vt 7.7878160e-2 8.4437949e-3\r
+vt 7.7878231e-2 1.4487579e-3\r
+vt 7.8950387e-2 6.8391284e-3\r
+vt 7.8950425e-2 3.0534460e-3\r
+vt 7.9309924e-2 4.9462908e-3\r
+vt 0.38637873 0.40611903\r
+vt 0.38637873 1.8617454e-2\r
+vt 0.38637873 0.11178890\r
+vt 0.38637873 0.20989894\r
+vt 0.38675466 1.6727537e-2\r
+vt 0.38675466 2.0507371e-2\r
+vt 0.38782521 1.5125343e-2\r
+vt 0.38782521 2.2109565e-2\r
+vt 0.38942741 1.4054791e-2\r
+vt 0.38942741 2.3180117e-2\r
+vt 0.39131732 1.3678863e-2\r
+vt 0.39131732 2.3556044e-2\r
+vt 0.39320724 1.4054791e-2\r
+vt 0.39320724 2.3180117e-2\r
+vt 0.39480943 1.5125343e-2\r
+vt 0.39480943 2.2109565e-2\r
+vt 0.39587999 1.6727537e-2\r
+vt 0.39587999 2.0507371e-2\r
+vt 0.39625591 1.8617454e-2\r
+vt 0.40085191 1.1785673e-2\r
+vt 0.40121099 9.8924824e-3\r
+vt 0.40121099 1.3678863e-2\r
+vt 0.41068323 4.9496270e-3\r
+vn 0.70710678 0.0000000e+0 0.70710678\r
+vn 0.38268343 0.0000000e+0 0.92387953\r
+vn 9.1972853e-17 0.0000000e+0 1.00000000\r
+vn -0.38268343 0.0000000e+0 0.92387953\r
+vn -0.70710678 0.0000000e+0 0.70710678\r
+vn -0.92387953 0.0000000e+0 0.38268343\r
+vn -1.00000000 0.0000000e+0 1.4149670e-17\r
+vn -0.92387953 0.0000000e+0 -0.38268343\r
+vn -0.70710678 0.0000000e+0 -0.70710678\r
+vn -0.38268343 0.0000000e+0 -0.92387953\r
+vn 7.0748349e-18 0.0000000e+0 -1.00000000\r
+vn 0.38268343 0.0000000e+0 -0.92387953\r
+vn 0.70710678 0.0000000e+0 -0.70710678\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.29603158 0.95517815 -2.5370834e-15\r
+vn 0.29603158 0.95517815 -2.5370834e-15\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 5.9629303e-3 0.0000000e+0 0.99998222\r
+vn 0.29551968 0.95352647 5.8782520e-2\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.83146961 0.0000000e+0 0.55557023\r
+vn 0.70710678 0.0000000e+0 0.70710678\r
+vn 0.70710678 0.0000000e+0 0.70710678\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.70710678 0.0000000e+0 0.70710678\r
+vn 0.70710678 0.0000000e+0 0.70710678\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.38268343 0.0000000e+0 0.92387953\r
+vn 0.38268343 0.0000000e+0 0.92387953\r
+vn 7.7823184e-17 0.0000000e+0 1.00000000\r
+vn 7.7823184e-17 0.0000000e+0 1.00000000\r
+vn 0.0000000e+0 1.00000000 -6.3108872e-30\r
+vn 0.0000000e+0 1.00000000 -6.3108872e-30\r
+vn 0.0000000e+0 1.00000000 -6.3108872e-30\r
+vn 8.4898018e-17 0.0000000e+0 1.00000000\r
+vn 7.7823184e-17 0.0000000e+0 1.00000000\r
+vn 0.0000000e+0 1.00000000 2.6764936e-15\r
+vn 0.0000000e+0 1.00000000 2.6764936e-15\r
+vn 0.0000000e+0 1.00000000 2.6764936e-15\r
+vn -0.38268343 0.0000000e+0 0.92387953\r
+vn -0.38268343 0.0000000e+0 0.92387953\r
+vn -0.70710678 0.0000000e+0 0.70710678\r
+vn -0.70710678 0.0000000e+0 0.70710678\r
+vn 0.0000000e+0 1.00000000 -3.7851336e-15\r
+vn 0.0000000e+0 1.00000000 -3.7851336e-15\r
+vn 0.0000000e+0 1.00000000 -3.7851336e-15\r
+vn -0.70710678 0.0000000e+0 0.70710678\r
+vn -0.70710678 0.0000000e+0 0.70710678\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn -0.92387953 0.0000000e+0 0.38268343\r
+vn -0.92387953 0.0000000e+0 0.38268343\r
+vn -1.00000000 0.0000000e+0 -7.0748349e-18\r
+vn -1.00000000 0.0000000e+0 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn -1.00000000 0.0000000e+0 7.0748349e-18\r
+vn -1.00000000 0.0000000e+0 -7.0748349e-18\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn -0.92387953 0.0000000e+0 -0.38268343\r
+vn -0.92387953 0.0000000e+0 -0.38268343\r
+vn -0.70710678 0.0000000e+0 -0.70710678\r
+vn -0.70710678 0.0000000e+0 -0.70710678\r
+vn 0.0000000e+0 1.00000000 -1.6132136e-14\r
+vn 0.0000000e+0 1.00000000 -1.6132136e-14\r
+vn 0.0000000e+0 1.00000000 -1.6132136e-14\r
+vn -0.70710678 0.0000000e+0 -0.70710678\r
+vn -0.70710678 0.0000000e+0 -0.70710678\r
+vn 0.0000000e+0 1.00000000 -3.7851336e-15\r
+vn 0.0000000e+0 1.00000000 -3.7851336e-15\r
+vn 0.0000000e+0 1.00000000 -3.7851336e-15\r
+vn -0.38268343 0.0000000e+0 -0.92387953\r
+vn -0.38268343 0.0000000e+0 -0.92387953\r
+vn -9.9047688e-17 0.0000000e+0 -1.00000000\r
+vn -9.9047688e-17 0.0000000e+0 -1.00000000\r
+vn 0.0000000e+0 1.00000000 -6.3108872e-30\r
+vn 0.0000000e+0 1.00000000 -6.3108872e-30\r
+vn 0.0000000e+0 1.00000000 -6.3108872e-30\r
+vn -9.9047688e-17 0.0000000e+0 -1.00000000\r
+vn -9.9047688e-17 0.0000000e+0 -1.00000000\r
+vn 0.0000000e+0 1.00000000 9.6705086e-15\r
+vn 0.0000000e+0 1.00000000 9.6705086e-15\r
+vn 0.0000000e+0 1.00000000 9.6705086e-15\r
+vn 0.38268343 0.0000000e+0 -0.92387953\r
+vn 0.38268343 0.0000000e+0 -0.92387953\r
+vn 0.70710678 0.0000000e+0 -0.70710678\r
+vn 0.70710678 0.0000000e+0 -0.70710678\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.70710678 0.0000000e+0 -0.70710678\r
+vn 0.70710678 0.0000000e+0 -0.70710678\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.29551968 0.95352647 -5.8782520e-2\r
+vn 5.9629303e-3 0.0000000e+0 -0.99998222\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.83146961 0.0000000e+0 -0.55557023\r
+vn 1.00000000 0.0000000e+0 -2.0517021e-16\r
+vn 1.00000000 0.0000000e+0 -2.0517021e-16\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 1.00000000 0.0000000e+0 -2.0517021e-16\r
+vn 1.00000000 0.0000000e+0 -2.0517021e-16\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.92387953 0.0000000e+0 0.38268343\r
+vn 0.92387953 0.0000000e+0 0.38268343\r
+vn 0.70710678 0.0000000e+0 0.70710678\r
+vn 0.70710678 0.0000000e+0 0.70710678\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.70710678 0.0000000e+0 0.70710678\r
+vn 0.70710678 0.0000000e+0 0.70710678\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.38268343 0.0000000e+0 0.92387953\r
+vn 0.38268343 0.0000000e+0 0.92387953\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 2.1224505e-17 0.0000000e+0 1.00000000\r
+vn 2.8299339e-17 0.0000000e+0 1.00000000\r
+vn 2.1224505e-17 0.0000000e+0 1.00000000\r
+vn 3.5374174e-17 0.0000000e+0 1.00000000\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn -0.38268343 0.0000000e+0 0.92387953\r
+vn -0.38268343 0.0000000e+0 0.92387953\r
+vn -0.70710678 0.0000000e+0 0.70710678\r
+vn -0.70710678 0.0000000e+0 0.70710678\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn -0.70710678 0.0000000e+0 0.70710678\r
+vn -0.70710678 0.0000000e+0 0.70710678\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn -0.92387953 0.0000000e+0 0.38268343\r
+vn -0.92387953 0.0000000e+0 0.38268343\r
+vn -1.00000000 0.0000000e+0 0.0000000e+0\r
+vn -1.00000000 0.0000000e+0 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn -1.00000000 0.0000000e+0 0.0000000e+0\r
+vn -1.00000000 0.0000000e+0 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn -0.92387953 0.0000000e+0 -0.38268343\r
+vn -0.92387953 0.0000000e+0 -0.38268343\r
+vn -0.70710678 0.0000000e+0 -0.70710678\r
+vn -0.70710678 0.0000000e+0 -0.70710678\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn -0.70710678 0.0000000e+0 -0.70710678\r
+vn -0.70710678 0.0000000e+0 -0.70710678\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn -0.38268343 0.0000000e+0 -0.92387953\r
+vn -0.38268343 0.0000000e+0 -0.92387953\r
+vn -1.1319736e-16 0.0000000e+0 -1.00000000\r
+vn -1.2027219e-16 0.0000000e+0 -1.00000000\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn -1.1319736e-16 0.0000000e+0 -1.00000000\r
+vn -1.2027219e-16 0.0000000e+0 -1.00000000\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.38268343 0.0000000e+0 -0.92387953\r
+vn 0.38268343 0.0000000e+0 -0.92387953\r
+vn 0.70710678 0.0000000e+0 -0.70710678\r
+vn 0.70710678 0.0000000e+0 -0.70710678\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.70710678 0.0000000e+0 -0.70710678\r
+vn 0.70710678 0.0000000e+0 -0.70710678\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 -1.00000000 0.0000000e+0\r
+vn 0.92387953 0.0000000e+0 -0.38268343\r
+vn 0.92387953 0.0000000e+0 -0.38268343\r
+vn 0.29603158 -0.95517815 2.2069150e-15\r
+vn 1.00000000 0.0000000e+0 -2.2639472e-16\r
+vn 1.00000000 0.0000000e+0 -2.2639472e-16\r
+vn 0.29603158 -0.95517815 2.2069150e-15\r
+vn 0.89653751 0.0000000e+0 0.44296783\r
+vn 5.9629303e-3 0.0000000e+0 0.99998222\r
+vn 0.89653751 0.0000000e+0 0.44296783\r
+vn 0.89653751 0.0000000e+0 0.44296783\r
+vn 0.29551968 -0.95352647 5.8782520e-2\r
+vn 0.89653751 0.0000000e+0 0.44296783\r
+vn 0.89653751 0.0000000e+0 0.44296783\r
+vn 0.89653751 0.0000000e+0 0.44296783\r
+vn 0.29551968 -0.95352647 -5.8782520e-2\r
+vn 0.89653751 0.0000000e+0 -0.44296783\r
+vn 0.89653751 0.0000000e+0 -0.44296783\r
+vn 0.89653751 0.0000000e+0 -0.44296783\r
+vn 5.9629303e-3 0.0000000e+0 -0.99998222\r
+vn 0.89653751 0.0000000e+0 -0.44296783\r
+vn 0.89653751 0.0000000e+0 -0.44296783\r
+vn 0.89653751 0.0000000e+0 -0.44296783\r
+vn 0.29603158 -0.95517815 2.2069150e-15\r
+vn 5.9629303e-3 0.0000000e+0 0.99998222\r
+vn 0.29603158 0.95517815 -2.5370834e-15\r
+vn 0.29603158 0.95517815 -2.5370834e-15\r
+vn 5.9629303e-3 0.0000000e+0 -0.99998222\r
+vn 0.29603158 -0.95517815 2.2069150e-15\r
+g cylinder1_mtrl/red\r
+usemtl mtrl/red\r
+s 1\r
+f 16/80/100 49/61/218 48/83/210\r
+f 34/60/199 49/82/215 2/64/18\r
+s 2\r
+f 1/79/16 49/102/217 16/77/99\r
+f 2/78/19 49/102/216 1/79/15\r
+f 33/99/197 49/63/219 34/100/202\r
+f 48/101/206 49/63/214 33/99/194\r
+g cylinder1_mtrl/white\r
+usemtl mtrl/white\r
+s 1\r
+f 1/79/14 16/77/98 2/78/17\r
+f 2/78/20 16/77/102 3/76/25\r
+f 3/76/26 15/75/95 4/74/30\r
+f 4/74/31 14/73/88 5/72/37\r
+f 5/72/38 13/71/83 6/70/42\r
+f 6/70/43 12/69/76 7/68/49\r
+f 7/68/50 11/67/71 8/66/54\r
+f 8/66/55 10/65/64 9/59/60\r
+f 10/65/63 8/66/53 11/67/70\r
+f 11/67/69 7/68/48 12/69/75\r
+f 12/69/74 6/70/41 13/71/82\r
+f 13/71/81 5/72/36 14/73/87\r
+f 14/73/86 4/74/29 15/75/94\r
+f 15/75/93 3/76/24 16/77/101\r
+f 17/81/108 25/98/153 32/85/190\r
+f 18/84/113 24/96/145 17/81/106\r
+f 19/86/120 23/94/140 18/84/111\r
+f 20/88/124 22/92/133 19/86/118\r
+f 21/90/127 22/92/132 20/88/123\r
+f 23/94/139 19/86/119 22/92/134\r
+f 24/96/144 18/84/112 23/94/141\r
+f 25/98/152 17/81/107 24/96/146\r
+f 26/97/156 32/85/189 25/98/151\r
+f 27/95/163 31/87/184 26/97/157\r
+f 28/93/169 30/89/178 27/95/164\r
+f 29/91/174 30/89/177 28/93/168\r
+f 31/87/186 27/95/165 30/89/179\r
+f 32/85/191 26/97/158 31/87/185\r
+s 3\r
+f 3/52/27 34/49/205 2/45/21\r
+f 3/15/22 36/12/2 35/13/1\r
+f 4/14/33 36/12/2 3/15/28\r
+f 5/11/39 36/12/2 4/14/32\r
+f 5/11/34 38/9/4 37/10/3\r
+f 6/7/45 38/9/4 5/11/40\r
+f 7/2/51 38/9/4 6/7/44\r
+f 7/31/46 40/27/6 39/28/5\r
+f 8/29/57 40/27/6 7/31/52\r
+f 9/26/61 40/27/6 8/29/56\r
+f 9/26/58 42/24/8 41/25/7\r
+f 10/22/66 42/24/8 9/26/62\r
+f 11/17/72 42/24/8 10/22/65\r
+f 11/46/67 44/42/10 43/43/9\r
+f 12/44/78 44/42/10 11/46/73\r
+f 13/41/84 44/42/10 12/44/77\r
+f 13/41/79 46/39/12 45/40/11\r
+f 14/37/89 46/39/12 13/41/85\r
+f 15/32/97 46/39/12 14/37/90\r
+f 15/53/91 48/55/207 47/57/13\r
+f 16/62/103 48/55/211 15/53/96\r
+f 17/54/109 34/49/204 18/50/115\r
+f 17/54/104 48/55/208 33/51/195\r
+f 18/50/114 34/49/203 19/47/122\r
+f 19/47/117 34/49/200 35/48/1\r
+f 19/6/121 36/12/2 20/5/126\r
+f 20/5/125 36/12/2 21/4/131\r
+f 21/4/129 36/12/2 37/10/3\r
+f 21/4/130 38/9/4 22/3/136\r
+f 22/3/135 38/9/4 23/1/143\r
+f 23/1/138 38/9/4 39/8/5\r
+f 23/21/142 40/27/6 24/20/148\r
+f 24/20/147 40/27/6 25/19/155\r
+f 25/19/150 40/27/6 41/25/7\r
+f 25/19/154 42/24/8 26/18/160\r
+f 26/18/159 42/24/8 27/16/167\r
+f 27/16/162 42/24/8 43/23/9\r
+f 27/36/166 44/42/10 28/35/171\r
+f 28/35/170 44/42/10 29/34/176\r
+f 29/34/173 44/42/10 45/40/11\r
+f 29/34/175 46/39/12 30/33/181\r
+f 30/33/180 46/39/12 31/30/188\r
+f 31/30/183 46/39/12 47/38/13\r
+f 31/58/187 48/55/212 32/56/192\r
+f 32/56/193 48/55/213 17/54/110\r
+f 33/51/196 34/49/201 17/54/105\r
+f 35/48/1 34/49/198 3/52/23\r
+f 35/13/1 36/12/2 19/6/116\r
+f 37/10/3 36/12/2 5/11/35\r
+f 37/10/3 38/9/4 21/4/128\r
+f 39/8/5 38/9/4 7/2/47\r
+f 39/28/5 40/27/6 23/21/137\r
+f 41/25/7 40/27/6 9/26/59\r
+f 41/25/7 42/24/8 25/19/149\r
+f 43/23/9 42/24/8 11/17/68\r
+f 43/43/9 44/42/10 27/36/161\r
+f 45/40/11 44/42/10 13/41/80\r
+f 45/40/11 46/39/12 29/34/172\r
+f 47/38/13 46/39/12 15/32/92\r
+f 47/57/13 48/55/209 31/58/182\r
diff --git a/data/geom/flag/flag.wings b/data/geom/flag/flag.wings
new file mode 100644 (file)
index 0000000..1c4ee23
Binary files /dev/null and b/data/geom/flag/flag.wings differ
diff --git a/data/geom/goal/goal b/data/geom/goal/goal
new file mode 100644 (file)
index 0000000..0379dd6
--- /dev/null
@@ -0,0 +1,7 @@
+0.8 0.8 0.8 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+additive transparent two-sided
+45.0
diff --git a/data/geom/goal/goal.map b/data/geom/goal/goal.map
new file mode 100644 (file)
index 0000000..c94e8a2
--- /dev/null
@@ -0,0 +1,4 @@
+{
+"classname" "worldspawn"
+"model" "geom/goal/goal.obj"
+}
diff --git a/data/geom/goal/goal.mtl b/data/geom/goal/goal.mtl
new file mode 100644 (file)
index 0000000..052b0b3
--- /dev/null
@@ -0,0 +1,20 @@
+# Exported from Wings 3D 1.4.1\r
+newmtl default\r
+Ns 100.0\r
+d 1.0\r
+illum 2\r
+Kd 1.0 1.0 1.0\r
+Ka 1.0 1.0 1.0\r
+Ks 1.0 1.0 1.0\r
+Ke 0.0 0.0 0.0\r
+\r
+newmtl geom/goal/goal\r
+Ns 100.0\r
+d 1.0\r
+illum 2\r
+Kd 1.0 1.0 1.0\r
+Ka 1.0 1.0 1.0\r
+Ks 1.0 1.0 1.0\r
+Ke 0.0 0.0 0.0\r
+map_Kd goal.png\r
+\r
diff --git a/data/geom/goal/goal.obj b/data/geom/goal/goal.obj
new file mode 100644 (file)
index 0000000..4312787
--- /dev/null
@@ -0,0 +1,521 @@
+# Exported from Wings 3D 1.4.1\r
+mtllib goal.mtl\r
+o cylinder1\r
+#128 vertices, 128 faces\r
+v 1.00000000 1.00000000 3.6768006e-17\r
+v 0.99518473 1.00000000 9.8017140e-2\r
+v 0.98078528 1.00000000 0.19509032\r
+v 0.95694034 1.00000000 0.29028468\r
+v 0.92387953 1.00000000 0.38268343\r
+v 0.88192126 1.00000000 0.47139674\r
+v 0.83146961 1.00000000 0.55557023\r
+v 0.77301045 1.00000000 0.63439328\r
+v 0.70710678 1.00000000 0.70710678\r
+v 0.63439328 1.00000000 0.77301045\r
+v 0.55557023 1.00000000 0.83146961\r
+v 0.47139674 1.00000000 0.88192126\r
+v 0.38268343 1.00000000 0.92387953\r
+v 0.29028468 1.00000000 0.95694034\r
+v 0.19509032 1.00000000 0.98078528\r
+v 9.8017140e-2 1.00000000 0.99518473\r
+v 9.5926809e-17 1.00000000 1.00000000\r
+v -9.8017140e-2 1.00000000 0.99518473\r
+v -0.19509032 1.00000000 0.98078528\r
+v -0.29028468 1.00000000 0.95694034\r
+v -0.38268343 1.00000000 0.92387953\r
+v -0.47139674 1.00000000 0.88192126\r
+v -0.55557023 1.00000000 0.83146961\r
+v -0.63439328 1.00000000 0.77301045\r
+v -0.70710678 1.00000000 0.70710678\r
+v -0.77301045 1.00000000 0.63439328\r
+v -0.83146961 1.00000000 0.55557023\r
+v -0.88192126 1.00000000 0.47139674\r
+v -0.92387953 1.00000000 0.38268343\r
+v -0.95694034 1.00000000 0.29028468\r
+v -0.98078528 1.00000000 0.19509032\r
+v -0.99518473 1.00000000 9.8017140e-2\r
+v -1.00000000 1.00000000 1.5923269e-16\r
+v -0.99518473 1.00000000 -9.8017140e-2\r
+v -0.98078528 1.00000000 -0.19509032\r
+v -0.95694034 1.00000000 -0.29028468\r
+v -0.92387953 1.00000000 -0.38268343\r
+v -0.88192126 1.00000000 -0.47139674\r
+v -0.83146961 1.00000000 -0.55557023\r
+v -0.77301045 1.00000000 -0.63439328\r
+v -0.70710678 1.00000000 -0.70710678\r
+v -0.63439328 1.00000000 -0.77301045\r
+v -0.55557023 1.00000000 -0.83146961\r
+v -0.47139674 1.00000000 -0.88192126\r
+v -0.38268343 1.00000000 -0.92387953\r
+v -0.29028468 1.00000000 -0.95694034\r
+v -0.19509032 1.00000000 -0.98078528\r
+v -9.8017140e-2 1.00000000 -0.99518473\r
+v -1.4900255e-16 1.00000000 -1.00000000\r
+v 9.8017140e-2 1.00000000 -0.99518473\r
+v 0.19509032 1.00000000 -0.98078528\r
+v 0.29028468 1.00000000 -0.95694034\r
+v 0.38268343 1.00000000 -0.92387953\r
+v 0.47139674 1.00000000 -0.88192126\r
+v 0.55557023 1.00000000 -0.83146961\r
+v 0.63439328 1.00000000 -0.77301045\r
+v 0.70710678 1.00000000 -0.70710678\r
+v 0.77301045 1.00000000 -0.63439328\r
+v 0.83146961 1.00000000 -0.55557023\r
+v 0.88192126 1.00000000 -0.47139674\r
+v 0.92387953 1.00000000 -0.38268343\r
+v 0.95694034 1.00000000 -0.29028468\r
+v 0.98078528 1.00000000 -0.19509032\r
+v 0.99518473 1.00000000 -9.8017140e-2\r
+v 1.00000000 0.0000000e+0 4.7704896e-17\r
+v 0.99518473 0.0000000e+0 9.8017140e-2\r
+v 0.98078528 0.0000000e+0 0.19509032\r
+v 0.95694034 0.0000000e+0 0.29028468\r
+v 0.92387953 0.0000000e+0 0.38268343\r
+v 0.88192126 0.0000000e+0 0.47139674\r
+v 0.83146961 0.0000000e+0 0.55557023\r
+v 0.77301045 0.0000000e+0 0.63439328\r
+v 0.70710678 0.0000000e+0 0.70710678\r
+v 0.63439328 0.0000000e+0 0.77301045\r
+v 0.55557023 0.0000000e+0 0.83146961\r
+v 0.47139674 0.0000000e+0 0.88192126\r
+v 0.38268343 0.0000000e+0 0.92387953\r
+v 0.29028468 0.0000000e+0 0.95694034\r
+v 0.19509032 0.0000000e+0 0.98078528\r
+v 9.8017140e-2 0.0000000e+0 0.99518473\r
+v 7.8579575e-17 0.0000000e+0 1.00000000\r
+v -9.8017140e-2 0.0000000e+0 0.99518473\r
+v -0.19509032 0.0000000e+0 0.98078528\r
+v -0.29028468 0.0000000e+0 0.95694034\r
+v -0.38268343 0.0000000e+0 0.92387953\r
+v -0.47139674 0.0000000e+0 0.88192126\r
+v -0.55557023 0.0000000e+0 0.83146961\r
+v -0.63439328 0.0000000e+0 0.77301045\r
+v -0.70710678 0.0000000e+0 0.70710678\r
+v -0.77301045 0.0000000e+0 0.63439328\r
+v -0.83146961 0.0000000e+0 0.55557023\r
+v -0.88192126 0.0000000e+0 0.47139674\r
+v -0.92387953 0.0000000e+0 0.38268343\r
+v -0.95694034 0.0000000e+0 0.29028468\r
+v -0.98078528 0.0000000e+0 0.19509032\r
+v -0.99518473 0.0000000e+0 9.8017140e-2\r
+v -1.00000000 0.0000000e+0 1.7016958e-16\r
+v -0.99518473 0.0000000e+0 -9.8017140e-2\r
+v -0.98078528 0.0000000e+0 -0.19509032\r
+v -0.95694034 0.0000000e+0 -0.29028468\r
+v -0.92387953 0.0000000e+0 -0.38268343\r
+v -0.88192126 0.0000000e+0 -0.47139674\r
+v -0.83146961 0.0000000e+0 -0.55557023\r
+v -0.77301045 0.0000000e+0 -0.63439328\r
+v -0.70710678 0.0000000e+0 -0.70710678\r
+v -0.63439328 0.0000000e+0 -0.77301045\r
+v -0.55557023 0.0000000e+0 -0.83146961\r
+v -0.47139674 0.0000000e+0 -0.88192126\r
+v -0.38268343 0.0000000e+0 -0.92387953\r
+v -0.29028468 0.0000000e+0 -0.95694034\r
+v -0.19509032 0.0000000e+0 -0.98078528\r
+v -9.8017140e-2 0.0000000e+0 -0.99518473\r
+v -1.6634979e-16 0.0000000e+0 -1.00000000\r
+v 9.8017140e-2 0.0000000e+0 -0.99518473\r
+v 0.19509032 0.0000000e+0 -0.98078528\r
+v 0.29028468 0.0000000e+0 -0.95694034\r
+v 0.38268343 0.0000000e+0 -0.92387953\r
+v 0.47139674 0.0000000e+0 -0.88192126\r
+v 0.55557023 0.0000000e+0 -0.83146961\r
+v 0.63439328 0.0000000e+0 -0.77301045\r
+v 0.70710678 0.0000000e+0 -0.70710678\r
+v 0.77301045 0.0000000e+0 -0.63439328\r
+v 0.83146961 0.0000000e+0 -0.55557023\r
+v 0.88192126 0.0000000e+0 -0.47139674\r
+v 0.92387953 0.0000000e+0 -0.38268343\r
+v 0.95694034 0.0000000e+0 -0.29028468\r
+v 0.98078528 0.0000000e+0 -0.19509032\r
+v 0.99518473 0.0000000e+0 -9.8017140e-2\r
+vt -1.1045018e-15 0.42500000\r
+vt 2.4482118e-15 0.57500000\r
+vt 1.5625000e-2 0.57500000\r
+vt 1.5625000e-2 0.42500000\r
+vt 3.1250000e-2 0.42500000\r
+vt 3.1250000e-2 0.57500000\r
+vt 4.6875000e-2 0.57500000\r
+vt 4.6875000e-2 0.42500000\r
+vt 6.2500000e-2 0.42500000\r
+vt 6.2500000e-2 0.57500000\r
+vt 7.8125000e-2 0.57500000\r
+vt 7.8125000e-2 0.42500000\r
+vt 9.3750000e-2 0.42500000\r
+vt 9.3750000e-2 0.57500000\r
+vt 0.10937500 0.57500000\r
+vt 0.10937500 0.42500000\r
+vt 0.12500000 0.42500000\r
+vt 0.12500000 0.57500000\r
+vt 0.14062500 0.42500000\r
+vt 0.14062500 0.57500000\r
+vt 0.15625000 0.42500000\r
+vt 0.15625000 0.57500000\r
+vt 0.17187500 0.42500000\r
+vt 0.17187500 0.57500000\r
+vt 0.18750000 0.42500000\r
+vt 0.18750000 0.57500000\r
+vt 0.20312500 0.42500000\r
+vt 0.20312500 0.57500000\r
+vt 0.21875000 0.42500000\r
+vt 0.21875000 0.57500000\r
+vt 0.23437500 0.42500000\r
+vt 0.23437500 0.57500000\r
+vt 0.25000000 0.42500000\r
+vt 0.25000000 0.57500000\r
+vt 0.26562500 0.57500000\r
+vt 0.26562500 0.42500000\r
+vt 0.28125000 0.42500000\r
+vt 0.28125000 0.57500000\r
+vt 0.29687500 0.42500000\r
+vt 0.29687500 0.57500000\r
+vt 0.31250000 0.42500000\r
+vt 0.31250000 0.57500000\r
+vt 0.32812500 0.57500000\r
+vt 0.32812500 0.42500000\r
+vt 0.34375000 0.42500000\r
+vt 0.34375000 0.57500000\r
+vt 0.35937500 0.42500000\r
+vt 0.35937500 0.57500000\r
+vt 0.37500000 0.42500000\r
+vt 0.37500000 0.57500000\r
+vt 0.39062500 0.42500000\r
+vt 0.39062500 0.57500000\r
+vt 0.40625000 0.42500000\r
+vt 0.40625000 0.57500000\r
+vt 0.42187500 0.42500000\r
+vt 0.42187500 0.57500000\r
+vt 0.43750000 0.42500000\r
+vt 0.43750000 0.57500000\r
+vt 0.45312500 0.57500000\r
+vt 0.45312500 0.42500000\r
+vt 0.46875000 0.42500000\r
+vt 0.46875000 0.57500000\r
+vt 0.48437500 0.57500000\r
+vt 0.48437500 0.42500000\r
+vt 0.50000000 0.42500000\r
+vt 0.50000000 0.57500000\r
+vt 0.51562500 0.42500000\r
+vt 0.51562500 0.57500000\r
+vt 0.53125000 0.42500000\r
+vt 0.53125000 0.57500000\r
+vt 0.54687500 0.42500000\r
+vt 0.54687500 0.57500000\r
+vt 0.56250000 0.42500000\r
+vt 0.56250000 0.57500000\r
+vt 0.57812500 0.42500000\r
+vt 0.57812500 0.57500000\r
+vt 0.59375000 0.42500000\r
+vt 0.59375000 0.57500000\r
+vt 0.60937500 0.42500000\r
+vt 0.60937500 0.57500000\r
+vt 0.62500000 0.42500000\r
+vt 0.62500000 0.57500000\r
+vt 0.64062500 0.42500000\r
+vt 0.64062500 0.57500000\r
+vt 0.65625000 0.42500000\r
+vt 0.65625000 0.57500000\r
+vt 0.67187500 0.57500000\r
+vt 0.67187500 0.42500000\r
+vt 0.68750000 0.42500000\r
+vt 0.68750000 0.57500000\r
+vt 0.70312500 0.57500000\r
+vt 0.70312500 0.42500000\r
+vt 0.71875000 0.42500000\r
+vt 0.71875000 0.57500000\r
+vt 0.73437500 0.57500000\r
+vt 0.73437500 0.42500000\r
+vt 0.75000000 0.42500000\r
+vt 0.75000000 0.57500000\r
+vt 0.76562500 0.57500000\r
+vt 0.76562500 0.42500000\r
+vt 0.78125000 0.42500000\r
+vt 0.78125000 0.57500000\r
+vt 0.79687500 0.57500000\r
+vt 0.79687500 0.42500000\r
+vt 0.81250000 0.42500000\r
+vt 0.81250000 0.57500000\r
+vt 0.82812500 0.57500000\r
+vt 0.82812500 0.42500000\r
+vt 0.84375000 0.42500000\r
+vt 0.84375000 0.57500000\r
+vt 0.85937500 0.57500000\r
+vt 0.85937500 0.42500000\r
+vt 0.87500000 0.42500000\r
+vt 0.87500000 0.57500000\r
+vt 0.89062500 0.57500000\r
+vt 0.89062500 0.42500000\r
+vt 0.90625000 0.42500000\r
+vt 0.90625000 0.57500000\r
+vt 0.92187500 0.57500000\r
+vt 0.92187500 0.42500000\r
+vt 0.93750000 0.42500000\r
+vt 0.93750000 0.57500000\r
+vt 0.95312500 0.57500000\r
+vt 0.95312500 0.42500000\r
+vt 0.96875000 0.42500000\r
+vt 0.96875000 0.57500000\r
+vt 0.98437500 0.57500000\r
+vt 0.98437500 0.42500000\r
+vt 1.00000000 0.42500000\r
+vt 1.00000000 0.57500000\r
+vn 1.00000000 -7.4044900e-32 -1.3894524e-17\r
+vn 0.99518473 7.0792658e-17 9.8017140e-2\r
+vn 0.98078528 0.0000000e+0 0.19509032\r
+vn 0.95694034 0.0000000e+0 0.29028468\r
+vn 0.92387953 0.0000000e+0 0.38268343\r
+vn 0.88192126 0.0000000e+0 0.47139674\r
+vn 0.83146961 0.0000000e+0 0.55557023\r
+vn 0.77301045 0.0000000e+0 0.63439328\r
+vn 0.70710678 0.0000000e+0 0.70710678\r
+vn 0.63439328 0.0000000e+0 0.77301045\r
+vn 0.55557023 0.0000000e+0 0.83146961\r
+vn 0.47139674 0.0000000e+0 0.88192126\r
+vn 0.38268343 0.0000000e+0 0.92387953\r
+vn 0.29028468 -4.4245411e-18 0.95694034\r
+vn 0.19509032 -1.3273623e-17 0.98078528\r
+vn 9.8017140e-2 -2.6270713e-18 0.99518473\r
+vn 1.1358774e-15 -2.7653382e-19 1.00000000\r
+vn -9.8017140e-2 2.4888044e-18 0.99518473\r
+vn -0.19509032 4.4245411e-18 0.98078528\r
+vn -0.29028468 0.0000000e+0 0.95694034\r
+vn -0.38268343 0.0000000e+0 0.92387953\r
+vn -0.47139674 0.0000000e+0 0.88192126\r
+vn -0.55557023 0.0000000e+0 0.83146961\r
+vn -0.63439328 0.0000000e+0 0.77301045\r
+vn -0.70710678 0.0000000e+0 0.70710678\r
+vn -0.77301045 0.0000000e+0 0.63439328\r
+vn -0.83146961 0.0000000e+0 0.55557023\r
+vn -0.88192126 0.0000000e+0 0.47139674\r
+vn -0.92387953 0.0000000e+0 0.38268343\r
+vn -0.95694034 0.0000000e+0 0.29028468\r
+vn -0.98078528 0.0000000e+0 0.19509032\r
+vn -0.99518473 -1.4461895e-34 9.8017140e-2\r
+vn -1.00000000 0.0000000e+0 5.6967550e-16\r
+vn -0.99518473 0.0000000e+0 -9.8017140e-2\r
+vn -0.98078528 0.0000000e+0 -0.19509032\r
+vn -0.95694034 0.0000000e+0 -0.29028468\r
+vn -0.92387953 0.0000000e+0 -0.38268343\r
+vn -0.88192126 0.0000000e+0 -0.47139674\r
+vn -0.83146961 0.0000000e+0 -0.55557023\r
+vn -0.77301045 0.0000000e+0 -0.63439328\r
+vn -0.70710678 0.0000000e+0 -0.70710678\r
+vn -0.63439328 0.0000000e+0 -0.77301045\r
+vn -0.55557023 0.0000000e+0 -0.83146961\r
+vn -0.47139674 0.0000000e+0 -0.88192126\r
+vn -0.38268343 0.0000000e+0 -0.92387953\r
+vn -0.29028468 0.0000000e+0 -0.95694034\r
+vn -0.19509032 4.4245411e-18 -0.98078528\r
+vn -9.8017140e-2 2.6270713e-18 -0.99518473\r
+vn 0.0000000e+0 2.7653382e-19 -1.00000000\r
+vn 9.8017140e-2 -2.4888044e-18 -0.99518473\r
+vn 0.19509032 -4.4245411e-18 -0.98078528\r
+vn 0.29028468 0.0000000e+0 -0.95694034\r
+vn 0.38268343 0.0000000e+0 -0.92387953\r
+vn 0.47139674 0.0000000e+0 -0.88192126\r
+vn 0.55557023 0.0000000e+0 -0.83146961\r
+vn 0.63439328 0.0000000e+0 -0.77301045\r
+vn 0.70710678 0.0000000e+0 -0.70710678\r
+vn 0.77301045 0.0000000e+0 -0.63439328\r
+vn 0.83146961 0.0000000e+0 -0.55557023\r
+vn 0.88192126 0.0000000e+0 -0.47139674\r
+vn 0.92387953 0.0000000e+0 -0.38268343\r
+vn 0.95694034 0.0000000e+0 -0.29028468\r
+vn 0.98078528 0.0000000e+0 -0.19509032\r
+vn 0.99518473 -7.0792658e-17 -9.8017140e-2\r
+vn 1.00000000 -3.7022450e-32 -1.3894524e-17\r
+vn 0.99518473 3.8565052e-34 9.8017140e-2\r
+vn 0.98078528 -3.4088600e-19 0.19509032\r
+vn 0.95694034 0.0000000e+0 0.29028468\r
+vn 0.92387953 0.0000000e+0 0.38268343\r
+vn 0.88192126 0.0000000e+0 0.47139674\r
+vn 0.83146961 0.0000000e+0 0.55557023\r
+vn 0.77301045 0.0000000e+0 0.63439328\r
+vn 0.70710678 0.0000000e+0 0.70710678\r
+vn 0.63439328 0.0000000e+0 0.77301045\r
+vn 0.55557023 0.0000000e+0 0.83146961\r
+vn 0.47139674 0.0000000e+0 0.88192126\r
+vn 0.38268343 0.0000000e+0 0.92387953\r
+vn 0.29028468 0.0000000e+0 0.95694034\r
+vn 0.19509032 -6.6368117e-18 0.98078528\r
+vn 9.8017140e-2 -2.7653382e-19 0.99518473\r
+vn 5.7141231e-16 -1.3826691e-19 1.00000000\r
+vn -9.8017140e-2 2.7653382e-19 0.99518473\r
+vn -0.19509032 2.2122706e-18 0.98078528\r
+vn -0.29028468 0.0000000e+0 0.95694034\r
+vn -0.38268343 0.0000000e+0 0.92387953\r
+vn -0.47139674 0.0000000e+0 0.88192126\r
+vn -0.55557023 0.0000000e+0 0.83146961\r
+vn -0.63439328 0.0000000e+0 0.77301045\r
+vn -0.70710678 0.0000000e+0 0.70710678\r
+vn -0.77301045 0.0000000e+0 0.63439328\r
+vn -0.83146961 0.0000000e+0 0.55557023\r
+vn -0.88192126 0.0000000e+0 0.47139674\r
+vn -0.92387953 0.0000000e+0 0.38268343\r
+vn -0.95694034 0.0000000e+0 0.29028468\r
+vn -0.98078528 -3.4088600e-19 0.19509032\r
+vn -0.99518473 -2.8923789e-34 9.8017140e-2\r
+vn -1.00000000 7.7612168e-33 5.6446505e-16\r
+vn -0.99518473 0.0000000e+0 -9.8017140e-2\r
+vn -0.98078528 3.4088600e-19 -0.19509032\r
+vn -0.95694034 0.0000000e+0 -0.29028468\r
+vn -0.92387953 0.0000000e+0 -0.38268343\r
+vn -0.88192126 0.0000000e+0 -0.47139674\r
+vn -0.83146961 0.0000000e+0 -0.55557023\r
+vn -0.77301045 0.0000000e+0 -0.63439328\r
+vn -0.70710678 0.0000000e+0 -0.70710678\r
+vn -0.63439328 0.0000000e+0 -0.77301045\r
+vn -0.55557023 0.0000000e+0 -0.83146961\r
+vn -0.47139674 0.0000000e+0 -0.88192126\r
+vn -0.38268343 0.0000000e+0 -0.92387953\r
+vn -0.29028468 0.0000000e+0 -0.95694034\r
+vn -0.19509032 2.2122706e-18 -0.98078528\r
+vn -9.8017140e-2 2.7653382e-19 -0.99518473\r
+vn 0.0000000e+0 1.3826691e-19 -1.00000000\r
+vn 9.8017140e-2 -2.7653382e-19 -0.99518473\r
+vn 0.19509032 -2.2122706e-18 -0.98078528\r
+vn 0.29028468 0.0000000e+0 -0.95694034\r
+vn 0.38268343 0.0000000e+0 -0.92387953\r
+vn 0.47139674 0.0000000e+0 -0.88192126\r
+vn 0.55557023 0.0000000e+0 -0.83146961\r
+vn 0.63439328 0.0000000e+0 -0.77301045\r
+vn 0.70710678 0.0000000e+0 -0.70710678\r
+vn 0.77301045 0.0000000e+0 -0.63439328\r
+vn 0.83146961 0.0000000e+0 -0.55557023\r
+vn 0.88192126 0.0000000e+0 -0.47139674\r
+vn 0.92387953 0.0000000e+0 -0.38268343\r
+vn 0.95694034 0.0000000e+0 -0.29028468\r
+vn 0.98078528 3.4088600e-19 -0.19509032\r
+vn 0.99518473 -4.2421557e-33 -9.8017140e-2\r
+g cylinder1_geom/goal/goal\r
+usemtl geom/goal/goal\r
+s 1\r
+f 1/34/1 65/33/65 64/35/64\r
+f 2/32/2 65/33/65 1/34/1\r
+f 2/32/2 67/29/67 66/31/66\r
+f 3/30/3 67/29/67 2/32/2\r
+f 4/28/4 67/29/67 3/30/3\r
+f 4/28/4 69/25/69 68/27/68\r
+f 5/26/5 69/25/69 4/28/4\r
+f 6/24/6 69/25/69 5/26/5\r
+f 6/24/6 71/21/71 70/23/70\r
+f 7/22/7 71/21/71 6/24/6\r
+f 8/20/8 71/21/71 7/22/7\r
+f 8/20/8 73/17/73 72/19/72\r
+f 9/18/9 73/17/73 8/20/8\r
+f 10/15/10 73/17/73 9/18/9\r
+f 10/15/10 75/13/75 74/16/74\r
+f 11/14/11 75/13/75 10/15/10\r
+f 12/11/12 75/13/75 11/14/11\r
+f 12/11/12 77/9/77 76/12/76\r
+f 13/10/13 77/9/77 12/11/12\r
+f 14/7/14 77/9/77 13/10/13\r
+f 14/7/14 79/5/79 78/8/78\r
+f 15/6/15 79/5/79 14/7/14\r
+f 16/3/16 79/5/79 15/6/15\r
+f 16/3/16 81/1/81 80/4/80\r
+f 17/2/17 81/1/81 16/3/16\r
+f 18/127/18 81/129/81 17/130/17\r
+f 18/127/18 83/125/83 82/128/82\r
+f 19/126/19 83/125/83 18/127/18\r
+f 20/123/20 83/125/83 19/126/19\r
+f 20/123/20 85/121/85 84/124/84\r
+f 21/122/21 85/121/85 20/123/20\r
+f 22/119/22 85/121/85 21/122/21\r
+f 22/119/22 87/117/87 86/120/86\r
+f 23/118/23 87/117/87 22/119/22\r
+f 24/115/24 87/117/87 23/118/23\r
+f 24/115/24 89/113/89 88/116/88\r
+f 25/114/25 89/113/89 24/115/24\r
+f 26/111/26 89/113/89 25/114/25\r
+f 26/111/26 91/109/91 90/112/90\r
+f 27/110/27 91/109/91 26/111/26\r
+f 28/107/28 91/109/91 27/110/27\r
+f 28/107/28 93/105/93 92/108/92\r
+f 29/106/29 93/105/93 28/107/28\r
+f 30/103/30 93/105/93 29/106/29\r
+f 30/103/30 95/101/95 94/104/94\r
+f 31/102/31 95/101/95 30/103/30\r
+f 32/99/32 95/101/95 31/102/31\r
+f 32/99/32 97/97/97 96/100/96\r
+f 33/98/33 97/97/97 32/99/32\r
+f 34/95/34 97/97/97 33/98/33\r
+f 34/95/34 99/93/99 98/96/98\r
+f 35/94/35 99/93/99 34/95/34\r
+f 36/91/36 99/93/99 35/94/35\r
+f 36/91/36 101/89/101 100/92/100\r
+f 37/90/37 101/89/101 36/91/36\r
+f 38/87/38 101/89/101 37/90/37\r
+f 38/87/38 103/85/103 102/88/102\r
+f 39/86/39 103/85/103 38/87/38\r
+f 40/84/40 103/85/103 39/86/39\r
+f 40/84/40 105/81/105 104/83/104\r
+f 41/82/41 105/81/105 40/84/40\r
+f 42/80/42 105/81/105 41/82/41\r
+f 42/80/42 107/77/107 106/79/106\r
+f 43/78/43 107/77/107 42/80/42\r
+f 44/76/44 107/77/107 43/78/43\r
+f 44/76/44 109/73/109 108/75/108\r
+f 45/74/45 109/73/109 44/76/44\r
+f 46/72/46 109/73/109 45/74/45\r
+f 46/72/46 111/69/111 110/71/110\r
+f 47/70/47 111/69/111 46/72/46\r
+f 48/68/48 111/69/111 47/70/47\r
+f 48/68/48 113/65/113 112/67/112\r
+f 49/66/49 113/65/113 48/68/48\r
+f 50/63/50 113/65/113 49/66/49\r
+f 50/63/50 115/61/115 114/64/114\r
+f 51/62/51 115/61/115 50/63/50\r
+f 52/59/52 115/61/115 51/62/51\r
+f 52/59/52 117/57/117 116/60/116\r
+f 53/58/53 117/57/117 52/59/52\r
+f 54/56/54 117/57/117 53/58/53\r
+f 54/56/54 119/53/119 118/55/118\r
+f 55/54/55 119/53/119 54/56/54\r
+f 56/52/56 119/53/119 55/54/55\r
+f 56/52/56 121/49/121 120/51/120\r
+f 57/50/57 121/49/121 56/52/56\r
+f 58/48/58 121/49/121 57/50/57\r
+f 58/48/58 123/45/123 122/47/122\r
+f 59/46/59 123/45/123 58/48/58\r
+f 60/43/60 123/45/123 59/46/59\r
+f 60/43/60 125/41/125 124/44/124\r
+f 61/42/61 125/41/125 60/43/60\r
+f 62/40/62 125/41/125 61/42/61\r
+f 62/40/62 127/37/127 126/39/126\r
+f 63/38/63 127/37/127 62/40/62\r
+f 64/35/64 65/33/65 128/36/128\r
+f 64/35/64 127/37/127 63/38/63\r
+f 66/31/66 65/33/65 2/32/2\r
+f 68/27/68 67/29/67 4/28/4\r
+f 70/23/70 69/25/69 6/24/6\r
+f 72/19/72 71/21/71 8/20/8\r
+f 74/16/74 73/17/73 10/15/10\r
+f 76/12/76 75/13/75 12/11/12\r
+f 78/8/78 77/9/77 14/7/14\r
+f 80/4/80 79/5/79 16/3/16\r
+f 82/128/82 81/129/81 18/127/18\r
+f 84/124/84 83/125/83 20/123/20\r
+f 86/120/86 85/121/85 22/119/22\r
+f 88/116/88 87/117/87 24/115/24\r
+f 90/112/90 89/113/89 26/111/26\r
+f 92/108/92 91/109/91 28/107/28\r
+f 94/104/94 93/105/93 30/103/30\r
+f 96/100/96 95/101/95 32/99/32\r
+f 98/96/98 97/97/97 34/95/34\r
+f 100/92/100 99/93/99 36/91/36\r
+f 102/88/102 101/89/101 38/87/38\r
+f 104/83/104 103/85/103 40/84/40\r
+f 106/79/106 105/81/105 42/80/42\r
+f 108/75/108 107/77/107 44/76/44\r
+f 110/71/110 109/73/109 46/72/46\r
+f 112/67/112 111/69/111 48/68/48\r
+f 114/64/114 113/65/113 50/63/50\r
+f 116/60/116 115/61/115 52/59/52\r
+f 118/55/118 117/57/117 54/56/54\r
+f 120/51/120 119/53/119 56/52/56\r
+f 122/47/122 121/49/121 58/48/58\r
+f 124/44/124 123/45/123 60/43/60\r
+f 126/39/126 125/41/125 62/40/62\r
+f 128/36/128 127/37/127 64/35/64\r
diff --git a/data/geom/goal/goal.png b/data/geom/goal/goal.png
new file mode 100644 (file)
index 0000000..d55a665
Binary files /dev/null and b/data/geom/goal/goal.png differ
diff --git a/data/geom/goal/goal.wings b/data/geom/goal/goal.wings
new file mode 100644 (file)
index 0000000..3d4135f
Binary files /dev/null and b/data/geom/goal/goal.wings differ
diff --git a/data/geom/jump/jump b/data/geom/jump/jump
new file mode 100644 (file)
index 0000000..740fa37
--- /dev/null
@@ -0,0 +1,7 @@
+0.8 0.8 0.8 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+additive clamp-t transparent two-sided
+45.0
diff --git a/data/geom/jump/jump.map b/data/geom/jump/jump.map
new file mode 100644 (file)
index 0000000..b7d3c2e
--- /dev/null
@@ -0,0 +1,4 @@
+{
+"classname" "worldspawn"
+"model" "geom/jump/jump.obj"
+}
diff --git a/data/geom/jump/jump.mtl b/data/geom/jump/jump.mtl
new file mode 100644 (file)
index 0000000..d4a84f5
--- /dev/null
@@ -0,0 +1,20 @@
+# Exported from Wings 3D 1.4.1\r
+newmtl default\r
+Ns 100.0\r
+d 1.0\r
+illum 2\r
+Kd 1.0 1.0 1.0\r
+Ka 1.0 1.0 1.0\r
+Ks 1.0 1.0 1.0\r
+Ke 0.0 0.0 0.0\r
+\r
+newmtl geom/jump/jump\r
+Ns 100.0\r
+d 1.0\r
+illum 2\r
+Kd 1.0 1.0 1.0\r
+Ka 1.0 1.0 1.0\r
+Ks 1.0 1.0 1.0\r
+Ke 0.0 0.0 0.0\r
+map_Kd jump.png\r
+\r
diff --git a/data/geom/jump/jump.obj b/data/geom/jump/jump.obj
new file mode 100644 (file)
index 0000000..87ee0ed
--- /dev/null
@@ -0,0 +1,521 @@
+# Exported from Wings 3D 1.4.1\r
+mtllib jump.mtl\r
+o cylinder1\r
+#128 vertices, 128 faces\r
+v 1.00000000 1.00000000 3.6768006e-17\r
+v 0.99518473 1.00000000 9.8017140e-2\r
+v 0.98078528 1.00000000 0.19509032\r
+v 0.95694034 1.00000000 0.29028468\r
+v 0.92387953 1.00000000 0.38268343\r
+v 0.88192126 1.00000000 0.47139674\r
+v 0.83146961 1.00000000 0.55557023\r
+v 0.77301045 1.00000000 0.63439328\r
+v 0.70710678 1.00000000 0.70710678\r
+v 0.63439328 1.00000000 0.77301045\r
+v 0.55557023 1.00000000 0.83146961\r
+v 0.47139674 1.00000000 0.88192126\r
+v 0.38268343 1.00000000 0.92387953\r
+v 0.29028468 1.00000000 0.95694034\r
+v 0.19509032 1.00000000 0.98078528\r
+v 9.8017140e-2 1.00000000 0.99518473\r
+v 9.5926809e-17 1.00000000 1.00000000\r
+v -9.8017140e-2 1.00000000 0.99518473\r
+v -0.19509032 1.00000000 0.98078528\r
+v -0.29028468 1.00000000 0.95694034\r
+v -0.38268343 1.00000000 0.92387953\r
+v -0.47139674 1.00000000 0.88192126\r
+v -0.55557023 1.00000000 0.83146961\r
+v -0.63439328 1.00000000 0.77301045\r
+v -0.70710678 1.00000000 0.70710678\r
+v -0.77301045 1.00000000 0.63439328\r
+v -0.83146961 1.00000000 0.55557023\r
+v -0.88192126 1.00000000 0.47139674\r
+v -0.92387953 1.00000000 0.38268343\r
+v -0.95694034 1.00000000 0.29028468\r
+v -0.98078528 1.00000000 0.19509032\r
+v -0.99518473 1.00000000 9.8017140e-2\r
+v -1.00000000 1.00000000 1.5923269e-16\r
+v -0.99518473 1.00000000 -9.8017140e-2\r
+v -0.98078528 1.00000000 -0.19509032\r
+v -0.95694034 1.00000000 -0.29028468\r
+v -0.92387953 1.00000000 -0.38268343\r
+v -0.88192126 1.00000000 -0.47139674\r
+v -0.83146961 1.00000000 -0.55557023\r
+v -0.77301045 1.00000000 -0.63439328\r
+v -0.70710678 1.00000000 -0.70710678\r
+v -0.63439328 1.00000000 -0.77301045\r
+v -0.55557023 1.00000000 -0.83146961\r
+v -0.47139674 1.00000000 -0.88192126\r
+v -0.38268343 1.00000000 -0.92387953\r
+v -0.29028468 1.00000000 -0.95694034\r
+v -0.19509032 1.00000000 -0.98078528\r
+v -9.8017140e-2 1.00000000 -0.99518473\r
+v -1.4900255e-16 1.00000000 -1.00000000\r
+v 9.8017140e-2 1.00000000 -0.99518473\r
+v 0.19509032 1.00000000 -0.98078528\r
+v 0.29028468 1.00000000 -0.95694034\r
+v 0.38268343 1.00000000 -0.92387953\r
+v 0.47139674 1.00000000 -0.88192126\r
+v 0.55557023 1.00000000 -0.83146961\r
+v 0.63439328 1.00000000 -0.77301045\r
+v 0.70710678 1.00000000 -0.70710678\r
+v 0.77301045 1.00000000 -0.63439328\r
+v 0.83146961 1.00000000 -0.55557023\r
+v 0.88192126 1.00000000 -0.47139674\r
+v 0.92387953 1.00000000 -0.38268343\r
+v 0.95694034 1.00000000 -0.29028468\r
+v 0.98078528 1.00000000 -0.19509032\r
+v 0.99518473 1.00000000 -9.8017140e-2\r
+v 1.00000000 0.0000000e+0 4.7704896e-17\r
+v 0.99518473 0.0000000e+0 9.8017140e-2\r
+v 0.98078528 0.0000000e+0 0.19509032\r
+v 0.95694034 0.0000000e+0 0.29028468\r
+v 0.92387953 0.0000000e+0 0.38268343\r
+v 0.88192126 0.0000000e+0 0.47139674\r
+v 0.83146961 0.0000000e+0 0.55557023\r
+v 0.77301045 0.0000000e+0 0.63439328\r
+v 0.70710678 0.0000000e+0 0.70710678\r
+v 0.63439328 0.0000000e+0 0.77301045\r
+v 0.55557023 0.0000000e+0 0.83146961\r
+v 0.47139674 0.0000000e+0 0.88192126\r
+v 0.38268343 0.0000000e+0 0.92387953\r
+v 0.29028468 0.0000000e+0 0.95694034\r
+v 0.19509032 0.0000000e+0 0.98078528\r
+v 9.8017140e-2 0.0000000e+0 0.99518473\r
+v 7.8579575e-17 0.0000000e+0 1.00000000\r
+v -9.8017140e-2 0.0000000e+0 0.99518473\r
+v -0.19509032 0.0000000e+0 0.98078528\r
+v -0.29028468 0.0000000e+0 0.95694034\r
+v -0.38268343 0.0000000e+0 0.92387953\r
+v -0.47139674 0.0000000e+0 0.88192126\r
+v -0.55557023 0.0000000e+0 0.83146961\r
+v -0.63439328 0.0000000e+0 0.77301045\r
+v -0.70710678 0.0000000e+0 0.70710678\r
+v -0.77301045 0.0000000e+0 0.63439328\r
+v -0.83146961 0.0000000e+0 0.55557023\r
+v -0.88192126 0.0000000e+0 0.47139674\r
+v -0.92387953 0.0000000e+0 0.38268343\r
+v -0.95694034 0.0000000e+0 0.29028468\r
+v -0.98078528 0.0000000e+0 0.19509032\r
+v -0.99518473 0.0000000e+0 9.8017140e-2\r
+v -1.00000000 0.0000000e+0 1.7016958e-16\r
+v -0.99518473 0.0000000e+0 -9.8017140e-2\r
+v -0.98078528 0.0000000e+0 -0.19509032\r
+v -0.95694034 0.0000000e+0 -0.29028468\r
+v -0.92387953 0.0000000e+0 -0.38268343\r
+v -0.88192126 0.0000000e+0 -0.47139674\r
+v -0.83146961 0.0000000e+0 -0.55557023\r
+v -0.77301045 0.0000000e+0 -0.63439328\r
+v -0.70710678 0.0000000e+0 -0.70710678\r
+v -0.63439328 0.0000000e+0 -0.77301045\r
+v -0.55557023 0.0000000e+0 -0.83146961\r
+v -0.47139674 0.0000000e+0 -0.88192126\r
+v -0.38268343 0.0000000e+0 -0.92387953\r
+v -0.29028468 0.0000000e+0 -0.95694034\r
+v -0.19509032 0.0000000e+0 -0.98078528\r
+v -9.8017140e-2 0.0000000e+0 -0.99518473\r
+v -1.6634979e-16 0.0000000e+0 -1.00000000\r
+v 9.8017140e-2 0.0000000e+0 -0.99518473\r
+v 0.19509032 0.0000000e+0 -0.98078528\r
+v 0.29028468 0.0000000e+0 -0.95694034\r
+v 0.38268343 0.0000000e+0 -0.92387953\r
+v 0.47139674 0.0000000e+0 -0.88192126\r
+v 0.55557023 0.0000000e+0 -0.83146961\r
+v 0.63439328 0.0000000e+0 -0.77301045\r
+v 0.70710678 0.0000000e+0 -0.70710678\r
+v 0.77301045 0.0000000e+0 -0.63439328\r
+v 0.83146961 0.0000000e+0 -0.55557023\r
+v 0.88192126 0.0000000e+0 -0.47139674\r
+v 0.92387953 0.0000000e+0 -0.38268343\r
+v 0.95694034 0.0000000e+0 -0.29028468\r
+v 0.98078528 0.0000000e+0 -0.19509032\r
+v 0.99518473 0.0000000e+0 -9.8017140e-2\r
+vt 0.45000000 1.1268764e-14\r
+vt 0.45000000 1.00000000\r
+vt 0.45156250 1.00000000\r
+vt 0.45156250 2.1593838e-14\r
+vt 0.45312500 6.1062266e-15\r
+vt 0.45312500 1.00000000\r
+vt 0.45468750 1.00000000\r
+vt 0.45468750 2.3536728e-14\r
+vt 0.45625000 9.0483177e-15\r
+vt 0.45625000 1.00000000\r
+vt 0.45781250 1.00000000\r
+vt 0.45781250 1.9872992e-14\r
+vt 0.45937500 9.0483177e-15\r
+vt 0.45937500 1.00000000\r
+vt 0.46093750 1.00000000\r
+vt 0.46093750 2.1482816e-14\r
+vt 0.46250000 5.3290705e-15\r
+vt 0.46250000 1.00000000\r
+vt 0.46406250 2.1205260e-14\r
+vt 0.46406250 1.00000000\r
+vt 0.46562500 7.4384943e-15\r
+vt 0.46562500 1.00000000\r
+vt 0.46718750 2.0428104e-14\r
+vt 0.46718750 1.00000000\r
+vt 0.46875000 9.1593400e-15\r
+vt 0.46875000 1.00000000\r
+vt 0.47031250 1.6597834e-14\r
+vt 0.47031250 1.00000000\r
+vt 0.47187500 8.3266727e-15\r
+vt 0.47187500 1.00000000\r
+vt 0.47343750 1.5376589e-14\r
+vt 0.47343750 1.00000000\r
+vt 0.47500000 1.2156942e-14\r
+vt 0.47500000 1.00000000\r
+vt 0.47656250 1.00000000\r
+vt 0.47656250 1.2601031e-14\r
+vt 0.47812500 9.6589403e-15\r
+vt 0.47812500 1.00000000\r
+vt 0.47968750 1.5987212e-14\r
+vt 0.47968750 1.00000000\r
+vt 0.48125000 7.9936058e-15\r
+vt 0.48125000 1.00000000\r
+vt 0.48281250 1.00000000\r
+vt 0.48281250 1.4821477e-14\r
+vt 0.48437500 1.1268764e-14\r
+vt 0.48437500 1.00000000\r
+vt 0.48593750 1.2712054e-14\r
+vt 0.48593750 1.00000000\r
+vt 0.48750000 7.8270723e-15\r
+vt 0.48750000 1.00000000\r
+vt 0.48906250 1.3489210e-14\r
+vt 0.48906250 1.00000000\r
+vt 0.49062500 7.5495166e-15\r
+vt 0.49062500 1.00000000\r
+vt 0.49218750 1.00000000\r
+vt 0.49218750 1.1546319e-14\r
+vt 0.49375000 1.1879386e-14\r
+vt 0.49375000 1.00000000\r
+vt 0.49531250 1.00000000\r
+vt 0.49531250 7.8270723e-15\r
+vt 0.49687500 9.9364961e-15\r
+vt 0.49687500 1.00000000\r
+vt 0.49843750 1.00000000\r
+vt 0.49843750 1.0380585e-14\r
+vt 0.50000000 8.6042284e-15\r
+vt 0.50000000 1.00000000\r
+vt 0.50156250 6.7723605e-15\r
+vt 0.50156250 1.00000000\r
+vt 0.50312500 1.0991208e-14\r
+vt 0.50312500 1.00000000\r
+vt 0.50468750 4.6074256e-15\r
+vt 0.50468750 1.00000000\r
+vt 0.50625000 7.7160500e-15\r
+vt 0.50625000 1.00000000\r
+vt 0.50781250 6.1062266e-15\r
+vt 0.50781250 1.00000000\r
+vt 0.50937500 6.4948047e-15\r
+vt 0.50937500 1.00000000\r
+vt 0.51093750 5.3290705e-15\r
+vt 0.51093750 1.00000000\r
+vt 0.51250000 1.00000000\r
+vt 0.51250000 8.4376950e-15\r
+vt 0.51406250 3.5527137e-15\r
+vt 0.51406250 1.00000000\r
+vt 0.51562500 1.0713652e-14\r
+vt 0.51562500 1.00000000\r
+vt 0.51718750 1.00000000\r
+vt 0.51718750 2.1094237e-15\r
+vt 0.51875000 1.0047518e-14\r
+vt 0.51875000 1.00000000\r
+vt 0.52031250 1.00000000\r
+vt 0.52031250 3.1641356e-15\r
+vt 0.52187500 1.0491608e-14\r
+vt 0.52187500 1.00000000\r
+vt 0.52343750 1.00000000\r
+vt 0.52343750 5.3290705e-15\r
+vt 0.52500000 1.2712054e-14\r
+vt 0.52500000 1.00000000\r
+vt 0.52656250 1.00000000\r
+vt 0.52656250 3.1641356e-15\r
+vt 0.52812500 1.0214052e-14\r
+vt 0.52812500 1.00000000\r
+vt 0.52968750 1.00000000\r
+vt 0.52968750 3.7192471e-15\r
+vt 0.53125000 9.7699626e-15\r
+vt 0.53125000 1.00000000\r
+vt 0.53281250 1.00000000\r
+vt 0.53281250 4.8849813e-15\r
+vt 0.53437500 1.1546319e-14\r
+vt 0.53437500 1.00000000\r
+vt 0.53593750 1.00000000\r
+vt 0.53593750 3.1641356e-15\r
+vt 0.53750000 8.8817842e-15\r
+vt 0.53750000 1.00000000\r
+vt 0.53906250 1.00000000\r
+vt 0.53906250 1.7763568e-15\r
+vt 0.54062500 1.2156942e-14\r
+vt 0.54062500 1.00000000\r
+vt 0.54218750 1.00000000\r
+vt 0.54218750 0.0000000e+0\r
+vt 0.54375000 1.0713652e-14\r
+vt 0.54375000 1.00000000\r
+vt 0.54531250 1.00000000\r
+vt 0.54531250 1.5543122e-15\r
+vt 0.54687500 1.1879386e-14\r
+vt 0.54687500 1.00000000\r
+vt 0.54843750 1.00000000\r
+vt 0.54843750 3.1641356e-15\r
+vt 0.55000000 1.1268764e-14\r
+vt 0.55000000 1.00000000\r
+vn 1.00000000 -7.4044900e-32 -1.3894524e-17\r
+vn 0.99518473 7.0792658e-17 9.8017140e-2\r
+vn 0.98078528 0.0000000e+0 0.19509032\r
+vn 0.95694034 0.0000000e+0 0.29028468\r
+vn 0.92387953 0.0000000e+0 0.38268343\r
+vn 0.88192126 0.0000000e+0 0.47139674\r
+vn 0.83146961 0.0000000e+0 0.55557023\r
+vn 0.77301045 0.0000000e+0 0.63439328\r
+vn 0.70710678 0.0000000e+0 0.70710678\r
+vn 0.63439328 0.0000000e+0 0.77301045\r
+vn 0.55557023 0.0000000e+0 0.83146961\r
+vn 0.47139674 0.0000000e+0 0.88192126\r
+vn 0.38268343 0.0000000e+0 0.92387953\r
+vn 0.29028468 -4.4245411e-18 0.95694034\r
+vn 0.19509032 -1.3273623e-17 0.98078528\r
+vn 9.8017140e-2 -2.6270713e-18 0.99518473\r
+vn 1.1358774e-15 -2.7653382e-19 1.00000000\r
+vn -9.8017140e-2 2.4888044e-18 0.99518473\r
+vn -0.19509032 4.4245411e-18 0.98078528\r
+vn -0.29028468 0.0000000e+0 0.95694034\r
+vn -0.38268343 0.0000000e+0 0.92387953\r
+vn -0.47139674 0.0000000e+0 0.88192126\r
+vn -0.55557023 0.0000000e+0 0.83146961\r
+vn -0.63439328 0.0000000e+0 0.77301045\r
+vn -0.70710678 0.0000000e+0 0.70710678\r
+vn -0.77301045 0.0000000e+0 0.63439328\r
+vn -0.83146961 0.0000000e+0 0.55557023\r
+vn -0.88192126 0.0000000e+0 0.47139674\r
+vn -0.92387953 0.0000000e+0 0.38268343\r
+vn -0.95694034 0.0000000e+0 0.29028468\r
+vn -0.98078528 0.0000000e+0 0.19509032\r
+vn -0.99518473 -1.4461895e-34 9.8017140e-2\r
+vn -1.00000000 0.0000000e+0 5.6967550e-16\r
+vn -0.99518473 0.0000000e+0 -9.8017140e-2\r
+vn -0.98078528 0.0000000e+0 -0.19509032\r
+vn -0.95694034 0.0000000e+0 -0.29028468\r
+vn -0.92387953 0.0000000e+0 -0.38268343\r
+vn -0.88192126 0.0000000e+0 -0.47139674\r
+vn -0.83146961 0.0000000e+0 -0.55557023\r
+vn -0.77301045 0.0000000e+0 -0.63439328\r
+vn -0.70710678 0.0000000e+0 -0.70710678\r
+vn -0.63439328 0.0000000e+0 -0.77301045\r
+vn -0.55557023 0.0000000e+0 -0.83146961\r
+vn -0.47139674 0.0000000e+0 -0.88192126\r
+vn -0.38268343 0.0000000e+0 -0.92387953\r
+vn -0.29028468 0.0000000e+0 -0.95694034\r
+vn -0.19509032 4.4245411e-18 -0.98078528\r
+vn -9.8017140e-2 2.6270713e-18 -0.99518473\r
+vn 0.0000000e+0 2.7653382e-19 -1.00000000\r
+vn 9.8017140e-2 -2.4888044e-18 -0.99518473\r
+vn 0.19509032 -4.4245411e-18 -0.98078528\r
+vn 0.29028468 0.0000000e+0 -0.95694034\r
+vn 0.38268343 0.0000000e+0 -0.92387953\r
+vn 0.47139674 0.0000000e+0 -0.88192126\r
+vn 0.55557023 0.0000000e+0 -0.83146961\r
+vn 0.63439328 0.0000000e+0 -0.77301045\r
+vn 0.70710678 0.0000000e+0 -0.70710678\r
+vn 0.77301045 0.0000000e+0 -0.63439328\r
+vn 0.83146961 0.0000000e+0 -0.55557023\r
+vn 0.88192126 0.0000000e+0 -0.47139674\r
+vn 0.92387953 0.0000000e+0 -0.38268343\r
+vn 0.95694034 0.0000000e+0 -0.29028468\r
+vn 0.98078528 0.0000000e+0 -0.19509032\r
+vn 0.99518473 -7.0792658e-17 -9.8017140e-2\r
+vn 1.00000000 -3.7022450e-32 -1.3894524e-17\r
+vn 0.99518473 3.8565052e-34 9.8017140e-2\r
+vn 0.98078528 -3.4088600e-19 0.19509032\r
+vn 0.95694034 0.0000000e+0 0.29028468\r
+vn 0.92387953 0.0000000e+0 0.38268343\r
+vn 0.88192126 0.0000000e+0 0.47139674\r
+vn 0.83146961 0.0000000e+0 0.55557023\r
+vn 0.77301045 0.0000000e+0 0.63439328\r
+vn 0.70710678 0.0000000e+0 0.70710678\r
+vn 0.63439328 0.0000000e+0 0.77301045\r
+vn 0.55557023 0.0000000e+0 0.83146961\r
+vn 0.47139674 0.0000000e+0 0.88192126\r
+vn 0.38268343 0.0000000e+0 0.92387953\r
+vn 0.29028468 0.0000000e+0 0.95694034\r
+vn 0.19509032 -6.6368117e-18 0.98078528\r
+vn 9.8017140e-2 -2.7653382e-19 0.99518473\r
+vn 5.7141231e-16 -1.3826691e-19 1.00000000\r
+vn -9.8017140e-2 2.7653382e-19 0.99518473\r
+vn -0.19509032 2.2122706e-18 0.98078528\r
+vn -0.29028468 0.0000000e+0 0.95694034\r
+vn -0.38268343 0.0000000e+0 0.92387953\r
+vn -0.47139674 0.0000000e+0 0.88192126\r
+vn -0.55557023 0.0000000e+0 0.83146961\r
+vn -0.63439328 0.0000000e+0 0.77301045\r
+vn -0.70710678 0.0000000e+0 0.70710678\r
+vn -0.77301045 0.0000000e+0 0.63439328\r
+vn -0.83146961 0.0000000e+0 0.55557023\r
+vn -0.88192126 0.0000000e+0 0.47139674\r
+vn -0.92387953 0.0000000e+0 0.38268343\r
+vn -0.95694034 0.0000000e+0 0.29028468\r
+vn -0.98078528 -3.4088600e-19 0.19509032\r
+vn -0.99518473 -2.8923789e-34 9.8017140e-2\r
+vn -1.00000000 7.7612168e-33 5.6446505e-16\r
+vn -0.99518473 0.0000000e+0 -9.8017140e-2\r
+vn -0.98078528 3.4088600e-19 -0.19509032\r
+vn -0.95694034 0.0000000e+0 -0.29028468\r
+vn -0.92387953 0.0000000e+0 -0.38268343\r
+vn -0.88192126 0.0000000e+0 -0.47139674\r
+vn -0.83146961 0.0000000e+0 -0.55557023\r
+vn -0.77301045 0.0000000e+0 -0.63439328\r
+vn -0.70710678 0.0000000e+0 -0.70710678\r
+vn -0.63439328 0.0000000e+0 -0.77301045\r
+vn -0.55557023 0.0000000e+0 -0.83146961\r
+vn -0.47139674 0.0000000e+0 -0.88192126\r
+vn -0.38268343 0.0000000e+0 -0.92387953\r
+vn -0.29028468 0.0000000e+0 -0.95694034\r
+vn -0.19509032 2.2122706e-18 -0.98078528\r
+vn -9.8017140e-2 2.7653382e-19 -0.99518473\r
+vn 0.0000000e+0 1.3826691e-19 -1.00000000\r
+vn 9.8017140e-2 -2.7653382e-19 -0.99518473\r
+vn 0.19509032 -2.2122706e-18 -0.98078528\r
+vn 0.29028468 0.0000000e+0 -0.95694034\r
+vn 0.38268343 0.0000000e+0 -0.92387953\r
+vn 0.47139674 0.0000000e+0 -0.88192126\r
+vn 0.55557023 0.0000000e+0 -0.83146961\r
+vn 0.63439328 0.0000000e+0 -0.77301045\r
+vn 0.70710678 0.0000000e+0 -0.70710678\r
+vn 0.77301045 0.0000000e+0 -0.63439328\r
+vn 0.83146961 0.0000000e+0 -0.55557023\r
+vn 0.88192126 0.0000000e+0 -0.47139674\r
+vn 0.92387953 0.0000000e+0 -0.38268343\r
+vn 0.95694034 0.0000000e+0 -0.29028468\r
+vn 0.98078528 3.4088600e-19 -0.19509032\r
+vn 0.99518473 -4.2421557e-33 -9.8017140e-2\r
+g cylinder1_geom/jump/jump\r
+usemtl geom/jump/jump\r
+s 1\r
+f 1/34/1 65/33/65 64/35/64\r
+f 2/32/2 65/33/65 1/34/1\r
+f 2/32/2 67/29/67 66/31/66\r
+f 3/30/3 67/29/67 2/32/2\r
+f 4/28/4 67/29/67 3/30/3\r
+f 4/28/4 69/25/69 68/27/68\r
+f 5/26/5 69/25/69 4/28/4\r
+f 6/24/6 69/25/69 5/26/5\r
+f 6/24/6 71/21/71 70/23/70\r
+f 7/22/7 71/21/71 6/24/6\r
+f 8/20/8 71/21/71 7/22/7\r
+f 8/20/8 73/17/73 72/19/72\r
+f 9/18/9 73/17/73 8/20/8\r
+f 10/15/10 73/17/73 9/18/9\r
+f 10/15/10 75/13/75 74/16/74\r
+f 11/14/11 75/13/75 10/15/10\r
+f 12/11/12 75/13/75 11/14/11\r
+f 12/11/12 77/9/77 76/12/76\r
+f 13/10/13 77/9/77 12/11/12\r
+f 14/7/14 77/9/77 13/10/13\r
+f 14/7/14 79/5/79 78/8/78\r
+f 15/6/15 79/5/79 14/7/14\r
+f 16/3/16 79/5/79 15/6/15\r
+f 16/3/16 81/1/81 80/4/80\r
+f 17/2/17 81/1/81 16/3/16\r
+f 18/127/18 81/129/81 17/130/17\r
+f 18/127/18 83/125/83 82/128/82\r
+f 19/126/19 83/125/83 18/127/18\r
+f 20/123/20 83/125/83 19/126/19\r
+f 20/123/20 85/121/85 84/124/84\r
+f 21/122/21 85/121/85 20/123/20\r
+f 22/119/22 85/121/85 21/122/21\r
+f 22/119/22 87/117/87 86/120/86\r
+f 23/118/23 87/117/87 22/119/22\r
+f 24/115/24 87/117/87 23/118/23\r
+f 24/115/24 89/113/89 88/116/88\r
+f 25/114/25 89/113/89 24/115/24\r
+f 26/111/26 89/113/89 25/114/25\r
+f 26/111/26 91/109/91 90/112/90\r
+f 27/110/27 91/109/91 26/111/26\r
+f 28/107/28 91/109/91 27/110/27\r
+f 28/107/28 93/105/93 92/108/92\r
+f 29/106/29 93/105/93 28/107/28\r
+f 30/103/30 93/105/93 29/106/29\r
+f 30/103/30 95/101/95 94/104/94\r
+f 31/102/31 95/101/95 30/103/30\r
+f 32/99/32 95/101/95 31/102/31\r
+f 32/99/32 97/97/97 96/100/96\r
+f 33/98/33 97/97/97 32/99/32\r
+f 34/95/34 97/97/97 33/98/33\r
+f 34/95/34 99/93/99 98/96/98\r
+f 35/94/35 99/93/99 34/95/34\r
+f 36/91/36 99/93/99 35/94/35\r
+f 36/91/36 101/89/101 100/92/100\r
+f 37/90/37 101/89/101 36/91/36\r
+f 38/87/38 101/89/101 37/90/37\r
+f 38/87/38 103/85/103 102/88/102\r
+f 39/86/39 103/85/103 38/87/38\r
+f 40/84/40 103/85/103 39/86/39\r
+f 40/84/40 105/82/105 104/83/104\r
+f 41/81/41 105/82/105 40/84/40\r
+f 42/80/42 105/82/105 41/81/41\r
+f 42/80/42 107/77/107 106/79/106\r
+f 43/78/43 107/77/107 42/80/42\r
+f 44/76/44 107/77/107 43/78/43\r
+f 44/76/44 109/73/109 108/75/108\r
+f 45/74/45 109/73/109 44/76/44\r
+f 46/72/46 109/73/109 45/74/45\r
+f 46/72/46 111/69/111 110/71/110\r
+f 47/70/47 111/69/111 46/72/46\r
+f 48/68/48 111/69/111 47/70/47\r
+f 48/68/48 113/65/113 112/67/112\r
+f 49/66/49 113/65/113 48/68/48\r
+f 50/63/50 113/65/113 49/66/49\r
+f 50/63/50 115/61/115 114/64/114\r
+f 51/62/51 115/61/115 50/63/50\r
+f 52/59/52 115/61/115 51/62/51\r
+f 52/59/52 117/57/117 116/60/116\r
+f 53/58/53 117/57/117 52/59/52\r
+f 54/55/54 117/57/117 53/58/53\r
+f 54/55/54 119/53/119 118/56/118\r
+f 55/54/55 119/53/119 54/55/54\r
+f 56/52/56 119/53/119 55/54/55\r
+f 56/52/56 121/49/121 120/51/120\r
+f 57/50/57 121/49/121 56/52/56\r
+f 58/48/58 121/49/121 57/50/57\r
+f 58/48/58 123/45/123 122/47/122\r
+f 59/46/59 123/45/123 58/48/58\r
+f 60/43/60 123/45/123 59/46/59\r
+f 60/43/60 125/41/125 124/44/124\r
+f 61/42/61 125/41/125 60/43/60\r
+f 62/40/62 125/41/125 61/42/61\r
+f 62/40/62 127/37/127 126/39/126\r
+f 63/38/63 127/37/127 62/40/62\r
+f 64/35/64 65/33/65 128/36/128\r
+f 64/35/64 127/37/127 63/38/63\r
+f 66/31/66 65/33/65 2/32/2\r
+f 68/27/68 67/29/67 4/28/4\r
+f 70/23/70 69/25/69 6/24/6\r
+f 72/19/72 71/21/71 8/20/8\r
+f 74/16/74 73/17/73 10/15/10\r
+f 76/12/76 75/13/75 12/11/12\r
+f 78/8/78 77/9/77 14/7/14\r
+f 80/4/80 79/5/79 16/3/16\r
+f 82/128/82 81/129/81 18/127/18\r
+f 84/124/84 83/125/83 20/123/20\r
+f 86/120/86 85/121/85 22/119/22\r
+f 88/116/88 87/117/87 24/115/24\r
+f 90/112/90 89/113/89 26/111/26\r
+f 92/108/92 91/109/91 28/107/28\r
+f 94/104/94 93/105/93 30/103/30\r
+f 96/100/96 95/101/95 32/99/32\r
+f 98/96/98 97/97/97 34/95/34\r
+f 100/92/100 99/93/99 36/91/36\r
+f 102/88/102 101/89/101 38/87/38\r
+f 104/83/104 103/85/103 40/84/40\r
+f 106/79/106 105/82/105 42/80/42\r
+f 108/75/108 107/77/107 44/76/44\r
+f 110/71/110 109/73/109 46/72/46\r
+f 112/67/112 111/69/111 48/68/48\r
+f 114/64/114 113/65/113 50/63/50\r
+f 116/60/116 115/61/115 52/59/52\r
+f 118/56/118 117/57/117 54/55/54\r
+f 120/51/120 119/53/119 56/52/56\r
+f 122/47/122 121/49/121 58/48/58\r
+f 124/44/124 123/45/123 60/43/60\r
+f 126/39/126 125/41/125 62/40/62\r
+f 128/36/128 127/37/127 64/35/64\r
diff --git a/data/geom/jump/jump.png b/data/geom/jump/jump.png
new file mode 100644 (file)
index 0000000..3fa622e
Binary files /dev/null and b/data/geom/jump/jump.png differ
diff --git a/data/geom/jump/jump.wings b/data/geom/jump/jump.wings
new file mode 100644 (file)
index 0000000..9964df0
Binary files /dev/null and b/data/geom/jump/jump.wings differ
diff --git a/data/geom/mark/mark.map b/data/geom/mark/mark.map
new file mode 100644 (file)
index 0000000..531781b
--- /dev/null
@@ -0,0 +1,4 @@
+{
+"classname" "worldspawn"
+"model" "geom/mark/mark.obj"
+}
diff --git a/data/geom/mark/mark.mtl b/data/geom/mark/mark.mtl
new file mode 100644 (file)
index 0000000..48f5512
--- /dev/null
@@ -0,0 +1,19 @@
+# Exported from Wings 3D 1.4.1\r
+newmtl default\r
+Ns 100.0\r
+d 1.0\r
+illum 2\r
+Kd 1.0 1.0 1.0\r
+Ka 1.0 1.0 1.0\r
+Ks 1.0 1.0 1.0\r
+Ke 0.0 0.0 0.0\r
+\r
+newmtl mtrl/white\r
+Ns 100.0\r
+d 1.0\r
+illum 2\r
+Kd 1.0 1.0 1.0\r
+Ka 1.0 1.0 1.0\r
+Ks 1.0 1.0 1.0\r
+Ke 0.0 0.0 0.0\r
+\r
diff --git a/data/geom/mark/mark.obj b/data/geom/mark/mark.obj
new file mode 100644 (file)
index 0000000..a10a9cf
--- /dev/null
@@ -0,0 +1,95 @@
+# Exported from Wings 3D 1.4.1\r
+mtllib mark.mtl\r
+o cylinder2\r
+#16 vertices, 14 faces\r
+v 1.00000000 0.0000000e+0 3.1225023e-17\r
+v 0.92387953 0.0000000e+0 0.38268343\r
+v 0.70710678 0.0000000e+0 0.70710678\r
+v 0.38268343 0.0000000e+0 0.92387953\r
+v 1.0286570e-16 0.0000000e+0 1.00000000\r
+v -0.38268343 0.0000000e+0 0.92387953\r
+v -0.70710678 0.0000000e+0 0.70710678\r
+v -0.92387953 0.0000000e+0 0.38268343\r
+v -1.00000000 0.0000000e+0 1.5368970e-16\r
+v -0.92387953 0.0000000e+0 -0.38268343\r
+v -0.70710678 0.0000000e+0 -0.70710678\r
+v -0.38268343 0.0000000e+0 -0.92387953\r
+v -1.4206366e-16 0.0000000e+0 -1.00000000\r
+v 0.38268343 0.0000000e+0 -0.92387953\r
+v 0.70710678 0.0000000e+0 -0.70710678\r
+v 0.92387953 0.0000000e+0 -0.38268343\r
+vt 0.0000000e+0 0.50000000\r
+vt 3.8060234e-2 0.69134172\r
+vt 3.8060234e-2 0.30865828\r
+vt 0.14644661 0.85355339\r
+vt 0.14644661 0.14644661\r
+vt 0.30865828 0.96193977\r
+vt 0.30865828 3.8060234e-2\r
+vt 0.50000000 1.00000000\r
+vt 0.50000000 0.0000000e+0\r
+vt 0.69134172 3.8060234e-2\r
+vt 0.69134172 0.96193977\r
+vt 0.85355339 0.85355339\r
+vt 0.85355339 0.14644661\r
+vt 0.96193977 0.69134172\r
+vt 0.96193977 0.30865828\r
+vt 1.00000000 0.50000000\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+vn 0.0000000e+0 1.00000000 0.0000000e+0\r
+g cylinder2_mtrl/white\r
+usemtl mtrl/default\r
+s 2\r
+f 1/16/3 9/1/23 2/15/5\r
+f 2/15/4 8/3/20 3/13/9\r
+f 3/13/7 7/5/17 4/10/12\r
+f 4/10/10 6/7/14 5/9/13\r
+f 6/7/15 4/10/11 7/5/16\r
+f 7/5/18 3/13/8 8/3/19\r
+f 8/3/21 2/15/6 9/1/24\r
+f 9/1/22 1/16/2 10/2/26\r
+f 10/2/27 16/14/42 11/4/29\r
+f 11/4/30 15/12/39 12/6/32\r
+f 12/6/33 14/11/36 13/8/34\r
+f 14/11/35 12/6/31 15/12/38\r
+f 15/12/37 11/4/28 16/14/41\r
+f 16/14/40 10/2/25 1/16/1\r
diff --git a/data/geom/mark/mark.wings b/data/geom/mark/mark.wings
new file mode 100644 (file)
index 0000000..33be257
Binary files /dev/null and b/data/geom/mark/mark.wings differ
diff --git a/data/geom/vect/vect b/data/geom/vect/vect
new file mode 100644 (file)
index 0000000..081d77c
--- /dev/null
@@ -0,0 +1,7 @@
+0.8 0.8 0.8 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+clamp-s clamp-t transparent
+45.0
diff --git a/data/geom/vect/vect.map b/data/geom/vect/vect.map
new file mode 100644 (file)
index 0000000..03bab7f
--- /dev/null
@@ -0,0 +1,4 @@
+{
+"classname" "worldspawn"
+"model" "geom/vect/vect.obj"
+}
diff --git a/data/geom/vect/vect.mtl b/data/geom/vect/vect.mtl
new file mode 100644 (file)
index 0000000..c5302eb
--- /dev/null
@@ -0,0 +1,11 @@
+# Exported from Wings 3D 1.4.1\r
+newmtl geom/vect/vect\r
+Ns 100.0\r
+d 1.0\r
+illum 2\r
+Kd 1.0 1.0 1.0\r
+Ka 1.0 1.0 1.0\r
+Ks 1.0 1.0 1.0\r
+Ke 0.0 0.0 0.0\r
+map_Kd vect.png\r
+\r
diff --git a/data/geom/vect/vect.obj b/data/geom/vect/vect.obj
new file mode 100644 (file)
index 0000000..1fd889f
--- /dev/null
@@ -0,0 +1,51 @@
+# Exported from Wings 3D 1.4.1\r
+mtllib vect.mtl\r
+o cube1\r
+#5 vertices, 6 faces\r
+v -1.00000000 -1.00000000 0.0000000e+0\r
+v -1.00000000 1.00000000 0.0000000e+0\r
+v 1.00000000 1.00000000 0.0000000e+0\r
+v 1.00000000 -1.00000000 0.0000000e+0\r
+v 0.0000000e+0 0.0000000e+0 2.00000000\r
+vt -1.3877788e-17 1.00000000\r
+vt 1.3877788e-17 1.00000000\r
+vt 2.7755576e-17 1.00000000\r
+vt 5.5511151e-17 4.4408921e-16\r
+vt 7.6327833e-17 1.00000000\r
+vt 2.2859681e-16 1.00000000\r
+vt 0.50000000 0.0000000e+0\r
+vt 0.50000000 0.0000000e+0\r
+vt 0.50000000 0.0000000e+0\r
+vt 1.00000000 2.2204460e-16\r
+vt 1.00000000 1.00000000\r
+vt 1.00000000 1.00000000\r
+vt 1.00000000 1.00000000\r
+vn 0.0000000e+0 -0.89442719 0.44721360\r
+vn 0.0000000e+0 0.0000000e+0 -1.00000000\r
+vn -0.89442719 0.0000000e+0 0.44721360\r
+vn 0.0000000e+0 0.0000000e+0 -1.00000000\r
+vn 0.0000000e+0 0.89442719 0.44721360\r
+vn -0.89442719 0.0000000e+0 0.44721360\r
+vn 0.0000000e+0 0.0000000e+0 -1.00000000\r
+vn 0.89442719 0.0000000e+0 0.44721360\r
+vn 0.0000000e+0 0.89442719 0.44721360\r
+vn 0.0000000e+0 0.0000000e+0 -1.00000000\r
+vn 0.0000000e+0 0.0000000e+0 -1.00000000\r
+vn 0.89442719 0.0000000e+0 0.44721360\r
+vn 0.0000000e+0 -0.89442719 0.44721360\r
+vn 0.0000000e+0 0.0000000e+0 -1.00000000\r
+vn 0.89442719 0.0000000e+0 0.44721360\r
+vn 0.0000000e+0 -0.89442719 0.44721360\r
+vn 0.0000000e+0 0.89442719 0.44721360\r
+vn -0.89442719 0.0000000e+0 0.44721360\r
+g cube1_geom/vect/vect\r
+usemtl geom/vect/vect\r
+s 1\r
+f 5/8/18 2/13/6 1/1/3\r
+f 5/9/15 4/13/12 3/5/8\r
+s 2\r
+f 1/10/2 3/6/10 4/4/14\r
+f 2/13/7 3/6/11 1/10/4\r
+s 3\r
+f 1/12/1 4/3/13 5/8/16\r
+f 5/7/17 3/11/9 2/2/5\r
diff --git a/data/geom/vect/vect.png b/data/geom/vect/vect.png
new file mode 100644 (file)
index 0000000..3269bda
Binary files /dev/null and b/data/geom/vect/vect.png differ
diff --git a/data/geom/vect/vect.wings b/data/geom/vect/vect.wings
new file mode 100644 (file)
index 0000000..e1393f9
Binary files /dev/null and b/data/geom/vect/vect.wings differ
index 90e8515..41f080e 100644 (file)
@@ -1,7 +1,7 @@
-0.700000 0.700000 0.700000 1.000000
-0.200000 0.200000 0.200000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.000000 0.000000 0.000000 0.000000
-10.000000
-1
-45.000000
+0.8 0.8 0.8 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+
+45.0
diff --git a/data/item/coin/coin-glow b/data/item/coin/coin-glow
new file mode 100644 (file)
index 0000000..8e473ff
--- /dev/null
@@ -0,0 +1,7 @@
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+additive clamp-s clamp-t transparent 
+45.0
diff --git a/data/item/coin/coin-glow.png b/data/item/coin/coin-glow.png
new file mode 100644 (file)
index 0000000..2ac6abe
Binary files /dev/null and b/data/item/coin/coin-glow.png differ
index 90e8515..b14443e 100644 (file)
@@ -1,7 +1,7 @@
-0.700000 0.700000 0.700000 1.000000
-0.200000 0.200000 0.200000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.000000 0.000000 0.000000 0.000000
-10.000000
-1
-45.000000
+0.8 0.8 0.8 1.0
+0.2 0.2 0.2 1.0
+1.0 1.0 1.0 1.0
+0.0 0.0 0.0 1.0
+10.0
+
+45.0
index 90e8515..b14443e 100644 (file)
@@ -1,7 +1,7 @@
-0.700000 0.700000 0.700000 1.000000
-0.200000 0.200000 0.200000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.000000 0.000000 0.000000 0.000000
-10.000000
-1
-45.000000
+0.8 0.8 0.8 1.0
+0.2 0.2 0.2 1.0
+1.0 1.0 1.0 1.0
+0.0 0.0 0.0 1.0
+10.0
+
+45.0
index a2db099..d6eb504 100644 (file)
 "image"     "png/stars1"
 "width"     "  +101.49846     +0.00000     +0.00000"
 "height"    "  +101.49846     +0.00000     +0.00000"
-"xrot"      "   +10.31190     +0.00000     +0.00000"
+"xrot"      "   +30.31190     +0.00000     +0.00000"
 "yrot"      "   -48.79726     +0.00000     +0.00000"
 "zrot"      "  -147.09494     +0.00000     +0.00000"
 "dist"      "  +300.00000"
 "image"     "png/stars1"
 "width"     "  +198.85251     +0.00000     +0.00000"
 "height"    "  +198.85251     +0.00000     +0.00000"
-"xrot"      "    +0.32685     +0.00000     +0.00000"
+"xrot"      "   +20.32685     +0.00000     +0.00000"
 "yrot"      "  -137.13004     +0.00000     +0.00000"
 "zrot"      "   -19.55077     +0.00000     +0.00000"
 "dist"      "  +300.00000"
 "image"     "png/stars1"
 "width"     "  +137.58659     +0.00000     +0.00000"
 "height"    "  +137.58659     +0.00000     +0.00000"
-"xrot"      "    +3.93506     +0.00000     +0.00000"
+"xrot"      "   +15.93506     +0.00000     +0.00000"
 "yrot"      "   +63.79406     +0.00000     +0.00000"
 "zrot"      "  -146.65547     +0.00000     +0.00000"
 "dist"      "  +300.00000"
 "image"     "png/stars3"
 "width"     "  +183.76111     +0.00000     +0.00000"
 "height"    "  +183.76111     +0.00000     +0.00000"
-"xrot"      "   +14.37513     +0.00000     +0.00000"
+"xrot"      "   +24.37513     +0.00000     +0.00000"
 "yrot"      "    -5.42192     +0.00000     +0.00000"
 "zrot"      "   +81.53752     +0.00000     +0.00000"
 "dist"      "  +300.00000"
 "image"     "png/stars1"
 "width"     "  +117.78924     +0.00000     +0.00000"
 "height"    "  +117.78924     +0.00000     +0.00000"
-"xrot"      "   +10.88870     +0.00000     +0.00000"
+"xrot"      "   +18.88870     +0.00000     +0.00000"
 "yrot"      "    -8.90469     +0.00000     +0.00000"
 "zrot"      "  +114.18989     +0.00000     +0.00000"
 "dist"      "  +300.00000"
 "image"     "png/stars1"
 "width"     "  +175.58519     +0.00000     +0.00000"
 "height"    "  +175.58519     +0.00000     +0.00000"
-"xrot"      "    +8.61141     +0.00000     +0.00000"
+"xrot"      "   +15.61141     +0.00000     +0.00000"
 "yrot"      "    -8.89370     +0.00000     +0.00000"
 "zrot"      "   +79.88953     +0.00000     +0.00000"
 "dist"      "  +300.00000"
 "image"     "png/stars3"
 "width"     "  +119.78515     +0.00000     +0.00000"
 "height"    "  +119.78515     +0.00000     +0.00000"
-"xrot"      "    +7.69494     +0.00000     +0.00000"
+"xrot"      "   +15.69494     +0.00000     +0.00000"
 "yrot"      "  -135.60289     +0.00000     +0.00000"
 "zrot"      "  +123.17698     +0.00000     +0.00000"
 "dist"      "  +300.00000"
 "image"     "png/stars3"
 "width"     "  +125.27238     +0.00000     +0.00000"
 "height"    "  +125.27238     +0.00000     +0.00000"
-"xrot"      "    +4.27045     +0.00000     +0.00000"
+"xrot"      "   +19.27045     +0.00000     +0.00000"
 "yrot"      "  -179.41771     +0.00000     +0.00000"
 "zrot"      "  -127.98914     +0.00000     +0.00000"
 "dist"      "  +300.00000"
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index f66ac4b..8d2344b 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-65
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 31a208f..69baa51 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.250000 0.250000 0.250000 1.000000
-0.000000
-2
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.25 0.25 0.25 1.0
+0.0
+shadowed transparent 
+45.0
index 6eba1fc..47d4aad 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-2
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed transparent 
+45.0
index 8c48f2b..6c8b2ca 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-20.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+1.0 1.0 1.0 1.0
+0.0 0.0 0.0 1.0
+20.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index ebb2acb..cb4c5c3 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+1.0 1.0 1.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index c85c2de..10da8c3 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.700000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-6
-45.000000
+1.0 1.0 1.0 0.8
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+reflective
+45.0
index 26fdf9e..c9f907b 100644 (file)
Binary files a/data/mtrl/blue-sea.png and b/data/mtrl/blue-sea.png differ
index 90a2f23..72509de 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000\r
-1.000000 1.000000 1.000000 1.000000\r
-0.500000 0.500000 0.500000 1.000000\r
-0.000000 0.000000 0.000000 1.000000\r
-50.000000\r
-2\r
-45.000000\r
+1.0 1.0 1.0 1.0
+1.0 1.0 1.0 1.0
+0.5 0.5 0.5 1.0
+0.0 0.0 0.0 1.0
+50.0
+transparent 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 48c6e13..6aa20fc 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-9
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+environment shadowed 
+45.0
index 58a05f4..12fe151 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000\r
-0.200000 0.200000 0.200000 1.000000\r
-1.000000 1.000000 1.000000 1.000000\r
-0.000000 0.000000 0.000000 1.000000\r
-40.000000\r
-9\r
-0.000000\r
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+1.0 1.0 1.0 1.0
+0.0 0.0 0.0 1.0
+40.0
+environment shadowed
+0.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index b388fad..41de2f2 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-40.000000
-9
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+1.0 1.0 1.0 1.0
+0.0 0.0 0.0 1.0
+40.0
+environment shadowed 
+45.0
index 07ed8b2..bb25073 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-40.000000
-9
-0.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+1.0 1.0 1.0 1.0
+0.0 0.0 0.0 1.0
+40.0
+environment shadowed 
+0.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 73b0457..a0b161a 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.400000\r
-0.200000 0.200000 0.200000 1.000000\r
-0.200000 0.200000 0.200000 1.000000\r
-0.000000 0.000000 0.000000 1.000000\r
-20.000000\r
-4\r
-45.000000\r
+1.0 1.0 1.0 0.4
+0.2 0.2 0.2 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+20.0
+reflective shadowed
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index e19a0f1..03c1fc4 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.500000
-0.200000 0.200000 0.200000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-10.000000
-4
-45.000000
+1.0 1.0 1.0 0.5
+0.2 0.2 0.2 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+10.0
+reflective shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 6e168df..47d4aad 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-258
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed transparent 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
diff --git a/data/mtrl/default b/data/mtrl/default
new file mode 100644 (file)
index 0000000..41f080e
--- /dev/null
@@ -0,0 +1,7 @@
+0.8 0.8 0.8 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+
+45.0
index 6eba1fc..47d4aad 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-2
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index a62ad89..5760c13 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.200000
-0.200000 0.200000 0.200000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-20.000000
-10
-45.000000
+1.0 1.0 1.0 0.2
+0.2 0.2 0.2 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+20.0
+environment shadowed transparent 
+45.0
index d18b72a..3322986 100644 (file)
@@ -1,7 +1,7 @@
-0.200000 0.200000 0.200000 0.500000
-0.200000 0.200000 0.200000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-20.000000
-10
-45.000000
+0.2 0.2 0.2 0.5
+0.2 0.2 0.2 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+20.0
+environment shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index c1c1ab7..0667389 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.700000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-2
-45.000000
+1.0 1.0 1.0 0.7
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index 0ce54bf..ae6f4d1 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-0
-45.000000
+1.0 1.0 1.0 0.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+
+45.0
index d84c997..57273f4 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.375000 0.375000 0.375000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.375 0.375 0.375 1.0
+0.0
+shadowed transparent 
+45.0
index d4cbebf..bbe7c2c 100644 (file)
@@ -1,7 +1,7 @@
-0.200000 0.200000 0.200000 0.800000
-0.200000 0.200000 0.200000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-20.000000
-4
-45.000000
+0.2 0.2 0.2 0.8
+0.2 0.2 0.2 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+20.0
+reflective shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 3630922..bbe9c3d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.500000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-4
-45.000000
+1.0 1.0 1.0 0.5
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+reflective shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 9acc552..0332441 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.800000
-0.200000 0.200000 0.200000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-20.000000
-4
-45.000000
+1.0 1.0 1.0 0.8
+0.2 0.2 0.2 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+20.0
+reflective shadowed 
+45.0
index cd0d21e..965089b 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.200000
-0.200000 0.200000 0.200000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-20.000000
-4
-45.000000
+1.0 1.0 1.0 0.2
+0.2 0.2 0.2 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+20.0
+reflective shadowed 
+45.0
index 9013f52..3ad83b0 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.200000
-0.200000 0.200000 0.200000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-4
-45.000000
+1.0 1.0 1.0 0.2
+0.2 0.2 0.2 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0
+reflective shadowed 
+45.0
index a483382..d78bb3e 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.400000
-0.200000 0.200000 0.200000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-20.000000
-4
-45.000000
+1.0 1.0 1.0 0.4
+0.2 0.2 0.2 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+20.0
+reflective shadowed 
+45.0
index a751208..836afb8 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.750000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-4
-45.000000
+1.0 1.0 1.0 0.75
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+reflective shadowed 
+45.0
index 9013f52..3ad83b0 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.200000
-0.200000 0.200000 0.200000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-4
-45.000000
+1.0 1.0 1.0 0.2
+0.2 0.2 0.2 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0
+reflective shadowed 
+45.0
index c729a70..33e7278 100644 (file)
@@ -1,7 +1,7 @@
-0.000000 0.000000 0.000000 0.500000
-0.200000 0.200000 0.200000 1.000000
-0.500000 0.500000 0.500000 1.000000
-0.000000 0.000000 0.000000 1.000000
-10.000000
-4
-45.000000
+0.0 0.0 0.0 0.5
+0.2 0.2 0.2 1.0
+0.5 0.5 0.5 1.0
+0.0 0.0 0.0 1.0
+10.0
+reflective shadowed 
+45.0
index 9013f52..3ad83b0 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.200000
-0.200000 0.200000 0.200000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-4
-45.000000
+1.0 1.0 1.0 0.2
+0.2 0.2 0.2 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0
+reflective shadowed 
+45.0
index 9013f52..3ad83b0 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.200000
-0.200000 0.200000 0.200000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-4
-45.000000
+1.0 1.0 1.0 0.2
+0.2 0.2 0.2 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0
+reflective shadowed 
+45.0
index 9013f52..3ad83b0 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.200000
-0.200000 0.200000 0.200000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-4
-45.000000
+1.0 1.0 1.0 0.2
+0.2 0.2 0.2 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0
+reflective shadowed 
+45.0
index 9013f52..3ad83b0 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.200000
-0.200000 0.200000 0.200000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-4
-45.000000
+1.0 1.0 1.0 0.2
+0.2 0.2 0.2 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0
+reflective shadowed 
+45.0
index 9013f52..3ad83b0 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.200000
-0.200000 0.200000 0.200000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-4
-45.000000
+1.0 1.0 1.0 0.2
+0.2 0.2 0.2 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0
+reflective shadowed 
+45.0
index 094e85d..fe83566 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-98
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+clamp-s clamp-t decal transparent 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 094e85d..fe83566 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-98
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+clamp-s clamp-t decal transparent 
+45.0
index 094e85d..fe83566 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-98
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+clamp-s clamp-t decal transparent 
+45.0
index 094e85d..fe83566 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-98
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+clamp-s clamp-t decal transparent 
+45.0
index 094e85d..fe83566 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-98
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+clamp-s clamp-t decal transparent 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 8c48f2b..6c8b2ca 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-20.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+1.0 1.0 1.0 1.0
+0.0 0.0 0.0 1.0
+20.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index c1c1ab7..0667389 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.700000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-2
-45.000000
+1.0 1.0 1.0 0.7
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed transparent 
+45.0
index 7d2e94d..3ece2f5 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.700000
-0.200000 0.200000 0.200000 1.000000
-0.300000 0.300000 0.300000 1.000000
-0.000000 0.000000 0.000000 1.000000
-10.000000
-2
-45.000000
+1.0 1.0 1.0 0.7
+0.2 0.2 0.2 1.0
+0.3 0.3 0.3 1.0
+0.0 0.0 0.0 1.0
+10.0
+shadowed transparent 
+45.0
index 8c48f2b..6c8b2ca 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-20.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+1.0 1.0 1.0 1.0
+0.0 0.0 0.0 1.0
+20.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index ebb2acb..cb4c5c3 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+1.0 1.0 1.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index 52f8df7..2f2c0fd 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.250000 0.250000 0.250000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.25 0.25 0.25 1.0
+0.0
+decal shadowed transparent 
+45.0
index 52f8df7..2f2c0fd 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.250000 0.250000 0.250000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.25 0.25 0.25 1.0
+0.0
+decal shadowed transparent 
+45.0
index 52f8df7..2f2c0fd 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.250000 0.250000 0.250000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.25 0.25 0.25 1.0
+0.0
+decal shadowed transparent 
+45.0
index 48c6e13..6aa20fc 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-9
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+environment shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index d59fc9c..90a9b77 100644 (file)
@@ -1,7 +1,7 @@
-0.500000 0.500000 0.500000 0.200000
-0.600000 0.600000 0.600000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-2
-45.000000
+0.5 0.5 0.5 0.2
+0.6 0.6 0.6 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed transparent 
+45.0
index bf42e0d..d84eeab 100644 (file)
@@ -1,7 +1,7 @@
-0.100000 0.100000 0.100000 0.500000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-2
-45.000000
+0.1 0.1 0.1 0.5
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed transparent 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index e19a0f1..03c1fc4 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.500000
-0.200000 0.200000 0.200000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-10.000000
-4
-45.000000
+1.0 1.0 1.0 0.5
+0.2 0.2 0.2 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+10.0
+reflective shadowed 
+45.0
index e19a0f1..03c1fc4 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 0.500000
-0.200000 0.200000 0.200000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-10.000000
-4
-45.000000
+1.0 1.0 1.0 0.5
+0.2 0.2 0.2 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+10.0
+reflective shadowed 
+45.0
index d4e38c7..b44331d 100644 (file)
@@ -1,7 +1,7 @@
-0.700000 0.700000 0.700000 1.000000
-0.200000 0.200000 0.200000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-10.000000
-1
-45.000000
+0.7 0.7 0.7 1.0
+0.2 0.2 0.2 1.0
+1.0 1.0 1.0 1.0
+0.0 0.0 0.0 1.0
+10.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 8d03692..d71ba70 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.300000 0.300000 0.300000 1.000000
-0.000000 0.000000 0.000000 1.000000
-10.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.3 0.3 0.3 1.0
+0.0 0.0 0.0 1.0
+10.0
+shadowed 
+45.0
index 8d03692..d71ba70 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.300000 0.300000 0.300000 1.000000
-0.000000 0.000000 0.000000 1.000000
-10.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.3 0.3 0.3 1.0
+0.0 0.0 0.0 1.0
+10.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index 8d03692..d71ba70 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.300000 0.300000 0.300000 1.000000
-0.000000 0.000000 0.000000 1.000000
-10.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.3 0.3 0.3 1.0
+0.0 0.0 0.0 1.0
+10.0
+shadowed 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index f66ac4b..8d2344b 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-65
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed
+45.0
index 8d03692..d71ba70 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.300000 0.300000 0.300000 1.000000
-0.000000 0.000000 0.000000 1.000000
-10.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.3 0.3 0.3 1.0
+0.0 0.0 0.0 1.0
+10.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index ebb2acb..cb4c5c3 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-1.000000 1.000000 1.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+1.0 1.0 1.0 1.0
+0.0
+shadowed 
+45.0
index 7401926..e876576 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-1
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+shadowed 
+45.0
index cf9568b..7ff7a5d 100644 (file)
@@ -1,7 +1,7 @@
-1.000000 1.000000 1.000000 1.000000
-0.200000 0.200000 0.200000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000 0.000000 0.000000 1.000000
-0.000000
-66
-45.000000
+1.0 1.0 1.0 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+decal shadowed transparent 
+45.0
diff --git a/data/png/stars1 b/data/png/stars1
new file mode 100644 (file)
index 0000000..6e85953
--- /dev/null
@@ -0,0 +1,7 @@
+0.8 0.8 0.8 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+additive 
+45.0
diff --git a/data/png/stars2 b/data/png/stars2
new file mode 100644 (file)
index 0000000..6e85953
--- /dev/null
@@ -0,0 +1,7 @@
+0.8 0.8 0.8 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+additive 
+45.0
diff --git a/data/png/stars3 b/data/png/stars3
new file mode 100644 (file)
index 0000000..6e85953
--- /dev/null
@@ -0,0 +1,7 @@
+0.8 0.8 0.8 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+additive 
+45.0
diff --git a/data/png/stars4 b/data/png/stars4
new file mode 100644 (file)
index 0000000..6e85953
--- /dev/null
@@ -0,0 +1,7 @@
+0.8 0.8 0.8 1.0
+0.2 0.2 0.2 1.0
+0.0 0.0 0.0 1.0
+0.0 0.0 0.0 1.0
+0.0
+additive 
+45.0
index 0e9356c..70ce43c 100644 (file)
@@ -20,7 +20,6 @@
 #include "vec3.h"
 #include "geom.h"
 #include "ball.h"
-#include "back.h"
 #include "hole.h"
 #include "hud.h"
 #include "image.h"
@@ -37,6 +36,8 @@
 static struct s_full file;
 static int           ball;
 
+static int state;
+
 static float view_a;                    /* Ideal view rotation about Y axis  */
 static float view_m;
 static float view_ry;                   /* Angular velocity about Y axis     */
@@ -84,7 +85,7 @@ static void view_init(void)
     view_e[2][2] = 1.f;
 }
 
-void game_init(const char *s)
+int game_init(const char *s)
 {
     int i;
 
@@ -94,7 +95,10 @@ void game_init(const char *s)
     idle_t = 1.0f;
 
     view_init();
-    sol_load_full(&file, s, config_get_d(CONFIG_SHADOW));
+
+    if (!(state = sol_load_full(&file, s, config_get_d(CONFIG_SHADOW))))
+        return 0;
+
     sol_init_sim(&file.vary);
 
     for (i = 0; i < file.base.dc; i++)
@@ -110,6 +114,7 @@ void game_init(const char *s)
                 idle_t = 1.0f;
         }
     }
+    return 1;
 }
 
 void game_free(void)
@@ -120,67 +125,29 @@ void game_free(void)
 
 /*---------------------------------------------------------------------------*/
 
-static void game_draw_vect_prim(const struct s_vary *fp, GLenum mode)
-{
-    float p[3];
-    float x[3];
-    float z[3];
-    float r;
-
-    v_cpy(p, fp->uv[ball].p);
-    v_cpy(x, view_e[0]);
-    v_cpy(z, view_e[2]);
-
-    r = fp->uv[ball].r;
-
-    glBegin(mode);
-    {
-        glColor4f(1.0f, 1.0f, 0.5f, 0.5f);
-        glVertex3f(p[0] - x[0] * r,
-                   p[1] - x[1] * r,
-                   p[2] - x[2] * r);
-
-        glColor4f(1.0f, 0.0f, 0.0f, 0.5f);
-        glVertex3f(p[0] + z[0] * view_m,
-                   p[1] + z[1] * view_m,
-                   p[2] + z[2] * view_m);
-
-        glColor4f(1.0f, 1.0f, 0.0f, 0.5f);
-        glVertex3f(p[0] + x[0] * r,
-                   p[1] + x[1] * r,
-                   p[2] + x[2] * r);
-    }
-    glEnd();
-}
-
-static void game_draw_vect(const struct s_vary *fp)
+static void game_draw_vect(struct s_rend *rend, const struct s_vary *fp)
 {
     if (view_m > 0.f)
     {
-        glPushAttrib(GL_TEXTURE_BIT);
-        glPushAttrib(GL_POLYGON_BIT);
-        glPushAttrib(GL_LIGHTING_BIT);
-        glPushAttrib(GL_DEPTH_BUFFER_BIT);
+        glDisable(GL_LIGHTING);
+        glPushMatrix();
         {
-            glEnable(GL_COLOR_MATERIAL);
-            glDisable(GL_LIGHTING);
-            glDisable(GL_TEXTURE_2D);
-            glDepthMask(GL_FALSE);
-
-            glEnable(GL_DEPTH_TEST);
-            game_draw_vect_prim(fp, GL_TRIANGLES);
-
-            glDisable(GL_DEPTH_TEST);
-            game_draw_vect_prim(fp, GL_LINE_STRIP);
+            glTranslatef(fp->uv[ball].p[0],
+                         fp->uv[ball].p[1],
+                         fp->uv[ball].p[2]);
+            glRotatef(view_a, 0.0f, 1.0f, 0.0f);
+            glScalef(fp->uv[ball].r,
+                     fp->uv[ball].r * 0.1f, view_m);
+
+            vect_draw(rend);
         }
-        glPopAttrib();
-        glPopAttrib();
-        glPopAttrib();
-        glPopAttrib();
+        glPopMatrix();
+        glEnable(GL_LIGHTING);
     }
 }
 
-static void game_draw_balls(const struct s_vary *fp,
+static void game_draw_balls(struct s_rend *rend,
+                            const struct s_vary *fp,
                             const float *bill_M, float t)
 {
     static const GLfloat color[5][4] = {
@@ -193,6 +160,8 @@ static void game_draw_balls(const struct s_vary *fp,
 
     int ui;
 
+    glEnable(GL_COLOR_MATERIAL);
+
     for (ui = curr_party(); ui > 0; ui--)
     {
         if (ui == ball)
@@ -212,10 +181,11 @@ static void game_draw_balls(const struct s_vary *fp,
                          fp->uv[ui].r,
                          fp->uv[ui].r);
 
-                glEnable(GL_COLOR_MATERIAL);
-                glColor4fv(color[ui]);
-                ball_draw(ball_M, pend_M, bill_M, t);
-                glDisable(GL_COLOR_MATERIAL);
+                glColor4f(color[ui][0],
+                          color[ui][1],
+                          color[ui][2],
+                          color[ui][3]);
+                ball_draw(rend, ball_M, pend_M, bill_M, t);
             }
             glPopMatrix();
         }
@@ -234,15 +204,17 @@ static void game_draw_balls(const struct s_vary *fp,
                           color[ui][1],
                           color[ui][2], 0.5f);
 
-                mark_draw();
+                mark_draw(rend);
             }
             glPopMatrix();
         }
     }
+
     glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+    glDisable(GL_COLOR_MATERIAL);
 }
 
-static void game_draw_goals(const struct s_base *fp)
+static void game_draw_goals(struct s_rend *rend, const struct s_base *fp)
 {
     int zi;
 
@@ -253,14 +225,15 @@ static void game_draw_goals(const struct s_base *fp)
             glTranslatef(fp->zv[zi].p[0],
                          fp->zv[zi].p[1],
                          fp->zv[zi].p[2]);
-            flag_draw();
+            flag_draw(rend);
         }
         glPopMatrix();
     }
 }
 
-static void game_draw_jumps(const struct s_base *fp)
+static void game_draw_jumps(struct s_rend *rend, const struct s_base *fp)
 {
+    float t = 0.001f * SDL_GetTicks();
     int ji;
 
     for (ji = 0; ji < fp->jc; ji++)
@@ -272,13 +245,13 @@ static void game_draw_jumps(const struct s_base *fp)
                          fp->jv[ji].p[2]);
 
             glScalef(fp->jv[ji].r, 1.f, fp->jv[ji].r);
-            jump_draw(!jump_e);
+            jump_draw(rend, t, !jump_e);
         }
         glPopMatrix();
     }
 }
 
-static void game_draw_swchs(const struct s_vary *fp)
+static void game_draw_swchs(struct s_rend *rend, const struct s_vary *fp)
 {
     int xi;
 
@@ -296,7 +269,7 @@ static void game_draw_swchs(const struct s_vary *fp)
                          xp->base->p[2]);
 
             glScalef(xp->base->r, 1.f, xp->base->r);
-            swch_draw(xp->f, xp->e);
+            swch_draw(rend, xp->f, xp->e);
         }
         glPopMatrix();
     }
@@ -306,21 +279,23 @@ static void game_draw_swchs(const struct s_vary *fp)
 
 void game_draw(int pose, float t)
 {
-    static const float a[4] = { 0.2f, 0.2f, 0.2f, 1.0f };
-    static const float s[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
-    static const float e[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
-    static const float h[1] = { 0.0f };
-
     const float light_p[4] = { 8.f, 32.f, 8.f, 0.f };
 
-    const struct s_draw *fp = &file.draw;
+    struct s_draw *fp = &file.draw;
+    struct s_rend rend = { NULL };
 
     float fov = FOV;
 
+    if (!state)
+        return;
+
+    fp->shadow_ui = ball;
+
+    sol_draw_enable(&rend);
+
     if (jump_b) fov *= 2.0f * fabsf(jump_dt - 0.5f);
 
     video_push_persp(fov, 0.1f, FAR_DIST);
-    glPushAttrib(GL_LIGHTING_BIT);
     glPushMatrix();
     {
         float T[16], M[16], v[3], rx, ry;
@@ -342,7 +317,7 @@ void game_draw(int pose, float t)
         glPushMatrix();
         {
             glTranslatef(view_p[0], view_p[1], view_p[2]);
-            back_draw(0);
+            back_draw(&rend, 0);
         }
         glPopMatrix();
 
@@ -351,14 +326,7 @@ void game_draw(int pose, float t)
 
         /* Draw the floor. */
 
-        sol_draw(fp, 0, 1);
-
-        if (config_get_d(CONFIG_SHADOW) && !pose)
-        {
-            shad_draw_set();
-            sol_shad(fp, ball);
-            shad_draw_clr();
-        }
+        sol_draw(fp, &rend, 0, 1);
 
         /* Draw the game elements. */
 
@@ -367,33 +335,26 @@ void game_draw(int pose, float t)
 
         if (pose == 0)
         {
-            game_draw_balls(fp->vary, T, t);
-            game_draw_vect(fp->vary);
+            game_draw_balls(&rend, fp->vary, T, t);
+            game_draw_vect(&rend, fp->vary);
         }
 
-        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,   a);
-        glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,  s);
-        glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION,  e);
-        glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, h);
-
-        game_draw_goals(fp->base);
-
         glEnable(GL_COLOR_MATERIAL);
         glDisable(GL_LIGHTING);
-        glDisable(GL_TEXTURE_2D);
         glDepthMask(GL_FALSE);
         {
-            game_draw_jumps(fp->base);
-            game_draw_swchs(fp->vary);
+            game_draw_goals(&rend, fp->base);
+            game_draw_jumps(&rend, fp->base);
+            game_draw_swchs(&rend, fp->vary);
         }
         glDepthMask(GL_TRUE);
-        glEnable(GL_TEXTURE_2D);
         glEnable(GL_LIGHTING);
         glDisable(GL_COLOR_MATERIAL);
     }
     glPopMatrix();
-    glPopAttrib();
     video_pop_matrix();
+
+    sol_draw_disable(&rend);
 }
 
 /*---------------------------------------------------------------------------*/
@@ -409,6 +370,9 @@ void game_update_view(float dt)
     float d[3];
     float s = 2.f * dt;
 
+    if (!state)
+        return;
+
     /* Center the view about the ball. */
 
     v_cpy(view_c, file.vary.uv[ball].p);
@@ -548,6 +512,9 @@ int game_step(const float g[3], float dt)
     float st = 0.f;
     int i, n = 1, m = 0;
 
+    if (!state)
+        return GAME_NONE;
+
     s = (7.f * s + dt) / 8.f;
     t = s;
 
@@ -644,6 +611,9 @@ void game_set_fly(float k)
     float p1[3] = { 0.f, 0.f, 0.f };
     float  v[3];
 
+    if (!state)
+        return;
+
     v_cpy(view_e[0], x);
     v_cpy(view_e[1], y);
     v_sub(view_e[2], fp->uv[ball].p, fp->base->zv[0].p);
index 47bc793..eae1cf6 100644 (file)
@@ -34,7 +34,7 @@
 
 /*---------------------------------------------------------------------------*/
 
-void  game_init(const char *);
+int   game_init(const char *);
 void  game_free(void);
 
 void  game_draw(int, float);
index 50b8baa..2d1e889 100644 (file)
@@ -22,7 +22,6 @@
 #include "game.h"
 #include "geom.h"
 #include "hud.h"
-#include "back.h"
 #include "audio.h"
 #include "config.h"
 #include "fs.h"
@@ -219,7 +218,7 @@ const char *curr_par(void)
 
 /*---------------------------------------------------------------------------*/
 
-void hole_goto(int h, int p)
+int hole_goto(int h, int p)
 {
     int i;
 
@@ -228,20 +227,24 @@ void hole_goto(int h, int p)
         if (h >= 0) hole  = h;
         if (p >= 0) party = p;
 
-        player = (hole - 1) % party + 1;
-        done   = 0;
-
-        back_init(hole_v[hole].back);
-        game_init(hole_v[hole].file);
-
-        for (i = 1; i <= party; i++)
+        if (game_init(hole_v[hole].file))
         {
-            game_get_pos(ball_p[i], ball_e[i]);
-            stat_v[i] = 0;
+            back_init(hole_v[hole].back);
+
+            player = (hole - 1) % party + 1;
+            done   = 0;
+
+            for (i = 1; i <= party; i++)
+            {
+                game_get_pos(ball_p[i], ball_e[i]);
+                stat_v[i] = 0;
+            }
+            game_ball(player);
+            hole_song();
+            return 1;
         }
-        game_ball(player);
-        hole_song();
     }
+    return 0;
 }
 
 int hole_next(void)
@@ -271,9 +274,8 @@ int hole_move(void)
         game_free();
         back_free();
 
-        hole_goto(hole, party);
-
-        return 1;
+        if (hole_goto(hole, party))
+            return 1;
     }
     return 0;
 }
index 2063d53..0ef8b0c 100644 (file)
@@ -25,7 +25,7 @@ int  curr_count(void);
 const char *curr_scr(void);
 const char *curr_par(void);
 
-void hole_goto(int, int);
+int  hole_goto(int, int);
 int  hole_next(void);
 int  hole_move(void);
 void hole_goal(void);
index cd11f67..5cc8684 100644 (file)
@@ -30,7 +30,7 @@ static int fps_id;
 
 void hud_init(void)
 {
-    static const float *color[5] = {
+    static const GLubyte *color[5] = {
         gui_wht,
         gui_red,
         gui_grn,
index 3bf6aef..1c173da 100644 (file)
@@ -41,19 +41,30 @@ const char ICON[] = "icon/neverputt.png";
 
 /*---------------------------------------------------------------------------*/
 
-static int shot(void)
+static int shot_pending;
+
+static void shot_prep(void)
 {
-    static char filename[MAXSTR];
+    shot_pending = 1;
+}
 
-    sprintf(filename, "Screenshots/screen%05d.png", config_screenshot());
-    image_snap(filename);
+static void shot_take(void)
+{
+    static char filename[MAXSTR];
 
-    return 1;
+    if (shot_pending)
+    {
+        sprintf(filename, "Screenshots/screen%05d.png", config_screenshot());
+        image_snap(filename);
+        shot_pending = 0;
+    }
 }
+
 /*---------------------------------------------------------------------------*/
 
 static void toggle_wire(void)
 {
+#if !ENABLE_OPENGLES
     static int wire = 0;
 
     if (wire)
@@ -70,6 +81,7 @@ static void toggle_wire(void)
         glDisable(GL_LIGHTING);
         wire = 1;
     }
+#endif
 }
 /*---------------------------------------------------------------------------*/
 
@@ -119,7 +131,7 @@ static int loop(void)
 
             else switch (c)
             {
-            case SDLK_F10: d = shot();                break;
+            case SDLK_F10: shot_prep();               break;
             case SDLK_F9:  config_tgl_d(CONFIG_FPS);  break;
             case SDLK_F8:  config_tgl_d(CONFIG_NICE); break;
             case SDLK_F7:  toggle_wire();             break;
@@ -247,6 +259,7 @@ int main(int argc, char *argv[])
                 {
                     st_timer((t1 - t0) / 1000.f);
                     st_paint(0.001f * t1);
+                    shot_take();
                     SDL_GL_SwapBuffers();
 
                     t0 = t1;
index bc6c2b1..9a29489 100644 (file)
@@ -15,7 +15,6 @@
 #include <math.h>
 
 #include "hud.h"
-#include "back.h"
 #include "geom.h"
 #include "gui.h"
 #include "vec3.h"
@@ -50,8 +49,8 @@ static char *number(int i)
 }
 
 static int score_card(const char  *title,
-                      const float *c0,
-                      const float *c1)
+                      const GLubyte *c0,
+                      const GLubyte *c1)
 {
     int id, jd, kd, ld;
 
@@ -454,23 +453,23 @@ static int party_action(int i)
     {
     case PARTY_1:
         audio_play(AUD_MENU, 1.f);
-        hole_goto(1, 1);
-        goto_state(&st_next);
+        if (hole_goto(1, 1))
+            goto_state(&st_next);
         break;
     case PARTY_2:
         audio_play(AUD_MENU, 1.f);
-        hole_goto(1, 2);
-        goto_state(&st_next);
+        if (hole_goto(1, 2))
+            goto_state(&st_next);
         break;
     case PARTY_3:
         audio_play(AUD_MENU, 1.f);
-        hole_goto(1, 3);
-        goto_state(&st_next);
+        if (hole_goto(1, 3))
+            goto_state(&st_next);
         break;
     case PARTY_4:
         audio_play(AUD_MENU, 1.f);
-        hole_goto(1, 4);
-        goto_state(&st_next);
+        if (hole_goto(1, 4))
+            goto_state(&st_next);
         break;
     case PARTY_B:
         audio_play(AUD_MENU, 1.f);
@@ -778,9 +777,8 @@ static int next_buttn(int b, int d)
     {
         if (config_tst_d(CONFIG_JOYSTICK_BUTTON_A, b))
         {
-            if (num > 0)
+            if (num > 0 && hole_goto(num, -1))
             {
-                hole_goto(num, -1);
                 num = 0;
                 return goto_state(&st_next);
             }
index b3d11c3..c1f37b4 100644 (file)
@@ -14,7 +14,6 @@
 
 #include "gui.h"
 #include "hud.h"
-#include "back.h"
 #include "geom.h"
 #include "ball.h"
 #include "part.h"
@@ -255,7 +254,7 @@ static void conf_paint(int id, float st)
 {
     video_push_persp((float) config_get_d(CONFIG_VIEW_FOV), 0.1f, FAR_DIST);
     {
-        back_draw(0);
+        back_draw_easy();
     }
     video_pop_matrix();
     gui_paint(id);
@@ -307,10 +306,7 @@ static int conf_buttn(int b, int d)
 static int null_enter(struct state *st, struct state *prev)
 {
     gui_free();
-    swch_free();
-    jump_free();
-    flag_free();
-    mark_free();
+    geom_free();
     ball_free();
     shad_free();
 
@@ -321,10 +317,7 @@ static void null_leave(struct state *st, struct state *next, int id)
 {
     shad_init();
     ball_init();
-    mark_init();
-    flag_init();
-    jump_init();
-    swch_init();
+    geom_init();
     gui_init();
 }
 
index 2eeebe7..b94a481 100644 (file)
@@ -14,6 +14,7 @@
 
 #include <SDL.h>
 
+#define OV_EXCLUDE_STATIC_CALLBACKS
 #include <vorbis/codec.h>
 #include <vorbis/vorbisfile.h>
 
diff --git a/share/back.c b/share/back.c
deleted file mode 100644 (file)
index 37a0ec9..0000000
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) 2003 Robert Kooima
- *
- * NEVERBALL is  free software; you can redistribute  it and/or modify
- * it under the  terms of the GNU General  Public License as published
- * by the Free  Software Foundation; either version 2  of the License,
- * or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of
- * MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU
- * General Public License for more details.
- */
-
-#include <SDL.h>
-#include <math.h>
-#include <string.h>
-
-#include "glext.h"
-#include "vec3.h"
-#include "back.h"
-#include "image.h"
-
-/*---------------------------------------------------------------------------*/
-
-#define PI 3.1415926535897932
-
-static GLuint back_list;
-static GLuint back_text;
-
-/*---------------------------------------------------------------------------*/
-
-void back_init(const char *s)
-{
-    int i, slices = 32;
-    int j, stacks = 16;
-
-    back_free();
-    back_text = make_image_from_file(s);
-
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-
-    back_list = glGenLists(1);
-
-    glNewList(back_list, GL_COMPILE);
-    {
-        glBindTexture(GL_TEXTURE_2D, back_text);
-
-        glColor3f(1.0f, 1.0f, 1.0f);
-
-        for (i = 0; i < stacks; i++)
-        {
-            float k0 = (float)  i      / stacks;
-            float k1 = (float) (i + 1) / stacks;
-
-            float s0 = fsinf(V_PI * (k0 - 0.5));
-            float c0 = fcosf(V_PI * (k0 - 0.5));
-            float s1 = fsinf(V_PI * (k1 - 0.5));
-            float c1 = fcosf(V_PI * (k1 - 0.5));
-
-            glBegin(GL_QUAD_STRIP);
-            {
-                for (j = 0; j <= slices; j++)
-                {
-                    float k = (float) j / slices;
-                    float s = fsinf(V_PI * k * 2.0);
-                    float c = fcosf(V_PI * k * 2.0);
-
-                    glTexCoord2f(k, 1.0f - k1);
-                    glVertex3f(s * c1, c * c1, s1);
-
-                    glTexCoord2f(k, 1.0f - k0);
-                    glVertex3f(s * c0, c * c0, s0);
-                }
-            }
-            glEnd();
-        }
-    }
-    glEndList();
-}
-
-void back_free(void)
-{
-    if (glIsList(back_list))
-        glDeleteLists(back_list, 1);
-
-    if (glIsTexture(back_text))
-        glDeleteTextures(1, &back_text);
-
-    back_list = 0;
-    back_text = 0;
-}
-
-void back_draw(float t)
-{
-    glPushMatrix();
-    {
-        GLfloat dx =  60.f * fsinf(t / 10.f) + 90.f;
-        GLfloat dz = 180.f * fsinf(t / 12.f);
-
-        glDisable(GL_LIGHTING);
-        glDepthMask(GL_FALSE);
-        {
-            glScalef(BACK_DIST, BACK_DIST, BACK_DIST);
-            glRotatef(dz, 0.f, 0.f, 1.f);
-            glRotatef(dx, 1.f, 0.f, 0.f);
-
-            glCallList(back_list);
-        }
-        glDepthMask(GL_TRUE);
-        glEnable(GL_LIGHTING);
-    }
-    glPopMatrix();
-}
-
-/*---------------------------------------------------------------------------*/
diff --git a/share/back.h b/share/back.h
deleted file mode 100644 (file)
index 3393a61..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-#ifndef BACK_H
-#define BACK_H
-
-/*---------------------------------------------------------------------------*/
-
-#define BACK_DIST 256.0f
-#define FAR_DIST  512.0f
-
-void back_init(const char *);
-void back_free(void);
-void back_draw(float);
-
-/*---------------------------------------------------------------------------*/
-
-#endif
index b70ce25..b564e82 100644 (file)
@@ -119,7 +119,8 @@ void ball_free(void)
 
 /*---------------------------------------------------------------------------*/
 
-static void ball_draw_solid(const float *ball_M,
+static void ball_draw_solid(struct s_rend *rend,
+                            const float *ball_M,
                             const float *ball_bill_M, float t)
 {
     if (has_solid)
@@ -147,7 +148,7 @@ static void ball_draw_solid(const float *ball_M,
                 if (mask == 0) glDepthMask(GL_FALSE);
                 glDisable(GL_LIGHTING);
                 {
-                    sol_bill(&solid.draw, ball_bill_M, t);
+                    sol_bill(&solid.draw, rend, ball_bill_M, t);
                 }
                 glEnable(GL_LIGHTING);
                 if (mask == 0) glDepthMask(GL_TRUE);
@@ -156,7 +157,7 @@ static void ball_draw_solid(const float *ball_M,
 
             /* Draw the solid opaque and transparent geometry. */
 
-            sol_draw(&solid.draw, mask, test);
+            sol_draw(&solid.draw, rend, mask, test);
         }
         glPopMatrix();
 
@@ -165,7 +166,8 @@ static void ball_draw_solid(const float *ball_M,
     }
 }
 
-static void ball_draw_inner(const float *pend_M,
+static void ball_draw_inner(struct s_rend *rend,
+                            const float *pend_M,
                             const float *bill_M,
                             const float *pend_bill_M, float t)
 {
@@ -191,7 +193,7 @@ static void ball_draw_inner(const float *pend_M,
 
         /* Draw the inner opaque and transparent geometry. */
 
-        sol_draw(&inner.draw, mask, test);
+        sol_draw(&inner.draw, rend, mask, test);
 
         /* Draw the inner billboard geometry. */
 
@@ -202,9 +204,9 @@ static void ball_draw_inner(const float *pend_M,
             glDisable(GL_LIGHTING);
             {
                 if (pend)
-                    sol_bill(&inner.draw, pend_bill_M, t);
+                    sol_bill(&inner.draw, rend, pend_bill_M, t);
                 else
-                    sol_bill(&inner.draw, bill_M,      t);
+                    sol_bill(&inner.draw, rend, bill_M,      t);
             }
 
             glEnable(GL_LIGHTING);
@@ -220,7 +222,8 @@ static void ball_draw_inner(const float *pend_M,
     }
 }
 
-static void ball_draw_outer(const float *pend_M,
+static void ball_draw_outer(struct s_rend *rend,
+                            const float *pend_M,
                             const float *bill_M,
                             const float *pend_bill_M, float t)
 {
@@ -236,7 +239,7 @@ static void ball_draw_outer(const float *pend_M,
             glAlphaFunc(GL_GEQUAL, outer_alpha);
         }
 
-       /* Apply the pendulum rotation. */
+        /* Apply the pendulum rotation. */
 
         if (pend)
         {
@@ -246,7 +249,7 @@ static void ball_draw_outer(const float *pend_M,
 
         /* Draw the outer opaque and transparent geometry. */
 
-        sol_draw(&outer.draw, mask, test);
+        sol_draw(&outer.draw, rend, mask, test);
 
         /* Draw the outer billboard geometry. */
 
@@ -257,9 +260,9 @@ static void ball_draw_outer(const float *pend_M,
             glDisable(GL_LIGHTING);
             {
                 if (pend)
-                    sol_bill(&outer.draw, pend_bill_M, t);
+                    sol_bill(&outer.draw, rend, pend_bill_M, t);
                 else
-                    sol_bill(&outer.draw, bill_M,      t);
+                    sol_bill(&outer.draw, rend, bill_M,      t);
             }
             glEnable(GL_LIGHTING);
             if (mask == 0) glDepthMask(GL_TRUE);
@@ -276,7 +279,8 @@ static void ball_draw_outer(const float *pend_M,
 
 /*---------------------------------------------------------------------------*/
 
-static void ball_pass_inner(const float *ball_M,
+static void ball_pass_inner(struct s_rend *rend,
+                            const float *ball_M,
                             const float *pend_M,
                             const float *bill_M,
                             const float *ball_bill_M,
@@ -287,11 +291,11 @@ static void ball_pass_inner(const float *ball_M,
     if      (inner_flags & F_DRAWCLIP)
     {
         glEnable(GL_CLIP_PLANE1);
-        ball_draw_inner(        pend_M, bill_M,              pend_bill_M, t);
+        ball_draw_inner(rend, pend_M, bill_M, pend_bill_M, t);
         glDisable(GL_CLIP_PLANE1);
 
         glEnable(GL_CLIP_PLANE2);
-        ball_draw_inner(        pend_M, bill_M,              pend_bill_M, t);
+        ball_draw_inner(rend, pend_M, bill_M, pend_bill_M, t);
         glDisable(GL_CLIP_PLANE2);
     }
 
@@ -300,20 +304,21 @@ static void ball_pass_inner(const float *ball_M,
     else if (inner_flags & F_DRAWBACK)
     {
         glCullFace(GL_FRONT);
-        ball_draw_inner(        pend_M, bill_M,              pend_bill_M, t);
+        ball_draw_inner(rend, pend_M, bill_M, pend_bill_M, t);
         glCullFace(GL_BACK);
-        ball_draw_inner(        pend_M, bill_M,              pend_bill_M, t);
+        ball_draw_inner(rend, pend_M, bill_M, pend_bill_M, t);
     }
 
     /* Draw the inner ball normally. */
 
     else
     {
-        ball_draw_inner(        pend_M, bill_M,              pend_bill_M, t);
+        ball_draw_inner(rend, pend_M, bill_M, pend_bill_M, t);
     }
 }
 
-static void ball_pass_solid(const float *ball_M,
+static void ball_pass_solid(struct s_rend *rend,
+                            const float *ball_M,
                             const float *pend_M,
                             const float *bill_M,
                             const float *ball_bill_M,
@@ -324,13 +329,13 @@ static void ball_pass_solid(const float *ball_M,
     if      (solid_flags & F_DRAWCLIP)
     {
         glEnable(GL_CLIP_PLANE1);
-        ball_draw_solid(ball_M,                 ball_bill_M, t);
+        ball_draw_solid(rend, ball_M,                 ball_bill_M, t);
         glDisable(GL_CLIP_PLANE1);
 
-        ball_pass_inner(ball_M, pend_M, bill_M, ball_bill_M, pend_bill_M, t);
+        ball_pass_inner(rend, ball_M, pend_M, bill_M, ball_bill_M, pend_bill_M, t);
 
         glEnable(GL_CLIP_PLANE2);
-        ball_draw_solid(ball_M,                 ball_bill_M, t);
+        ball_draw_solid(rend, ball_M,                 ball_bill_M, t);
         glDisable(GL_CLIP_PLANE2);
     }
 
@@ -339,23 +344,24 @@ static void ball_pass_solid(const float *ball_M,
     else if (solid_flags & F_DRAWBACK)
     {
         glCullFace(GL_FRONT);
-        ball_draw_solid(ball_M,                 ball_bill_M, t);
+        ball_draw_solid(rend, ball_M,                 ball_bill_M, t);
         glCullFace(GL_BACK);
 
-        ball_pass_inner(ball_M, pend_M, bill_M, ball_bill_M, pend_bill_M, t);
-        ball_draw_solid(ball_M,                 ball_bill_M, t);
+        ball_pass_inner(rend, ball_M, pend_M, bill_M, ball_bill_M, pend_bill_M, t);
+        ball_draw_solid(rend, ball_M,                 ball_bill_M, t);
     }
 
     /* Draw the solid ball after the inner ball. */
 
     else
     {
-        ball_pass_inner(ball_M, pend_M, bill_M, ball_bill_M, pend_bill_M, t);
-        ball_draw_solid(ball_M,                 ball_bill_M, t);
+        ball_pass_inner(rend, ball_M, pend_M, bill_M, ball_bill_M, pend_bill_M, t);
+        ball_draw_solid(rend, ball_M,                 ball_bill_M, t);
     }
 }
 
-static void ball_pass_outer(const float *ball_M,
+static void ball_pass_outer(struct s_rend *rend,
+                            const float *ball_M,
                             const float *pend_M,
                             const float *bill_M,
                             const float *ball_bill_M,
@@ -366,13 +372,13 @@ static void ball_pass_outer(const float *ball_M,
     if      (outer_flags & F_DRAWCLIP)
     {
         glEnable(GL_CLIP_PLANE1);
-        ball_draw_outer(        pend_M, bill_M,              pend_bill_M, t);
+        ball_draw_outer(rend,         pend_M, bill_M,              pend_bill_M, t);
         glDisable(GL_CLIP_PLANE1);
 
-        ball_pass_solid(ball_M, pend_M, bill_M, ball_bill_M, pend_bill_M, t);
+        ball_pass_solid(rend, ball_M, pend_M, bill_M, ball_bill_M, pend_bill_M, t);
 
         glEnable(GL_CLIP_PLANE2);
-        ball_draw_outer(        pend_M, bill_M,              pend_bill_M, t);
+        ball_draw_outer(rend,         pend_M, bill_M,              pend_bill_M, t);
         glDisable(GL_CLIP_PLANE2);
     }
 
@@ -381,25 +387,26 @@ static void ball_pass_outer(const float *ball_M,
     else if (outer_flags & F_DRAWBACK)
     {
         glCullFace(GL_FRONT);
-        ball_draw_outer(        pend_M, bill_M,              pend_bill_M, t);
+        ball_draw_outer(rend,         pend_M, bill_M,              pend_bill_M, t);
         glCullFace(GL_BACK);
 
-        ball_pass_solid(ball_M, pend_M, bill_M, ball_bill_M, pend_bill_M, t);
-        ball_draw_outer(        pend_M, bill_M,              pend_bill_M, t);
+        ball_pass_solid(rend, ball_M, pend_M, bill_M, ball_bill_M, pend_bill_M, t);
+        ball_draw_outer(rend,         pend_M, bill_M,              pend_bill_M, t);
     }
 
     /* Draw the outer ball after the solid ball. */
 
     else
     {
-        ball_pass_solid(ball_M, pend_M, bill_M, ball_bill_M, pend_bill_M, t);
-        ball_draw_outer(        pend_M, bill_M,              pend_bill_M, t);
+        ball_pass_solid(rend, ball_M, pend_M, bill_M, ball_bill_M, pend_bill_M, t);
+        ball_draw_outer(rend,         pend_M, bill_M,              pend_bill_M, t);
     }
 }
 
 /*---------------------------------------------------------------------------*/
 
-void ball_draw(const float *ball_M,
+void ball_draw(struct s_rend *rend,
+               const float *ball_M,
                const float *pend_M,
                const float *bill_M, float t)
 {
@@ -416,7 +423,7 @@ void ball_draw(const float *ball_M,
 
     /* Go to GREAT pains to ensure all layers are drawn back-to-front. */
 
-    ball_pass_outer(ball_M, pend_M, bill_M, ball_bill_M, pend_bill_M, t);
+    ball_pass_outer(rend, ball_M, pend_M, bill_M, ball_bill_M, pend_bill_M, t);
 }
 
 /*---------------------------------------------------------------------------*/
index d3a51cc..ac44494 100644 (file)
 #ifndef BALL_H
 #define BALL_H
 
+#include "solid_draw.h"
+
 /*---------------------------------------------------------------------------*/
 
 #define BALL_FUDGE 0.001f
 
 void ball_init(void);
 void ball_free(void);
-void ball_draw(const float *,
+
+void ball_draw(struct s_rend *,
+               const float *,
                const float *,
                const float *, float);
 
index db4fcb7..b26a0c1 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef FS_OV
 #define FS_OV
 
+#define OV_EXCLUDE_STATIC_CALLBACKS
 #include <vorbis/vorbisfile.h>
 
 size_t fs_ov_read(void *ptr, size_t size, size_t nmemb, void *datasource);
index 5d8ab3e..0e5a20d 100644 (file)
 #include "config.h"
 #include "video.h"
 
-#define PI 3.1415926535897932
+#include "solid_draw.h"
 
 /*---------------------------------------------------------------------------*/
 
-static GLuint mark_list;
+static const struct tex_env *curr_tex_env;
 
-void mark_init(void)
-{
-    int i, slices = 32;
+static void tex_env_conf_default(int, int);
+static void tex_env_conf_shadow(int, int);
+
+const struct tex_env tex_env_default = {
+    tex_env_conf_default,
+    1,
+    {
+        { GL_TEXTURE0, TEX_STAGE_TEXTURE }
+    }
+};
+
+const struct tex_env tex_env_shadow = {
+    tex_env_conf_shadow,
+    2,
+    {
+        { GL_TEXTURE0, TEX_STAGE_SHADOW },
+        { GL_TEXTURE1, TEX_STAGE_TEXTURE }
+    }
+};
 
-    mark_list = glGenLists(1);
+const struct tex_env tex_env_shadow_clip = {
+    tex_env_conf_shadow,
+    3,
+    {
+        { GL_TEXTURE0, TEX_STAGE_SHADOW },
+        { GL_TEXTURE1, TEX_STAGE_CLIP },
+        { GL_TEXTURE2, TEX_STAGE_TEXTURE }
+    }
+};
 
-    glNewList(mark_list, GL_COMPILE);
+static void tex_env_conf_default(int stage, int enable)
+{
+    switch (stage)
     {
-        glBegin(GL_TRIANGLE_FAN);
+    case TEX_STAGE_TEXTURE:
+        if (enable)
         {
-            glNormal3f(0.f, 1.f, 0.f);
+            glEnable(GL_TEXTURE_2D);
 
-            for (i = 0; i < slices; i++)
-            {
-                float x = fcosf(-2.f * PI * i / slices);
-                float y = fsinf(-2.f * PI * i / slices);
+            /* Modulate is the default mode. */
 
-                glVertex3f(x, 0, y);
-            }
+            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+
+            glMatrixMode(GL_TEXTURE);
+            glLoadIdentity();
+            glMatrixMode(GL_MODELVIEW);
+        }
+        else
+        {
+            glDisable(GL_TEXTURE_2D);
         }
-        glEnd();
+        break;
     }
-    glEndList();
 }
 
-void mark_draw(void)
+static void tex_env_conf_shadow(int stage, int enable)
 {
-    glEnable(GL_COLOR_MATERIAL);
-    glDisable(GL_TEXTURE_2D);
-    glDepthMask(GL_FALSE);
+    switch (stage)
     {
-        glCallList(mark_list);
-    }
-    glDepthMask(GL_TRUE);
-    glEnable(GL_TEXTURE_2D);
-    glDisable(GL_COLOR_MATERIAL);
-}
+    case TEX_STAGE_SHADOW:
+        if (enable)
+        {
+            glDisable(GL_TEXTURE_2D);
 
-void mark_free(void)
-{
-    if (glIsList(mark_list))
-        glDeleteLists(mark_list, 1);
+            /* Modulate primary color and shadow alpha. */
 
-    mark_list = 0;
-}
+            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
 
-/*---------------------------------------------------------------------------*/
+            glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_MODULATE);
+            glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
+            glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_TEXTURE);
+            glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
+            glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_ONE_MINUS_SRC_ALPHA);
 
-static GLuint goal_list;
+            /* Copy incoming alpha. */
 
-void goal_init(void)
-{
-    int i, n = 32;
+            glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
+            glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS);
+            glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
 
-    goal_list = glGenLists(1);
+            glMatrixMode(GL_TEXTURE);
+            glLoadIdentity();
+            glMatrixMode(GL_MODELVIEW);
+        }
+        else
+        {
+            glDisable(GL_TEXTURE_2D);
+        }
+        break;
 
-    glNewList(goal_list, GL_COMPILE);
-    {
-        glBegin(GL_QUAD_STRIP);
+    case TEX_STAGE_CLIP:
+        if (enable)
         {
-            for (i = 0; i <= n; i++)
-            {
-                float x = fcosf(2.f * PI * i / n);
-                float y = fsinf(2.f * PI * i / n);
+            glDisable(GL_TEXTURE_2D);
 
-                glColor4f(1.0f, 1.0f, 0.0f, 0.5f);
-                glVertex3f(x, 0.0f, y);
+            /* Interpolate shadowed and non-shadowed primary color. */
 
-                glColor4f(1.0f, 1.0f, 0.0f, 0.0f);
-                glVertex3f(x, GOAL_HEIGHT, y);
-            }
+            glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
+
+            glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
+            glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PREVIOUS);
+            glTexEnvi(GL_TEXTURE_ENV, GL_SRC1_RGB, GL_PRIMARY_COLOR);
+            glTexEnvi(GL_TEXTURE_ENV, GL_SRC2_RGB, GL_TEXTURE);
+            glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);
+            glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND1_RGB, GL_SRC_COLOR);
+            glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND2_RGB, GL_SRC_ALPHA);
+
+            /* Copy incoming alpha. */
+
+            glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
+            glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_PREVIOUS);
+            glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);
+
+            glMatrixMode(GL_TEXTURE);
+            glLoadIdentity();
+            glMatrixMode(GL_MODELVIEW);
+        }
+        else
+        {
+            glDisable(GL_TEXTURE_2D);
         }
-        glEnd();
+        break;
+
+    case TEX_STAGE_TEXTURE:
+        tex_env_conf_default(TEX_STAGE_TEXTURE, enable);
+        break;
     }
-    glEndList();
 }
 
-void goal_free(void)
+static void tex_env_conf(const struct tex_env *env, int enable)
 {
-    if (glIsList(goal_list))
-        glDeleteLists(goal_list, 1);
+    size_t i;
 
-    goal_list = 0;
+    for (i = 0; i < env->count; i++)
+    {
+        const struct tex_stage *st = &env->stages[i];
+        glActiveTexture_(st->unit);
+        glClientActiveTexture_(st->unit);
+        env->conf(st->stage, enable);
+    }
+
+    /* Last stage remains selected. */
 }
 
-void goal_draw(void)
+/*
+ * Set up current texture pipeline.
+ */
+void tex_env_active(const struct tex_env *env)
 {
-    glCallList(goal_list);
-}
+    if (curr_tex_env == env)
+        return;
 
-/*---------------------------------------------------------------------------*/
+    if (curr_tex_env)
+    {
+        tex_env_conf(curr_tex_env, 0);
+        curr_tex_env = NULL;
+    }
 
-static GLuint jump_list;
+    tex_env_conf(env, 1);
+    curr_tex_env = env;
+}
 
-void jump_init(void)
+/*
+ * Select stage of the current texture pipeline.
+ */
+int tex_env_stage(int stage)
 {
-    int k, i, n = 32;
-
-    jump_list = glGenLists(2);
+    size_t i;
 
-    for (k = 0; k < 2; k++)
+    if (curr_tex_env)
     {
-        glNewList(jump_list + k, GL_COMPILE);
+        for (i = 0; i < curr_tex_env->count; i++)
         {
-            glBegin(GL_QUAD_STRIP);
-            {
-                for (i = 0; i <= n; i++)
-                {
-                    float x = fcosf(2.f * PI * i / n);
-                    float y = fsinf(2.f * PI * i / n);
-
-                    glColor4f(0.75f, 0.5f, 1.0f, (k == 0 ? 0.5f : 0.8f));
-                    glVertex3f(x, 0.0f, y);
+            const struct tex_stage *st = &curr_tex_env->stages[i];
 
-                    glColor4f(1.0f, 1.0f, 1.0f, 0.0f);
-                    glVertex3f(x, JUMP_HEIGHT, y);
-                }
+            if (st->stage == stage)
+            {
+                glActiveTexture_(st->unit);
+                glClientActiveTexture_(st->unit);
+                return 1;
             }
-            glEnd();
         }
-        glEndList();
     }
+    return 0;
 }
 
-void jump_free(void)
+/*---------------------------------------------------------------------------*/
+
+static struct s_full beam;
+static struct s_full jump;
+static struct s_full goal;
+static struct s_full flag;
+static struct s_full mark;
+static struct s_full vect;
+static struct s_full back;
+
+static int back_state = 0;
+
+/*---------------------------------------------------------------------------*/
+
+void geom_init(void)
 {
-    glDeleteLists(jump_list, 2);
-    jump_list = 0;
+    sol_load_full(&beam, "geom/beam/beam.sol", 0);
+    sol_load_full(&jump, "geom/jump/jump.sol", 0);
+    sol_load_full(&goal, "geom/goal/goal.sol", 0);
+    sol_load_full(&flag, "geom/flag/flag.sol", 0);
+    sol_load_full(&mark, "geom/mark/mark.sol", 0);
+    sol_load_full(&vect, "geom/vect/vect.sol", 0);
 }
 
-void jump_draw(int highlight)
+void geom_free(void)
 {
-    glCallList(jump_list + highlight);
+    sol_free_full(&vect);
+    sol_free_full(&mark);
+    sol_free_full(&flag);
+    sol_free_full(&goal);
+    sol_free_full(&jump);
+    sol_free_full(&beam);
 }
 
 /*---------------------------------------------------------------------------*/
 
-static GLuint swch_list;
-
-static GLfloat swch_colors[8][4] = {
-    { 1.0f, 0.0f, 0.0f, 0.5f }, /* red out */
-    { 1.0f, 0.0f, 0.0f, 0.0f },
-    { 1.0f, 0.0f, 0.0f, 0.8f }, /* red in */
-    { 1.0f, 0.0f, 0.0f, 0.0f },
-    { 0.0f, 1.0f, 0.0f, 0.5f }, /* green out */
-    { 0.0f, 1.0f, 0.0f, 0.0f },
-    { 0.0f, 1.0f, 0.0f, 0.8f }, /* green in */
-    { 0.0f, 1.0f, 0.0f, 0.0f }};
-
-void swch_init(void)
+void back_init(const char *name)
 {
-    int k, i, n = 32;
+    if (back_state)
+        back_free();
 
-    swch_list = glGenLists(4);
+    /* Load the background SOL and modify its material in-place to use the   */
+    /* named gradient texture.                                               */
 
-    /* Create the display lists. */
+    sol_load_full(&back, "geom/back/back.sol", 0);
+    back.draw.mv[0].o = make_image_from_file(name);
 
-    for (k = 0; k < 4; k++)
-    {
-        glNewList(swch_list + k, GL_COMPILE);
-        {
-            glBegin(GL_QUAD_STRIP);
-            {
-                for (i = 0; i <= n; i++)
-                {
-                    float x = fcosf(2.f * PI * i / n);
-                    float y = fsinf(2.f * PI * i / n);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+
+    back_state = 1;
+}
 
-                    glColor4fv(swch_colors[2 * k + 0]);
-                    glVertex3f(x, 0.0f, y);
+void back_free(void)
+{
+    if (back_state)
+        sol_free_full(&back);
 
-                    glColor4fv(swch_colors[2 * k + 1]);
-                    glVertex3f(x, SWCH_HEIGHT, y);
-                }
-            }
-            glEnd();
-        }
-        glEndList();
-    }
+    back_state = 0;
 }
 
-void swch_free(void)
+/*---------------------------------------------------------------------------*/
+
+static void jump_part_draw(struct s_rend *rend, GLfloat s, GLfloat a)
 {
-    if (glIsList(swch_list))
-        glDeleteLists(swch_list, 4);
+    glMatrixMode(GL_TEXTURE);
+    glTranslatef(s, 0.0f, 0.0f);
+    glMatrixMode(GL_MODELVIEW);
 
-    swch_list = 0;
+    glRotatef(a, 0.0f, 1.0f, 0.0f);
+    sol_draw(&jump.draw, rend, 1, 1);
+    glScalef(0.9f, 0.9f, 0.9f);
 }
 
-void swch_draw(int b, int e)
+static void goal_part_draw(struct s_rend *rend, GLfloat s)
 {
-    glCallList(swch_list + b * 2 + e);
+    glMatrixMode(GL_TEXTURE);
+    glTranslatef(0.0f, -s, 0.0f);
+    glMatrixMode(GL_MODELVIEW);
+
+    sol_draw(&goal.draw, rend, 1, 1);
+    glScalef(0.8f, 1.1f, 0.8f);
 }
 
 /*---------------------------------------------------------------------------*/
 
-static GLuint flag_list;
-
-void flag_init(void)
+void goal_draw(struct s_rend *rend, float t)
 {
-    int i, n = 8;
-
-    flag_list = glGenLists(1);
-
-    glNewList(flag_list, GL_COMPILE);
+    glPushMatrix();
     {
-        glEnable(GL_COLOR_MATERIAL);
-        glDisable(GL_LIGHTING);
-        glDisable(GL_TEXTURE_2D);
-        {
-            glBegin(GL_TRIANGLES);
-            {
-                glColor3f(1.0f, 0.0f, 0.0f);
+        glScalef(1.0f, 3.0f, 1.0f);
+        glColor4f(1.0f, 1.0f, 0.0f, 0.5f);
 
-                glVertex3f(              0.0f, GOAL_HEIGHT,        0.0f);
-                glVertex3f(GOAL_HEIGHT * 0.2f, GOAL_HEIGHT * 0.9f, 0.0f);
-                glVertex3f(              0.0f, GOAL_HEIGHT * 0.8f, 0.0f);
+        sol_draw(&beam.draw, rend, 1, 1);
 
-                glVertex3f(              0.0f, GOAL_HEIGHT,        0.0f);
-                glVertex3f(              0.0f, GOAL_HEIGHT * 0.8f, 0.0f);
-                glVertex3f(GOAL_HEIGHT * 0.2f, GOAL_HEIGHT * 0.9f, 0.0f);
-            }
-            glEnd();
+        goal_part_draw(rend, t * 0.10f);
+        goal_part_draw(rend, t * 0.10f);
+        goal_part_draw(rend, t * 0.10f);
+        goal_part_draw(rend, t * 0.10f);
 
-            glBegin(GL_QUAD_STRIP);
-            {
-                for (i = 0; i <= n; i++)
-                {
-                    float x = fcosf(2.f * PI * i / n) * 0.01f;
-                    float y = fsinf(2.f * PI * i / n) * 0.01f;
-
-                    glColor3f(1.0f, 1.0f, 1.0f);
-                    glVertex3f(x, 0.0f,        y);
-                    glVertex3f(x, GOAL_HEIGHT, y);
-                }
-            }
-            glEnd();
-        }
-        glEnable(GL_TEXTURE_2D);
-        glEnable(GL_LIGHTING);
-        glDisable(GL_COLOR_MATERIAL);
+        glMatrixMode(GL_TEXTURE);
+        glLoadIdentity();
+        glMatrixMode(GL_MODELVIEW);
+
+        glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
     }
-    glEndList();
+    glPopMatrix();
 }
 
-void flag_free(void)
+void jump_draw(struct s_rend *rend, float t, int h)
 {
-    if (glIsList(flag_list))
-        glDeleteLists(flag_list, 1);
+    static GLfloat c[4][4] = {
+        { 0.75f, 0.5f, 1.0f, 0.5f },
+        { 0.75f, 0.5f, 1.0f, 0.8f },
+    };
 
-    flag_list = 0;
-}
+    glPushMatrix();
+    {
+        glColor4f(c[h][0], c[h][1], c[h][2], c[h][3]);
 
-void flag_draw(void)
-{
-    glCallList(flag_list);
-}
+        glScalef(1.0f, 2.0f, 1.0f);
 
-/*---------------------------------------------------------------------------*/
+        sol_draw(&beam.draw, rend, 1, 1);
 
-static GLuint clip_text;
+        jump_part_draw(rend, t * 0.15f, t * 360.0f);
+        jump_part_draw(rend, t * 0.20f, t * 360.0f);
+        jump_part_draw(rend, t * 0.25f, t * 360.0f);
 
-static GLubyte clip_data[] = { 0xff, 0xff, 0x0, 0x0 };
+        glMatrixMode(GL_TEXTURE);
+        glLoadIdentity();
+        glMatrixMode(GL_MODELVIEW);
 
-void clip_init(void)
-{
-    if (!glActiveTextureARB_)
-        return;
+        glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+    }
+    glPopMatrix();
+}
 
-    glActiveTextureARB_(GL_TEXTURE1_ARB);
-    {
-        glGenTextures(1, &clip_text);
-        glBindTexture(GL_TEXTURE_1D, clip_text);
+void swch_draw(struct s_rend *rend, int b, int e)
+{
+    static GLfloat c[4][4] = {
+        { 1.0f, 0.0f, 0.0f, 0.5f }, /* red out */
+        { 1.0f, 0.0f, 0.0f, 0.8f }, /* red in */
+        { 0.0f, 1.0f, 0.0f, 0.5f }, /* green out */
+        { 0.0f, 1.0f, 0.0f, 0.8f }, /* green in */
+    };
 
-        glTexImage1D(GL_TEXTURE_1D, 0,
-                     GL_LUMINANCE_ALPHA, 2, 0,
-                     GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, clip_data);
+    const int h = 2 * b + e;
 
-        glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
-        glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+    glPushMatrix();
+    {
+        glScalef(1.0f, 2.0f, 1.0f);
 
-        glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+        glColor4f(c[h][0], c[h][1], c[h][2], c[h][3]);
+        sol_draw(&beam.draw, rend, 1, 1);
+        glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
     }
-    glActiveTextureARB_(GL_TEXTURE0_ARB);
+    glPopMatrix();
 }
 
-void clip_free(void)
+void flag_draw(struct s_rend *rend)
 {
-    if (glIsTexture(clip_text))
-        glDeleteTextures(1, &clip_text);
+    glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+    sol_draw(&flag.draw, rend, 1, 1);
 }
 
-void clip_draw_set(void)
+void mark_draw(struct s_rend *rend)
 {
-    if (!glActiveTextureARB_)
-        return;
+    sol_draw(&mark.draw, rend, 1, 1);
+}
+
+void vect_draw(struct s_rend *rend)
+{
+    sol_draw(&vect.draw, rend, 0, 1);
+    sol_draw(&vect.draw, rend, 0, 0);
+}
 
-    glActiveTextureARB_(GL_TEXTURE1_ARB);
+void back_draw(struct s_rend *rend, float t)
+{
+    glPushMatrix();
     {
-        glBindTexture(GL_TEXTURE_1D, clip_text);
+        GLfloat dx =  60.0f * fsinf(t / 10.0f);
+        GLfloat dz = 180.0f * fsinf(t / 12.0f);
 
-        glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+        glDisable(GL_DEPTH_TEST);
+        glDisable(GL_CULL_FACE);
+        glDisable(GL_LIGHTING);
+        glDepthMask(GL_FALSE);
+        {
+            glScalef(-BACK_DIST, BACK_DIST, -BACK_DIST);
+            if (t) glRotatef(dz, 0.0f, 0.0f, 1.0f);
+            if (t) glRotatef(dx, 1.0f, 0.0f, 0.0f);
 
-        glEnable(GL_TEXTURE_GEN_S);
-        glEnable(GL_TEXTURE_1D);
+            sol_draw(&back.draw, rend, 1, 1);
+        }
+        glDepthMask(GL_TRUE);
+        glEnable(GL_LIGHTING);
+        glEnable(GL_CULL_FACE);
+        glEnable(GL_DEPTH_TEST);
     }
-    glActiveTextureARB_(GL_TEXTURE0_ARB);
+    glPopMatrix();
 }
 
-void clip_draw_clr(void)
+void back_draw_easy(void)
 {
-    if (!glActiveTextureARB_)
-        return;
+    struct s_rend rend = { NULL };
 
-    glActiveTextureARB_(GL_TEXTURE1_ARB);
-    {
-        glDisable(GL_TEXTURE_GEN_S);
-        glDisable(GL_TEXTURE_1D);
-    }
-    glActiveTextureARB_(GL_TEXTURE0_ARB);
+    sol_draw_enable(&rend);
+    back_draw(&rend, 0.0f);
+    sol_draw_disable(&rend);
 }
 
 /*---------------------------------------------------------------------------*/
@@ -369,6 +443,9 @@ void clip_draw_clr(void)
  */
 
 static GLuint shad_text;
+static GLuint clip_text;
+
+static GLubyte clip_data[] = { 0xff, 0xff, 0x0, 0x0 };
 
 void shad_init(void)
 {
@@ -376,83 +453,63 @@ void shad_init(void)
 
     if (config_get_d(CONFIG_SHADOW) == 2)
     {
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
     }
 
-    clip_init();
+    /* Create the clip texture. */
+
+    glGenTextures(1, &clip_text);
+    glBindTexture(GL_TEXTURE_2D, clip_text);
+
+    glTexImage2D(GL_TEXTURE_2D, 0,
+                 GL_LUMINANCE_ALPHA, 1, 2, 0,
+                 GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, clip_data);
+
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 }
 
 void shad_free(void)
 {
-    if (glIsTexture(shad_text))
-        glDeleteTextures(1, &shad_text);
-
-    clip_free();
+    glDeleteTextures(1, &shad_text);
+    glDeleteTextures(1, &clip_text);
 }
 
 void shad_draw_set(void)
 {
-    glBindTexture(GL_TEXTURE_2D, shad_text);
-
-    glMatrixMode(GL_TEXTURE);
+    if (tex_env_stage(TEX_STAGE_SHADOW))
     {
-        glLoadIdentity();
-    }
-    glMatrixMode(GL_MODELVIEW);
-
-    glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
-    glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+        glEnable(GL_TEXTURE_2D);
+        glBindTexture(GL_TEXTURE_2D, shad_text);
 
-    glEnable(GL_TEXTURE_GEN_S);
-    glEnable(GL_TEXTURE_GEN_T);
+        if (tex_env_stage(TEX_STAGE_CLIP))
+        {
+            glBindTexture(GL_TEXTURE_2D, clip_text);
+            glEnable(GL_TEXTURE_2D);
+        }
 
-    clip_draw_set();
+        tex_env_stage(TEX_STAGE_TEXTURE);
+    }
 }
 
 void shad_draw_clr(void)
 {
-    glDisable(GL_TEXTURE_GEN_S);
-    glDisable(GL_TEXTURE_GEN_T);
-
-    clip_draw_clr();
-}
-
-/*---------------------------------------------------------------------------*/
-
-void fade_draw(float k)
-{
-    if (k > 0.0f)
+    if (tex_env_stage(TEX_STAGE_SHADOW))
     {
-        int w = config_get_d(CONFIG_WIDTH);
-        int h = config_get_d(CONFIG_HEIGHT);
+        glBindTexture(GL_TEXTURE_2D, 0);
+        glDisable(GL_TEXTURE_2D);
 
-        video_push_ortho();
+        if (tex_env_stage(TEX_STAGE_CLIP))
         {
-            glEnable(GL_COLOR_MATERIAL);
-            glDisable(GL_LIGHTING);
-            glDisable(GL_DEPTH_TEST);
+            glBindTexture(GL_TEXTURE_2D, 0);
             glDisable(GL_TEXTURE_2D);
-
-            glColor4f(0.0f, 0.0f, 0.0f, k);
-
-            glBegin(GL_QUADS);
-            {
-                glVertex2i(0, 0);
-                glVertex2i(w, 0);
-                glVertex2i(w, h);
-                glVertex2i(0, h);
-            }
-            glEnd();
-
-            glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
-
-            glEnable(GL_TEXTURE_2D);
-            glEnable(GL_DEPTH_TEST);
-            glEnable(GL_LIGHTING);
-            glDisable(GL_COLOR_MATERIAL);
         }
-        video_pop_matrix();
+
+        tex_env_stage(TEX_STAGE_TEXTURE);
     }
 }
 
index 4d34073..3fa8d8e 100644 (file)
@@ -1,10 +1,14 @@
 #ifndef GEOM_H
 #define GEOM_H
 
+#include "solid_draw.h"
+
 /*---------------------------------------------------------------------------*/
 
 #define IMG_SHAD "png/shadow.png"
 
+#define BACK_DIST   256.0f
+#define FAR_DIST    512.0f
 #define JUMP_HEIGHT   2.00f
 #define SWCH_HEIGHT   2.00f
 #define GOAL_HEIGHT   3.00f
 
 /*---------------------------------------------------------------------------*/
 
-void mark_init(void);
-void mark_free(void);
-void mark_draw(void);
-
-/*---------------------------------------------------------------------------*/
-
-void goal_init(void);
-void goal_free(void);
-void goal_draw(void);
-
-/*---------------------------------------------------------------------------*/
-
-void jump_init(void);
-void jump_free(void);
-void jump_draw(int);
-
-/*---------------------------------------------------------------------------*/
+void geom_init(void);
+void geom_free(void);
 
-void swch_init(void);
-void swch_free(void);
-void swch_draw(int, int);
+void goal_draw(struct s_rend *, float);
+void jump_draw(struct s_rend *, float, int);
+void swch_draw(struct s_rend *, int, int);
+void flag_draw(struct s_rend *);
+void mark_draw(struct s_rend *);
+void vect_draw(struct s_rend *);
+void back_draw(struct s_rend *, float);
 
 /*---------------------------------------------------------------------------*/
 
-void flag_init(void);
-void flag_free(void);
-void flag_draw(void);
+void back_init(const char *s);
+void back_free(void);
+void back_draw_easy(void);
 
 /*---------------------------------------------------------------------------*/
 
@@ -49,6 +42,35 @@ void shad_draw_clr(void);
 
 /*---------------------------------------------------------------------------*/
 
+enum
+{
+    TEX_STAGE_TEXTURE,
+    TEX_STAGE_SHADOW,
+    TEX_STAGE_CLIP
+};
+
+struct tex_stage
+{
+    GLenum unit;
+    int stage;
+};
+
+struct tex_env
+{
+    void (*conf)(int, int);
+    size_t count;
+    struct tex_stage stages[4];
+};
+
+extern const struct tex_env tex_env_default;
+extern const struct tex_env tex_env_shadow;
+extern const struct tex_env tex_env_shadow_clip;
+
+void tex_env_active(const struct tex_env *);
+int  tex_env_stage(int);
+
+/*---------------------------------------------------------------------------*/
+
 void fade_draw(float);
 
 #endif
diff --git a/share/glext.c b/share/glext.c
new file mode 100644 (file)
index 0000000..9f726b8
--- /dev/null
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2003-2011 Neverball authors
+ *
+ * NEVERBALL is  free software; you can redistribute  it and/or modify
+ * it under the  terms of the GNU General  Public License as published
+ * by the Free  Software Foundation; either version 2  of the License,
+ * or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of
+ * MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU
+ * General Public License for more details.
+ */
+
+#include <SDL.h>
+#include <stdio.h>
+
+#include "glext.h"
+
+struct gl_info gli;
+
+/*---------------------------------------------------------------------------*/
+
+#if !ENABLE_OPENGLES
+
+PFNGLCLIENTACTIVETEXTURE_PROC glClientActiveTexture_;
+PFNGLACTIVETEXTURE_PROC       glActiveTexture_;
+
+PFNGLGENBUFFERS_PROC          glGenBuffers_;
+PFNGLBINDBUFFER_PROC          glBindBuffer_;
+PFNGLBUFFERDATA_PROC          glBufferData_;
+PFNGLBUFFERSUBDATA_PROC       glBufferSubData_;
+PFNGLDELETEBUFFERS_PROC       glDeleteBuffers_;
+PFNGLISBUFFER_PROC            glIsBuffer_;
+
+PFNGLPOINTPARAMETERFV_PROC    glPointParameterfv_;
+
+#endif
+
+/*---------------------------------------------------------------------------*/
+
+int glext_check(const char *needle)
+{
+    const GLubyte *haystack, *c;
+
+    /* Search for the given string in the OpenGL extension strings. */
+
+    for (haystack = glGetString(GL_EXTENSIONS); *haystack; haystack++)
+    {
+        for (c = (const GLubyte *) needle; *c && *haystack; c++, haystack++)
+            if (*c != *haystack)
+                break;
+
+        if ((*c == 0) && (*haystack == ' ' || *haystack == '\0'))
+            return 1;
+    }
+
+    return 0;
+}
+
+int glext_assert(const char *ext)
+{
+    if (!glext_check(ext))
+    {
+        fprintf(stderr, "Missing required OpenGL extension (%s)\n", ext);
+        return 0;
+    }
+    return 1;
+}
+
+/*---------------------------------------------------------------------------*/
+
+#define SDL_GL_GFPA(fun, str) do {       \
+    ptr = SDL_GL_GetProcAddress(str);    \
+    memcpy(&fun, &ptr, sizeof (void *)); \
+} while(0)
+
+/*---------------------------------------------------------------------------*/
+
+int glext_init(void)
+{
+    void *ptr = 0;
+
+    memset(&gli, 0, sizeof (struct gl_info));
+
+    /* Common init. */
+
+    gli.max_texture_units = 1;
+    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &gli.max_texture_size);
+
+#if !ENABLE_OPENGLES
+    /* Desktop init. */
+
+    if (glext_assert("ARB_multitexture"))
+    {
+        glGetIntegerv(GL_MAX_TEXTURE_UNITS, &gli.max_texture_units);
+
+        SDL_GL_GFPA(glClientActiveTexture_, "glClientActiveTextureARB");
+        SDL_GL_GFPA(glActiveTexture_,       "glActiveTextureARB");
+
+        gli.multitexture = 1;
+    }
+
+    if (glext_assert("ARB_vertex_buffer_object"))
+    {
+        SDL_GL_GFPA(glGenBuffers_,          "glGenBuffersARB");
+        SDL_GL_GFPA(glBindBuffer_,          "glBindBufferARB");
+        SDL_GL_GFPA(glBufferData_,          "glBufferDataARB");
+        SDL_GL_GFPA(glBufferSubData_,       "glBufferSubDataARB");
+        SDL_GL_GFPA(glDeleteBuffers_,       "glDeleteBuffersARB");
+        SDL_GL_GFPA(glIsBuffer_,            "glIsBufferARB");
+
+        gli.vertex_buffer_object = 1;
+    }
+
+    if (glext_assert("ARB_point_parameters"))
+    {
+        SDL_GL_GFPA(glPointParameterfv_,   "glPointParameterfvARB");
+
+        gli.point_parameters = 1;
+    }
+
+    return (gli.multitexture &&
+            gli.vertex_buffer_object &&
+            gli.point_parameters);
+#else
+    /* GLES init. */
+
+    glGetIntegerv(GL_MAX_TEXTURE_UNITS, &gli.max_texture_units);
+
+    gli.multitexture = 1;
+    gli.vertex_buffer_object = 1;
+    gli.point_parameters = 1;
+
+    return 1;
+#endif
+}
+
+/*---------------------------------------------------------------------------*/
+
+void glClipPlane4f_(GLenum p, GLfloat a, GLfloat b, GLfloat c, GLfloat d)
+{
+#if ENABLE_OPENGLES
+
+    GLfloat v[4];
+
+    v[0] = a;
+    v[1] = b;
+    v[2] = c;
+    v[3] = d;
+
+    glClipPlanef(p, v);
+
+#else
+
+    GLdouble v[4];
+
+    v[0] = a;
+    v[1] = b;
+    v[2] = c;
+    v[3] = d;
+
+    glClipPlane(p, v);
+
+#endif
+}
+
+/*---------------------------------------------------------------------------*/
index 732be1b..63d7419 100644 (file)
@@ -1,10 +1,25 @@
+/*
+ * Copyright (C) 2003-2011 Neverball authors
+ *
+ * NEVERBALL is  free software; you can redistribute  it and/or modify
+ * it under the  terms of the GNU General  Public License as published
+ * by the Free  Software Foundation; either version 2  of the License,
+ * or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT  ANY  WARRANTY;  without   even  the  implied  warranty  of
+ * MERCHANTABILITY or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU
+ * General Public License for more details.
+ */
+
 #ifndef GLEXT_H
 #define GLEXT_H
 
 /*---------------------------------------------------------------------------*/
+/* Include the system OpenGL headers.                                        */
 
 #ifdef _WIN32
-#define WIN32_LEAN_AND_MEAN /* Ha ha. */
+#define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #endif
 
 
 /*---------------------------------------------------------------------------*/
 
-#ifndef GL_ARB_multitexture
-#define GL_TEXTURE0_ARB                   0x84C0
-#define GL_TEXTURE1_ARB                   0x84C1
+#ifndef GL_MULTISAMPLE
+#define GL_MULTISAMPLE                0x809D
+#endif
+
+#ifndef GL_TEXTURE0
+#define GL_TEXTURE0                   0x84C0
+#endif
+
+#ifndef GL_TEXTURE1
+#define GL_TEXTURE1                   0x84C1
+#endif
+
+#ifndef GL_TEXTURE2
+#define GL_TEXTURE2                   0x84C2
+#endif
+
+#ifndef GL_ARRAY_BUFFER
+#define GL_ARRAY_BUFFER               0x8892
+#endif
+
+#ifndef GL_ELEMENT_ARRAY_BUFFER
+#define GL_ELEMENT_ARRAY_BUFFER       0x8893
+#endif
+
+#ifndef GL_STATC_DRAW
+#define GL_STATIC_DRAW                0x88E4
 #endif
 
-typedef void (*PFNGLACTIVETEXTUREARBPROC)(GLenum);
+#ifndef GL_DYNAMIC_DRAW
+#define GL_DYNAMIC_DRAW               0x88E8
+#endif
+
+#ifndef GL_POINT_SPRITE
+#define GL_POINT_SPRITE               0x8861
+#endif
+
+#ifndef GL_COORD_REPLACE
+#define GL_COORD_REPLACE              0x8862
+#endif
+
+#ifndef GL_POINT_DISTANCE_ATTENUATIAN
+#define GL_POINT_DISTANCE_ATTENUATION 0x8129
+#endif
+
+/*---------------------------------------------------------------------------*/
+
+int glext_check(const char *);
+int glext_init(void);
+
+/*---------------------------------------------------------------------------*/
+
+/* Exercise extreme paranoia in defining a cross-platform OpenGL interface.  */
+/* If we're compiling against OpenGL ES then we must assume native linkage   */
+/* of the extensions we use. Otherwise, GetProc them regardless of whether   */
+/* they need it or not.                                                      */
+
+#if defined(GL_VERSION_ES_CM_1_0) || \
+    defined(GL_VERSION_ES_CM_1_1) || \
+    defined(GL_OES_VERSION_1_0)
+
+#define ENABLE_OPENGLES 1
+
+#define glClientActiveTexture_ glClientActiveTexture
+#define glActiveTexture_       glActiveTexture
+#define glGenBuffers_          glGenBuffers
+#define glBindBuffer_          glBindBuffer
+#define glBufferData_          glBufferData
+#define glBufferSubData_       glBufferSubData
+#define glDeleteBuffers_       glDeleteBuffers
+#define glIsBuffer_            glIsBuffer
+#define glPointParameterfv_    glPointParameterfv
 
-extern PFNGLACTIVETEXTUREARBPROC glActiveTextureARB_;
+#define glOrtho_               glOrthof
+
+#else /* No native linkage?  Define the extension API. */
+
+#define glOrtho_               glOrtho
 
 /*---------------------------------------------------------------------------*/
+/* ARB_multitexture                                                          */
+
+typedef void (*PFNGLACTIVETEXTURE_PROC)(GLenum);
+typedef void (*PFNGLCLIENTACTIVETEXTURE_PROC)(GLenum);
 
+extern PFNGLCLIENTACTIVETEXTURE_PROC glClientActiveTexture_;
+extern PFNGLACTIVETEXTURE_PROC       glActiveTexture_;
+
+/*---------------------------------------------------------------------------*/
+/* ARB_vertex_buffer_object                                                  */
+
+typedef void      (*PFNGLGENBUFFERS_PROC)(GLsizei, GLuint *);
+typedef void      (*PFNGLBINDBUFFER_PROC)(GLenum, GLuint);
+typedef void      (*PFNGLBUFFERDATA_PROC)(GLenum, GLsizeiptr, const GLvoid *, GLenum);
+typedef void      (*PFNGLBUFFERSUBDATA_PROC)(GLenum, GLintptr, GLsizeiptr, const GLvoid *);
+typedef void      (*PFNGLDELETEBUFFERS_PROC)(GLsizei, const GLuint *);
+typedef GLboolean (*PFNGLISBUFFER_PROC)(GLuint);
+
+extern PFNGLGENBUFFERS_PROC    glGenBuffers_;
+extern PFNGLBINDBUFFER_PROC    glBindBuffer_;
+extern PFNGLBUFFERDATA_PROC    glBufferData_;
+extern PFNGLBUFFERSUBDATA_PROC glBufferSubData_;
+extern PFNGLDELETEBUFFERS_PROC glDeleteBuffers_;
+extern PFNGLISBUFFER_PROC      glIsBuffer_;
+
+/*---------------------------------------------------------------------------*/
+/* ARB_point_parameters                                                      */
+
+typedef void (*PFNGLPOINTPARAMETERFV_PROC)(GLenum, const GLfloat *);
+
+extern PFNGLPOINTPARAMETERFV_PROC glPointParameterfv_;
+
+/*---------------------------------------------------------------------------*/
+#endif /* !ENABLE_OPENGLES */
+
+void glClipPlane4f_(GLenum, GLfloat, GLfloat, GLfloat, GLfloat);
+
+/*---------------------------------------------------------------------------*/
+
+struct gl_info
+{
+    GLint max_texture_units;
+    GLint max_texture_size;
+
+    unsigned int multitexture:1;
+    unsigned int vertex_buffer_object:1;
+    unsigned int point_parameters:1;
+};
+
+extern struct gl_info gli;
+
+/*---------------------------------------------------------------------------*/
 #endif
index 8749c46..8ac72d5 100644 (file)
 
 /*---------------------------------------------------------------------------*/
 
-#define MAXWIDGET 256
+/* Very pure colors for the GUI. I was watching BANZAI when I designed this. */
+
+const GLubyte gui_wht[4] = { 0xFF, 0xFF, 0xFF, 0xFF };  /* White  */
+const GLubyte gui_yel[4] = { 0xFF, 0xFF, 0x00, 0xFF };  /* Yellow */
+const GLubyte gui_red[4] = { 0xFF, 0x00, 0x00, 0xFF };  /* Red    */
+const GLubyte gui_grn[4] = { 0x00, 0xFF, 0x00, 0xFF };  /* Green  */
+const GLubyte gui_blu[4] = { 0x00, 0x00, 0xFF, 0xFF };  /* Blue   */
+const GLubyte gui_blk[4] = { 0x00, 0x00, 0x00, 0xFF };  /* Black  */
+const GLubyte gui_gry[4] = { 0x55, 0x55, 0x55, 0xFF };  /* Gray   */
+const GLubyte gui_shd[4] = { 0x00, 0x00, 0x00, 0x80 };  /* Shadow */
+
+/*---------------------------------------------------------------------------*/
+
+#define WIDGET_MAX 256
 
 #define GUI_TYPE 0xFFFC
 
-#define GUI_FREE   0
+#define GUI_FREE  0
 
 #define GUI_STATE 1
 #define GUI_FILL  2
@@ -53,6 +66,8 @@
 
 #define GUI_LINES 8
 
+/*---------------------------------------------------------------------------*/
+
 struct widget
 {
     int     type;
@@ -61,52 +76,42 @@ struct widget
     int     size;
     int     rect;
 
+    const GLubyte *color0;
+    const GLubyte *color1;
+
     int     x, y;
     int     w, h;
     int     car;
     int     cdr;
 
-    GLuint  text_img;
-    GLuint  text_obj;
-    GLuint  rect_obj;
-
-    const GLfloat *color0;
-    const GLfloat *color1;
+    GLuint  image;
+    GLfloat scale;
 
-    GLfloat  scale;
-
-    int text_obj_w;
-    int text_obj_h;
+    int     text_w;
+    int     text_h;
 
     enum trunc trunc;
 };
 
 /*---------------------------------------------------------------------------*/
 
-const GLfloat gui_wht[4] = { 1.0f, 1.0f, 1.0f, 1.0f };
-const GLfloat gui_yel[4] = { 1.0f, 1.0f, 0.0f, 1.0f };
-const GLfloat gui_red[4] = { 1.0f, 0.0f, 0.0f, 1.0f };
-const GLfloat gui_grn[4] = { 0.0f, 1.0f, 0.0f, 1.0f };
-const GLfloat gui_blu[4] = { 0.0f, 0.0f, 1.0f, 1.0f };
-const GLfloat gui_blk[4] = { 0.0f, 0.0f, 0.0f, 1.0f };
-const GLfloat gui_gry[4] = { 0.3f, 0.3f, 0.3f, 1.0f };
-
-/*---------------------------------------------------------------------------*/
+/* GUI widget state */
 
-static struct widget widget[MAXWIDGET];
+static struct widget widget[WIDGET_MAX];
 static int           active;
 static int           radius;
 static TTF_Font     *font[3] = { NULL, NULL, NULL };
 
+/* Digit widgets for the HUD. */
+
+static int digit_id[3][11];
+
+/* Font data access. */
+
 static void      *fontdata;
 static int        fontdatalen;
 static SDL_RWops *fontrwops;
 
-static GLuint digit_text[3][11];
-static GLuint digit_list[3][11];
-static int    digit_w[3][11];
-static int    digit_h[3][11];
-
 /*---------------------------------------------------------------------------*/
 
 static int gui_hot(int id)
@@ -115,119 +120,180 @@ static int gui_hot(int id)
 }
 
 /*---------------------------------------------------------------------------*/
-/*
- * Initialize a  display list  containing a  rectangle (x, y, w, h) to
- * which a  rendered-font texture  may be applied.   Colors  c0 and c1
- * determine the top-to-bottom color gradient of the text.
- */
 
-static GLuint gui_list(int x, int y,
-                       int w, int h, const float *c0, const float *c1)
-{
-    GLuint list = glGenLists(1);
+/* Vertex buffer definitions for widget rendering. */
 
-    GLfloat s0, t0;
-    GLfloat s1, t1;
+#define RECT_LEN 36
+#define TEXT_LEN 8
+#define WIDGET_LEN (RECT_LEN + TEXT_LEN)
 
-    int W, H, ww, hh, d = h / 16;
+struct vert
+{
+    GLubyte c[4];
+    GLfloat u[2];
+    GLshort p[2];
+};
 
-    /* Assume the applied texture size is rect size rounded to power-of-two. */
+static struct vert vert_buf[WIDGET_MAX * WIDGET_LEN];
+static GLuint      vert_obj = 0;
 
-    image_size(&W, &H, w, h);
+/*---------------------------------------------------------------------------*/
 
-    ww = ((W - w) % 2) ? w + 1 : w;
-    hh = ((H - h) % 2) ? h + 1 : h;
+static void set_vert(struct vert *v, int x, int y,
+                     GLfloat s, GLfloat t, const GLubyte *c)
+{
+    v->c[0] = c[0];
+    v->c[1] = c[1];
+    v->c[2] = c[2];
+    v->c[3] = c[3];
+    v->u[0] = s;
+    v->u[1] = t;
+    v->p[0] = x;
+    v->p[1] = y;
+}
 
-    s0 = 0.5f * (W - ww) / W;
-    t0 = 0.5f * (H - hh) / H;
-    s1 = 1.0f - s0;
-    t1 = 1.0f - t0;
+/*---------------------------------------------------------------------------*/
 
-    glNewList(list, GL_COMPILE);
+static void draw_enable(GLboolean c, GLboolean u, GLboolean p)
+{
+    glBindBuffer_(GL_ARRAY_BUFFER, vert_obj);
+
+    if (c)
     {
-        glBegin(GL_QUADS);
-        {
-            glColor4f(0.0f, 0.0f, 0.0f, 0.5f);
-            glTexCoord2f(s0, t1); glVertex2i(x      + d, y      - d);
-            glTexCoord2f(s1, t1); glVertex2i(x + ww + d, y      - d);
-            glTexCoord2f(s1, t0); glVertex2i(x + ww + d, y + hh - d);
-            glTexCoord2f(s0, t0); glVertex2i(x      + d, y + hh - d);
-
-            glColor4fv(c0);
-            glTexCoord2f(s0, t1); glVertex2i(x,      y);
-            glTexCoord2f(s1, t1); glVertex2i(x + ww, y);
-
-            glColor4fv(c1);
-            glTexCoord2f(s1, t0); glVertex2i(x + ww, y + hh);
-            glTexCoord2f(s0, t0); glVertex2i(x,      y + hh);
-        }
-        glEnd();
+        glEnableClientState(GL_COLOR_ARRAY);
+        glColorPointer   (4, GL_UNSIGNED_BYTE, sizeof (struct vert),
+                                  (GLvoid *) offsetof (struct vert, c));
+    }
+    if (u)
+    {
+        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+        glTexCoordPointer(2, GL_FLOAT,         sizeof (struct vert),
+                                  (GLvoid *) offsetof (struct vert, u));
     }
-    glEndList();
+    if (p)
+    {
+        glEnableClientState(GL_VERTEX_ARRAY);
+        glVertexPointer  (2, GL_SHORT,         sizeof (struct vert),
+                                  (GLvoid *) offsetof (struct vert, p));
+    }
+}
+
+static void draw_rect(int id)
+{
+    glDrawArrays(GL_TRIANGLE_STRIP, id * WIDGET_LEN,  RECT_LEN);
+}
 
-    return list;
+static void draw_text(int id)
+{
+    glDrawArrays(GL_TRIANGLE_STRIP, id * WIDGET_LEN + RECT_LEN, TEXT_LEN);
 }
 
-/*
- * Initialize a display list containing a rounded-corner rectangle (x,
- * y, w, h).  Generate texture coordinates to properly apply a texture
- * map to the rectangle as though the corners were not rounded.
- */
+static void draw_disable(void)
+{
+    glBindBuffer_(GL_ARRAY_BUFFER, 0);
+
+    glDisableClientState(GL_VERTEX_ARRAY);
+    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+    glDisableClientState(GL_COLOR_ARRAY);
+}
+
+/*---------------------------------------------------------------------------*/
 
-static GLuint gui_rect(int x, int y, int w, int h, int f, int r)
+static void gui_rect(int id, int x, int y, int w, int h, int f, int r)
 {
-    GLuint list = glGenLists(1);
+    struct vert *v = vert_buf + id * WIDGET_LEN;
+    struct vert *p = v;
+
+    /* Generate vertex data for the widget's rounded rectangle. */
 
     int n = 8;
     int i;
 
-    glNewList(list, GL_COMPILE);
+    /* Left side... */
+
+    for (i = 0; i <= n; i++)
     {
-        glBegin(GL_QUAD_STRIP);
-        {
-            /* Left side... */
+        float a = 0.5f * V_PI * (float) i / (float) n;
+        float s = r * fsinf(a);
+        float c = r * fcosf(a);
 
-            for (i = 0; i <= n; i++)
-            {
-                float a = 0.5f * V_PI * (float) i / (float) n;
-                float s = r * fsinf(a);
-                float c = r * fcosf(a);
+        float X  = x     + r - c;
+        float Ya = y + h + ((f & GUI_NW) ? (s - r) : 0);
+        float Yb = y     + ((f & GUI_SW) ? (r - s) : 0);
 
-                float X  = x     + r - c;
-                float Ya = y + h + ((f & GUI_NW) ? (s - r) : 0);
-                float Yb = y     + ((f & GUI_SW) ? (r - s) : 0);
+        set_vert(p++, X, Ya, (X - x) / w, (Ya - y) / h, gui_wht);
+        set_vert(p++, X, Yb, (X - x) / w, (Yb - y) / h, gui_wht);
+    }
 
-                glTexCoord2f((X - x) / w, (Ya - y) / h);
-                glVertex2f(X, Ya);
+    /* Right side... */
 
-                glTexCoord2f((X - x) / w, (Yb - y) / h);
-                glVertex2f(X, Yb);
-            }
+    for (i = 0; i <= n; i++)
+    {
+        float a = 0.5f * V_PI * (float) i / (float) n;
+        float s = r * fsinf(a);
+        float c = r * fcosf(a);
 
-            /* ... Right side. */
+        float X  = x + w - r + s;
+        float Ya = y + h + ((f & GUI_NE) ? (c - r) : 0);
+        float Yb = y     + ((f & GUI_SE) ? (r - c) : 0);
 
-            for (i = 0; i <= n; i++)
-            {
-                float a = 0.5f * V_PI * (float) i / (float) n;
-                float s = r * fsinf(a);
-                float c = r * fcosf(a);
+        set_vert(p++, X, Ya, (X - x) / w, (Ya - y) / h, gui_wht);
+        set_vert(p++, X, Yb, (X - x) / w, (Yb - y) / h, gui_wht);
+    }
 
-                float X  = x + w - r + s;
-                float Ya = y + h + ((f & GUI_NE) ? (c - r) : 0);
-                float Yb = y     + ((f & GUI_SE) ? (r - c) : 0);
+    /* Copy this off to the VBO. */
 
-                glTexCoord2f((X - x) / w, (Ya - y) / h);
-                glVertex2f(X, Ya);
+    glBindBuffer_   (GL_ARRAY_BUFFER, vert_obj);
+    glBufferSubData_(GL_ARRAY_BUFFER,
+                     id * WIDGET_LEN * sizeof (struct vert),
+                            RECT_LEN * sizeof (struct vert), v);
+}
+
+static void gui_text(int id, int x, int y,
+                             int w, int h, const GLubyte *c0, const GLubyte *c1)
+{
+    struct vert *v = vert_buf + id * WIDGET_LEN + RECT_LEN;
+
+    /* Assume the applied texture size is rect size rounded to power-of-two. */
+
+    int W;
+    int H;
+
+    image_size(&W, &H, w, h);
+
+    if (w > 0 && h > 0 && W > 0 && H > 0)
+    {
+        const int d = h / 16;  /* Shadow offset */
+
+        const int ww = ((W - w) % 2) ? w + 1 : w;
+        const int hh = ((H - h) % 2) ? h + 1 : h;
+
+        const GLfloat s0 = 0.5f * (W - ww) / W;
+        const GLfloat t0 = 0.5f * (H - hh) / H;
+        const GLfloat s1 = 1.0f - s0;
+        const GLfloat t1 = 1.0f - t0;
+
+        /* Generate vertex data for the colored text and its shadow. */
+
+        set_vert(v + 0, x      + d, y + hh - d, s0, t0, gui_shd);
+        set_vert(v + 1, x      + d, y      - d, s0, t1, gui_shd);
+        set_vert(v + 2, x + ww + d, y + hh - d, s1, t0, gui_shd);
+        set_vert(v + 3, x + ww + d, y      - d, s1, t1, gui_shd);
+
+        set_vert(v + 4, x,          y + hh,     s0, t0, c1);
+        set_vert(v + 5, x,          y,          s0, t1, c0);
+        set_vert(v + 6, x + ww,     y + hh,     s1, t0, c1);
+        set_vert(v + 7, x + ww,     y,          s1, t1, c0);
 
-                glTexCoord2f((X - x) / w, (Yb - y) / h);
-                glVertex2f(X, Yb);
-            }
-        }
-        glEnd();
     }
-    glEndList();
+    else memset(v, 0, TEXT_LEN * sizeof (struct vert));
 
-    return list;
+    /* Copy this off to the VBO. */
+
+    glBindBuffer_   (GL_ARRAY_BUFFER, vert_obj);
+    glBufferSubData_(GL_ARRAY_BUFFER,
+                     (id * WIDGET_LEN + RECT_LEN) * sizeof (struct vert),
+                                        TEXT_LEN  * sizeof (struct vert), v);
 }
 
 /*---------------------------------------------------------------------------*/
@@ -251,12 +317,10 @@ static const char *pick_font_path(void)
 
 void gui_init(void)
 {
-    const float *c0 = gui_yel;
-    const float *c1 = gui_red;
-
     int w = config_get_d(CONFIG_WIDTH);
     int h = config_get_d(CONFIG_HEIGHT);
-    int i, j, s = (h < w) ? h : w;
+    int s = (h < w) ? h : w;
+    int i, j;
 
     /* Initialize font rendering. */
 
@@ -268,7 +332,7 @@ void gui_init(void)
         int s1 = s / 13;
         int s2 = s /  7;
 
-        memset(widget, 0, sizeof (struct widget) * MAXWIDGET);
+        memset(widget, 0, sizeof (struct widget) * WIDGET_MAX);
 
         /* Load the font. */
 
@@ -300,81 +364,62 @@ void gui_init(void)
         }
 
         radius = s / 60;
+    }
 
-        /* Initialize digit glyphs and lists for counters and clocks. */
+    /* Initialize the VBOs. */
 
-        for (i = 0; i < 3; i++)
-        {
-            char text[2];
+    memset(vert_buf, 0, sizeof (vert_buf));
 
-            /* Draw digits 0 through 9. */
-
-            for (j = 0; j < 10; j++)
-            {
-                text[0] = '0' + (char) j;
-                text[1] =  0;
-
-                digit_text[i][j] = make_image_from_font(NULL, NULL,
-                                                        &digit_w[i][j],
-                                                        &digit_h[i][j],
-                                                        text, font[i]);
-                digit_list[i][j] = gui_list(-digit_w[i][j] / 2,
-                                            -digit_h[i][j] / 2,
-                                            +digit_w[i][j],
-                                            +digit_h[i][j], c0, c1);
-            }
+    glGenBuffers_(1,              &vert_obj);
+    glBindBuffer_(GL_ARRAY_BUFFER, vert_obj);
+    glBufferData_(GL_ARRAY_BUFFER, sizeof (vert_buf), vert_buf, GL_STATIC_DRAW);
+    glBindBuffer_(GL_ARRAY_BUFFER, 0);
 
-            /* Draw the colon for the clock. */
+    /* Cache digit glyphs for HUD rendering. */
 
-            digit_text[i][j] = make_image_from_font(NULL, NULL,
-                                                    &digit_w[i][10],
-                                                    &digit_h[i][10],
-                                                    ":", font[i]);
-            digit_list[i][j] = gui_list(-digit_w[i][10] / 2,
-                                        -digit_h[i][10] / 2,
-                                        +digit_w[i][10],
-                                        +digit_h[i][10], c0, c1);
-        }
+    for (i = 0; i < 3; i++)
+    {
+        digit_id[i][ 0] = gui_label(0, "0", i, 0, 0, 0);
+        digit_id[i][ 1] = gui_label(0, "1", i, 0, 0, 0);
+        digit_id[i][ 2] = gui_label(0, "2", i, 0, 0, 0);
+        digit_id[i][ 3] = gui_label(0, "3", i, 0, 0, 0);
+        digit_id[i][ 4] = gui_label(0, "4", i, 0, 0, 0);
+        digit_id[i][ 5] = gui_label(0, "5", i, 0, 0, 0);
+        digit_id[i][ 6] = gui_label(0, "6", i, 0, 0, 0);
+        digit_id[i][ 7] = gui_label(0, "7", i, 0, 0, 0);
+        digit_id[i][ 8] = gui_label(0, "8", i, 0, 0, 0);
+        digit_id[i][ 9] = gui_label(0, "9", i, 0, 0, 0);
+        digit_id[i][10] = gui_label(0, ":", i, 0, 0, 0);
     }
 
+    for (i = 0; i < 3; i++)
+        for (j = 0; j < 11; ++j)
+            gui_layout(digit_id[i][j], 0, 0);
+
     active = 0;
 }
 
 void gui_free(void)
 {
-    int i, j, id;
+    int id;
 
-    /* Release any remaining widget texture and display list indices. */
+    /* Release the VBOs. */
 
-    for (id = 1; id < MAXWIDGET; id++)
-    {
-        if (glIsTexture(widget[id].text_img))
-            glDeleteTextures(1, &widget[id].text_img);
-
-        if (glIsList(widget[id].text_obj))
-            glDeleteLists(widget[id].text_obj, 1);
-        if (glIsList(widget[id].rect_obj))
-            glDeleteLists(widget[id].rect_obj, 1);
-
-        widget[id].type     = GUI_FREE;
-        widget[id].text_img = 0;
-        widget[id].text_obj = 0;
-        widget[id].rect_obj = 0;
-        widget[id].cdr      = 0;
-        widget[id].car      = 0;
-    }
+    if (glIsBuffer_(vert_obj))
+        glDeleteBuffers_(1, &vert_obj);
 
-    /* Release all digit textures and display lists. */
+    /* Release any remaining widget texture and display list indices. */
 
-    for (i = 0; i < 3; i++)
-        for (j = 0; j < 11; j++)
-        {
-            if (glIsTexture(digit_text[i][j]))
-                glDeleteTextures(1, &digit_text[i][j]);
+    for (id = 1; id < WIDGET_MAX; id++)
+    {
+        if (glIsTexture(widget[id].image))
+            glDeleteTextures(1, &widget[id].image);
 
-            if (glIsList(digit_list[i][j]))
-                glDeleteLists(digit_list[i][j], 1);
-        }
+        widget[id].type  = GUI_FREE;
+        widget[id].image = 0;
+        widget[id].cdr   = 0;
+        widget[id].car   = 0;
+    }
 
     /* Release all loaded fonts and finalize font rendering. */
 
@@ -396,28 +441,25 @@ static int gui_widget(int pd, int type)
 
     /* Find an unused entry in the widget table. */
 
-    for (id = 1; id < MAXWIDGET; id++)
+    for (id = 1; id < WIDGET_MAX; id++)
         if (widget[id].type == GUI_FREE)
         {
             /* Set the type and default properties. */
 
-            widget[id].type     = type;
-            widget[id].token    = 0;
-            widget[id].value    = 0;
-            widget[id].size     = 0;
-            widget[id].rect     = GUI_NW | GUI_SW | GUI_NE | GUI_SE;
-            widget[id].w        = 0;
-            widget[id].h        = 0;
-            widget[id].text_img = 0;
-            widget[id].text_obj = 0;
-            widget[id].rect_obj = 0;
-            widget[id].color0   = gui_wht;
-            widget[id].color1   = gui_wht;
-            widget[id].scale    = 1.0f;
-            widget[id].trunc    = TRUNC_NONE;
-
-            widget[id].text_obj_w = 0;
-            widget[id].text_obj_h = 0;
+            widget[id].type   = type;
+            widget[id].token  = 0;
+            widget[id].value  = 0;
+            widget[id].size   = 0;
+            widget[id].rect   = GUI_NW | GUI_SW | GUI_NE | GUI_SE;
+            widget[id].w      = 0;
+            widget[id].h      = 0;
+            widget[id].image  = 0;
+            widget[id].color0 = gui_wht;
+            widget[id].color1 = gui_wht;
+            widget[id].scale  = 1.0f;
+            widget[id].trunc  = TRUNC_NONE;
+            widget[id].text_w = 0;
+            widget[id].text_h = 0;
 
             /* Insert the new widget into the parent's widget list. */
 
@@ -454,7 +496,6 @@ struct size
     int w, h;
 };
 
-
 static struct size gui_measure(const char *text, TTF_Font *font)
 {
     struct size size = { 0, 0 };
@@ -549,34 +590,32 @@ static char *gui_truncate(const char *text,
 
 void gui_set_image(int id, const char *file)
 {
-    if (glIsTexture(widget[id].text_img))
-        glDeleteTextures(1, &widget[id].text_img);
+    if (glIsTexture(widget[id].image))
+        glDeleteTextures(1, &widget[id].image);
 
-    widget[id].text_img = make_image_from_file(file);
+    widget[id].image = make_image_from_file(file);
 }
 
 void gui_set_label(int id, const char *text)
 {
-    int w, h;
+    int w = 0;
+    int h = 0;
 
-    if (glIsTexture(widget[id].text_img))
-        glDeleteTextures(1, &widget[id].text_img);
-    if (glIsList(widget[id].text_obj))
-        glDeleteLists(widget[id].text_obj, 1);
+    if (glIsTexture(widget[id].image))
+        glDeleteTextures(1, &widget[id].image);
 
     text = gui_truncate(text, widget[id].w - radius,
                         font[widget[id].size],
                         widget[id].trunc);
 
-    widget[id].text_img = make_image_from_font(NULL, NULL, &w, &h,
-                                               text, font[widget[id].size]);
-    widget[id].text_obj = gui_list(-w / 2, -h / 2, w, h,
-                                   widget[id].color0, widget[id].color1);
+    widget[id].image = make_image_from_font(NULL, NULL, &w, &h,
+                                            text, font[widget[id].size]);
+    widget[id].text_w = w;
+    widget[id].text_h = h;
 
-    widget[id].text_obj_w = w;
-    widget[id].text_obj_h = h;
+    gui_text(id, -w / 2, -h / 2, w, h, widget[id].color0, widget[id].color1);
 
-    free((void *) text);
+    free((void *) text); /* Really? */
 }
 
 void gui_set_count(int id, int value)
@@ -589,8 +628,8 @@ void gui_set_clock(int id, int value)
     widget[id].value = value;
 }
 
-void gui_set_color(int id, const float *c0,
-                           const float *c1)
+void gui_set_color(int id, const GLubyte *c0,
+                           const GLubyte *c1)
 {
     if (id)
     {
@@ -599,22 +638,13 @@ void gui_set_color(int id, const float *c0,
 
         if (widget[id].color0 != c0 || widget[id].color1 != c1)
         {
+            int w = widget[id].text_w;
+            int h = widget[id].text_h;
+
             widget[id].color0 = c0;
             widget[id].color1 = c1;
 
-            if (glIsList(widget[id].text_obj))
-            {
-                int w, h;
-
-                glDeleteLists(widget[id].text_obj, 1);
-
-                w = widget[id].text_obj_w;
-                h = widget[id].text_obj_h;
-
-                widget[id].text_obj = gui_list(-w / 2, -h / 2, w, h,
-                                               widget[id].color0,
-                                               widget[id].color1);
-            }
+            gui_text(id, -w / 2, -h / 2, w, h, c0, c1);
         }
     }
 }
@@ -666,7 +696,7 @@ int gui_image(int pd, const char *file, int w, int h)
 
     if ((id = gui_widget(pd, GUI_IMAGE)))
     {
-        widget[id].text_img = make_image_from_file(file);
+        widget[id].image = make_image_from_file(file);
         widget[id].w = w;
         widget[id].h = h;
     }
@@ -689,7 +719,7 @@ int gui_state(int pd, const char *text, int size, int token, int value)
 
     if ((id = gui_widget(pd, GUI_STATE)))
     {
-        widget[id].text_img = make_image_from_font(NULL, NULL,
+        widget[id].image = make_image_from_font(NULL, NULL,
                                                    &widget[id].w,
                                                    &widget[id].h,
                                                    text, font[size]);
@@ -700,17 +730,17 @@ int gui_state(int pd, const char *text, int size, int token, int value)
     return id;
 }
 
-int gui_label(int pd, const char *text, int size, int rect, const float *c0,
-                                                            const float *c1)
+int gui_label(int pd, const char *text, int size, int rect, const GLubyte *c0,
+                                                            const GLubyte *c1)
 {
     int id;
 
     if ((id = gui_widget(pd, GUI_LABEL)))
     {
-        widget[id].text_img = make_image_from_font(NULL, NULL,
-                                                   &widget[id].w,
-                                                   &widget[id].h,
-                                                   text, font[size]);
+        widget[id].image = make_image_from_font(NULL, NULL,
+                                                &widget[id].w,
+                                                &widget[id].h,
+                                                text, font[size]);
         widget[id].size   = size;
         widget[id].color0 = c0 ? c0 : gui_yel;
         widget[id].color1 = c1 ? c1 : gui_red;
@@ -726,9 +756,9 @@ int gui_count(int pd, int value, int size, int rect)
     if ((id = gui_widget(pd, GUI_COUNT)))
     {
         for (i = value; i; i /= 10)
-            widget[id].w += digit_w[size][0];
+            widget[id].w += widget[digit_id[size][0]].text_w;
 
-        widget[id].h      = digit_h[size][0];
+        widget[id].h      = widget[digit_id[size][0]].text_h;
         widget[id].value  = value;
         widget[id].size   = size;
         widget[id].color0 = gui_yel;
@@ -744,8 +774,8 @@ int gui_clock(int pd, int value, int size, int rect)
 
     if ((id = gui_widget(pd, GUI_CLOCK)))
     {
-        widget[id].w      = digit_w[size][0] * 6;
-        widget[id].h      = digit_h[size][0];
+        widget[id].w      = widget[digit_id[size][0]].text_w * 6;
+        widget[id].h      = widget[digit_id[size][0]].text_h;
         widget[id].value  = value;
         widget[id].size   = size;
         widget[id].color0 = gui_yel;
@@ -775,8 +805,8 @@ int gui_space(int pd)
  * Preserve the rect specification across the entire array.
  */
 
-int gui_multi(int pd, const char *text, int size, int rect, const float *c0,
-                                                            const float *c1)
+int gui_multi(int pd, const char *text, int size, int rect, const GLubyte *c0,
+                                                            const GLubyte *c1)
 {
     int id = 0;
 
@@ -911,8 +941,8 @@ static void gui_button_up(int id)
 {
     /* Store width and height for later use in text rendering. */
 
-    widget[id].text_obj_w = widget[id].w;
-    widget[id].text_obj_h = widget[id].h;
+    widget[id].text_w = widget[id].w;
+    widget[id].text_h = widget[id].h;
 
     if (widget[id].w < widget[id].h && widget[id].w > 0)
         widget[id].w = widget[id].h;
@@ -1095,22 +1125,22 @@ static void gui_button_dn(int id, int x, int y, int w, int h)
 {
     /* Recall stored width and height for text rendering. */
 
-    int W = widget[id].text_obj_w;
-    int H = widget[id].text_obj_h;
+    int W = widget[id].text_w;
+    int H = widget[id].text_h;
     int R = widget[id].rect;
 
-    const float *c0 = widget[id].color0;
-    const float *c1 = widget[id].color1;
+    const GLubyte *c0 = widget[id].color0;
+    const GLubyte *c1 = widget[id].color1;
 
     widget[id].x = x;
     widget[id].y = y;
     widget[id].w = w;
     widget[id].h = h;
 
-    /* Create display lists for the text area and rounded rectangle. */
+    /* Create vertex array data for the text area and rounded rectangle. */
 
-    widget[id].text_obj = gui_list(-W / 2, -H / 2, W, H, c0, c1);
-    widget[id].rect_obj = gui_rect(-w / 2, -h / 2, w, h, R, radius);
+    gui_rect(id, -w / 2, -h / 2, w, h, R, radius);
+    gui_text(id, -W / 2, -H / 2, W, H, c0, c1);
 }
 
 static void gui_widget_dn(int id, int x, int y, int w, int h)
@@ -1207,22 +1237,15 @@ int gui_delete(int id)
 
         /* Release any GL resources held by this widget. */
 
-        if (glIsTexture(widget[id].text_img))
-            glDeleteTextures(1, &widget[id].text_img);
-
-        if (glIsList(widget[id].text_obj))
-            glDeleteLists(widget[id].text_obj, 1);
-        if (glIsList(widget[id].rect_obj))
-            glDeleteLists(widget[id].rect_obj, 1);
+        if (glIsTexture(widget[id].image))
+            glDeleteTextures(1, &widget[id].image);
 
         /* Mark this widget unused. */
 
-        widget[id].type     = GUI_FREE;
-        widget[id].text_img = 0;
-        widget[id].text_obj = 0;
-        widget[id].rect_obj = 0;
-        widget[id].cdr      = 0;
-        widget[id].car      = 0;
+        widget[id].type  = GUI_FREE;
+        widget[id].image = 0;
+        widget[id].cdr   = 0;
+        widget[id].car   = 0;
     }
     return 0;
 }
@@ -1274,8 +1297,8 @@ static void gui_paint_rect(int id, int st)
             glTranslatef((GLfloat) (widget[id].x + widget[id].w / 2),
                          (GLfloat) (widget[id].y + widget[id].h / 2), 0.f);
 
-            glColor4fv(back[i]);
-            glCallList(widget[id].rect_obj);
+            glColor4f(back[i][0], back[i][1], back[i][2], back[i][3]);
+            draw_rect(id);
         }
         glPopMatrix();
 
@@ -1297,9 +1320,12 @@ static void gui_paint_array(int id)
         GLfloat cy = widget[id].y + widget[id].h / 2.0f;
         GLfloat ck = widget[id].scale;
 
-        glTranslatef(+cx, +cy, 0.0f);
-        glScalef(ck, ck, ck);
-        glTranslatef(-cx, -cy, 0.0f);
+        if (1.0 < ck || ck < 1.0)
+        {
+            glTranslatef(+cx, +cy, 0.0f);
+            glScalef(ck, ck, ck);
+            glTranslatef(-cx, -cy, 0.0f);
+        }
 
         /* Recursively paint all subwidgets. */
 
@@ -1322,9 +1348,9 @@ static void gui_paint_image(int id)
                  widget[id].scale,
                  widget[id].scale);
 
-        glBindTexture(GL_TEXTURE_2D, widget[id].text_img);
-        glColor4fv(gui_wht);
-        glCallList(widget[id].rect_obj);
+        glBindTexture(GL_TEXTURE_2D, widget[id].image);
+        glColor4ub(gui_wht[0], gui_wht[1], gui_wht[2], gui_wht[3]);
+        draw_rect(id);
     }
     glPopMatrix();
 }
@@ -1335,8 +1361,6 @@ static void gui_paint_count(int id)
 
     glPushMatrix();
     {
-        glColor4fv(gui_wht);
-
         /* Translate to the widget center, and apply the pulse scale. */
 
         glTranslatef((GLfloat) (widget[id].x + widget[id].w / 2),
@@ -1348,28 +1372,32 @@ static void gui_paint_count(int id)
 
         if (widget[id].value > 0)
         {
-            /* Translate left by half the total width of the rendered value. */
+            /* Translate right by half the total width of the rendered value. */
+
+            GLfloat w = -widget[digit_id[i][0]].text_w * 0.5f;
 
             for (j = widget[id].value; j; j /= 10)
-                glTranslatef((GLfloat) +digit_w[i][j % 10] / 2.0f, 0.0f, 0.0f);
+                w += widget[digit_id[i][j % 10]].text_w * 0.5f;
 
-            glTranslatef((GLfloat) -digit_w[i][0] / 2.0f, 0.0f, 0.0f);
+            glTranslatef(w, 0.0f, 0.0f);
 
-            /* Render each digit, moving right after each. */
+            /* Render each digit, moving left after each. */
 
             for (j = widget[id].value; j; j /= 10)
             {
-                glBindTexture(GL_TEXTURE_2D, digit_text[i][j % 10]);
-                glCallList(digit_list[i][j % 10]);
-                glTranslatef((GLfloat) -digit_w[i][j % 10], 0.0f, 0.0f);
+                int id = digit_id[i][j % 10];
+
+                glBindTexture(GL_TEXTURE_2D, widget[id].image);
+                draw_text(id);
+                glTranslatef((GLfloat) -widget[id].text_w, 0.0f, 0.0f);
             }
         }
         else if (widget[id].value == 0)
         {
             /* If the value is zero, just display a zero in place. */
 
-            glBindTexture(GL_TEXTURE_2D, digit_text[i][0]);
-            glCallList(digit_list[i][0]);
+            glBindTexture(GL_TEXTURE_2D, widget[digit_id[i][0]].image);
+            draw_text(digit_id[i][0]);
         }
     }
     glPopMatrix();
@@ -1385,16 +1413,14 @@ static void gui_paint_clock(int id)
     int ht = ((widget[id].value % 6000) % 100) / 10;
     int ho = ((widget[id].value % 6000) % 100) % 10;
 
-    GLfloat dx_large = (GLfloat) digit_w[i][0];
-    GLfloat dx_small = (GLfloat) digit_w[i][0] * 0.75f;
+    GLfloat dx_large = (GLfloat) widget[digit_id[i][0]].text_w;
+    GLfloat dx_small = (GLfloat) widget[digit_id[i][0]].text_w * 0.75f;
 
     if (widget[id].value < 0)
         return;
 
     glPushMatrix();
     {
-        glColor4fv(gui_wht);
-
         /* Translate to the widget center, and apply the pulse scale. */
 
         glTranslatef((GLfloat) (widget[id].x + widget[id].w / 2),
@@ -1415,41 +1441,41 @@ static void gui_paint_clock(int id)
 
         if (mt > 0)
         {
-            glBindTexture(GL_TEXTURE_2D, digit_text[i][mt]);
-            glCallList(digit_list[i][mt]);
+            glBindTexture(GL_TEXTURE_2D, widget[digit_id[i][mt]].image);
+            draw_text(digit_id[i][mt]);
             glTranslatef(dx_large, 0.0f, 0.0f);
         }
 
-        glBindTexture(GL_TEXTURE_2D, digit_text[i][mo]);
-        glCallList(digit_list[i][mo]);
+        glBindTexture(GL_TEXTURE_2D, widget[digit_id[i][mo]].image);
+        draw_text(digit_id[i][mo]);
         glTranslatef(dx_small, 0.0f, 0.0f);
 
         /* Render the colon. */
 
-        glBindTexture(GL_TEXTURE_2D, digit_text[i][10]);
-        glCallList(digit_list[i][10]);
+        glBindTexture(GL_TEXTURE_2D, widget[digit_id[i][10]].image);
+        draw_text(digit_id[i][10]);
         glTranslatef(dx_small, 0.0f, 0.0f);
 
         /* Render the seconds counter. */
 
-        glBindTexture(GL_TEXTURE_2D, digit_text[i][st]);
-        glCallList(digit_list[i][st]);
+        glBindTexture(GL_TEXTURE_2D, widget[digit_id[i][st]].image);
+        draw_text(digit_id[i][st]);
         glTranslatef(dx_large, 0.0f, 0.0f);
 
-        glBindTexture(GL_TEXTURE_2D, digit_text[i][so]);
-        glCallList(digit_list[i][so]);
+        glBindTexture(GL_TEXTURE_2D, widget[digit_id[i][so]].image);
+        draw_text(digit_id[i][so]);
         glTranslatef(dx_small, 0.0f, 0.0f);
 
         /* Render hundredths counter half size. */
 
         glScalef(0.5f, 0.5f, 1.0f);
 
-        glBindTexture(GL_TEXTURE_2D, digit_text[i][ht]);
-        glCallList(digit_list[i][ht]);
+        glBindTexture(GL_TEXTURE_2D, widget[digit_id[i][ht]].image);
+        draw_text(digit_id[i][ht]);
         glTranslatef(dx_large, 0.0f, 0.0f);
 
-        glBindTexture(GL_TEXTURE_2D, digit_text[i][ho]);
-        glCallList(digit_list[i][ho]);
+        glBindTexture(GL_TEXTURE_2D, widget[digit_id[i][ho]].image);
+        draw_text(digit_id[i][ho]);
     }
     glPopMatrix();
 }
@@ -1467,8 +1493,8 @@ static void gui_paint_label(int id)
                  widget[id].scale,
                  widget[id].scale);
 
-        glBindTexture(GL_TEXTURE_2D, widget[id].text_img);
-        glCallList(widget[id].text_obj);
+        glBindTexture(GL_TEXTURE_2D, widget[id].image);
+        draw_text(id);
     }
     glPopMatrix();
 }
@@ -1500,13 +1526,16 @@ void gui_paint(int id)
             glDisable(GL_LIGHTING);
             glDisable(GL_DEPTH_TEST);
             {
+                draw_enable(GL_FALSE, GL_FALSE, GL_TRUE);
                 glDisable(GL_TEXTURE_2D);
                 gui_paint_rect(id, 0);
 
+                draw_enable(GL_TRUE, GL_TRUE, GL_TRUE);
                 glEnable(GL_TEXTURE_2D);
                 gui_paint_text(id);
 
-                glColor4fv(gui_wht);
+                draw_disable();
+                glColor4ub(gui_wht[0], gui_wht[1], gui_wht[2], gui_wht[3]);
             }
             glEnable(GL_DEPTH_TEST);
             glEnable(GL_LIGHTING);
@@ -1706,7 +1735,7 @@ static int gui_stick_R(int id, int dd)
 
     hd = 0;
     omin = (widget[id].x + widget[id].w) - (widget[dd].x + widget[dd].w) + 1;
-    dmin = widget[dd].y + widget[dd].h + widget[id].y + widget[id].h;
+    dmin = (widget[dd].y + widget[dd].h) + (widget[id].y + widget[id].h);
 
     for (jd = widget[id].car; jd; jd = widget[jd].cdr)
     {
@@ -1776,7 +1805,7 @@ static int gui_stick_U(int id, int dd)
 
     hd = 0;
     omin = (widget[id].y + widget[id].h) - (widget[dd].y + widget[dd].h) + 1;
-    dmin = widget[dd].x + widget[dd].w + widget[id].x + widget[id].w;
+    dmin = (widget[dd].x + widget[dd].w) + (widget[id].x + widget[id].w);
 
     for (jd = widget[id].car; jd; jd = widget[jd].cdr)
     {
index cd07933..93e8ef1 100644 (file)
 #define GUI_BOT  (GUI_SW  | GUI_SE)
 #define GUI_ALL  (GUI_TOP | GUI_BOT)
 
-extern const GLfloat gui_wht[4];
-extern const GLfloat gui_yel[4];
-extern const GLfloat gui_red[4];
-extern const GLfloat gui_blu[4];
-extern const GLfloat gui_grn[4];
-extern const GLfloat gui_blk[4];
-extern const GLfloat gui_gry[4];
+extern const GLubyte gui_wht[4];
+extern const GLubyte gui_yel[4];
+extern const GLubyte gui_red[4];
+extern const GLubyte gui_blu[4];
+extern const GLubyte gui_grn[4];
+extern const GLubyte gui_blk[4];
+extern const GLubyte gui_gry[4];
 
 /*---------------------------------------------------------------------------*/
 
@@ -64,7 +64,7 @@ void gui_set_image(int, const char *);
 void gui_set_multi(int, const char *);
 void gui_set_count(int, int);
 void gui_set_clock(int, int);
-void gui_set_color(int, const float *, const float *);
+void gui_set_color(int, const GLubyte *, const GLubyte *);
 void gui_set_trunc(int, enum trunc);
 void gui_set_fill(int);
 
@@ -79,8 +79,8 @@ int  gui_filler(int);
 int  gui_image(int, const char *, int, int);
 int  gui_start(int, const char *, int, int, int);
 int  gui_state(int, const char *, int, int, int);
-int  gui_label(int, const char *, int, int, const float *, const float *);
-int  gui_multi(int, const char *, int, int, const float *, const float *);
+int  gui_label(int, const char *, int, int, const GLubyte *, const GLubyte *);
+int  gui_multi(int, const char *, int, int, const GLubyte *, const GLubyte *);
 int  gui_count(int, int, int, int);
 int  gui_clock(int, int, int, int);
 int  gui_space(int);
index b98d903..8ee9ccb 100644 (file)
@@ -113,17 +113,17 @@ static GLuint make_texture(const void *p, int w, int h, int b)
 #ifdef GL_TEXTURE_MAX_ANISOTROPY_EXT
     int a = config_get_d(CONFIG_ANISO);
 #endif
+#ifdef GL_GENERATE_MIPMAP_SGIS
     int m = config_get_d(CONFIG_MIPMAP);
+#endif
     int k = config_get_d(CONFIG_TEXTURES);
     int W = w;
     int H = h;
 
-    GLint max;
+    GLint max = gli.max_texture_size;
 
     void *q = NULL;
 
-    glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max);
-
     while (w / k > (int) max || h / k > (int) max)
         k *= 2;
 
@@ -135,8 +135,8 @@ static GLuint make_texture(const void *p, int w, int h, int b)
     glGenTextures(1, &o);
     glBindTexture(GL_TEXTURE_2D, o);
 
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
index 8af06db..2cf8b12 100644 (file)
@@ -30,7 +30,6 @@ void item_color(const struct v_item *hp, float *c)
 {
     switch (hp->t)
     {
-
     case ITEM_COIN:
 
         if (hp->n >= 1)
@@ -38,18 +37,21 @@ void item_color(const struct v_item *hp, float *c)
             c[0] = 1.0f;
             c[1] = 1.0f;
             c[2] = 0.2f;
+            c[3] = 1.0f;
         }
         if (hp->n >= 5)
         {
             c[0] = 1.0f;
             c[1] = 0.2f;
             c[2] = 0.2f;
+            c[3] = 1.0f;
         }
         if (hp->n >= 10)
         {
             c[0] = 0.2f;
             c[1] = 0.2f;
             c[2] = 1.0f;
+            c[3] = 1.0f;
         }
         break;
 
@@ -58,6 +60,7 @@ void item_color(const struct v_item *hp, float *c)
         c[0] = 0.00f;
         c[1] = 0.51f;
         c[2] = 0.80f;
+        c[3] = 1.00f;
 
         break;
 
@@ -66,6 +69,7 @@ void item_color(const struct v_item *hp, float *c)
         c[0] = 1.00f;
         c[1] = 0.76f;
         c[2] = 0.00f;
+        c[3] = 1.00f;
 
         break;
 
@@ -74,6 +78,7 @@ void item_color(const struct v_item *hp, float *c)
         c[0] = 1.0f;
         c[1] = 1.0f;
         c[2] = 1.0f;
+        c[3] = 1.0f;
 
         break;
     }
@@ -93,15 +98,12 @@ void item_free(void)
     sol_free_full(&item_shrink_file);
 }
 
-void item_push(int type)
-{
-    glEnable(GL_COLOR_MATERIAL);
-}
-
-void item_draw(const struct v_item *hp, float r)
+void item_draw(struct s_rend *rend,
+               const struct v_item *hp,
+               const GLfloat *M, float t)
 {
     struct s_draw *draw = NULL;
-    float c[3];
+    float c[4];
 
     switch (hp->t)
     {
@@ -112,14 +114,20 @@ void item_draw(const struct v_item *hp, float r)
 
     item_color(hp, c);
 
-    glColor3fv(c);
-    sol_draw(draw, 0, 1);
-}
+    glColor4f(c[0], c[1], c[2], c[3]);
 
-void item_pull(void)
-{
-    glColor3f(1.0f, 1.0f, 1.0f);
-    glDisable(GL_COLOR_MATERIAL);
+    glDepthMask(GL_FALSE);
+    {
+        sol_bill(draw, rend, M, t);
+    }
+    glDepthMask(GL_TRUE);
+
+    glPushMatrix();
+    {
+        glRotatef(360.0f * t, 0.0f, 1.0f, 0.0f);
+        sol_draw(draw, rend, 0, 1);
+    }
+    glPopMatrix();
 }
 
 /*---------------------------------------------------------------------------*/
index 4d72414..3450db2 100644 (file)
@@ -16,6 +16,7 @@
 #define ITEM_H
 
 #include "solid_vary.h"
+#include "solid_draw.h"
 
 #define ITEM_RADIUS 0.15f
 
@@ -23,8 +24,6 @@ void item_color(const struct v_item *, float *);
 void item_init(void);
 void item_free(void);
 
-void item_push(int);
-void item_draw(const struct v_item *, float);
-void item_pull(void);
+void item_draw(struct s_rend *, const struct v_item *, const float *, float);
 
 #endif
index 1724f5c..286b5bf 100644 (file)
@@ -18,6 +18,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <math.h>
+#include <sys/time.h>
 
 #include "solid_base.h"
 
 /*---------------------------------------------------------------------------*/
 
 static const char *input_file;
-static int         debug_output;
+static int         debug_output = 0;
+static int           csv_output = 0;
 static int         verbose;
 
+struct timeval t0;
+struct timeval t1;
+
 /*---------------------------------------------------------------------------*/
 
 /* Ohhhh... arbitrary! */
@@ -55,6 +60,7 @@ static int         verbose;
 #define MAXE    131072
 #define MAXS    65536
 #define MAXT    131072
+#define MAXO    131072
 #define MAXG    65536
 #define MAXL    4096
 #define MAXN    2048
@@ -103,6 +109,11 @@ static int inct(struct s_base *fp)
     return (fp->tc < MAXT) ? fp->tc++ : overflow("texc");
 }
 
+static int inco(struct s_base *fp)
+{
+    return (fp->oc < MAXO) ? fp->oc++ : overflow("offs");
+}
+
 static int incg(struct s_base *fp)
 {
     return (fp->gc < MAXG) ? fp->gc++ : overflow("geom");
@@ -180,6 +191,7 @@ static void init_file(struct s_base *fp)
     fp->ec = 0;
     fp->sc = 0;
     fp->tc = 0;
+    fp->oc = 0;
     fp->gc = 0;
     fp->lc = 0;
     fp->nc = 0;
@@ -201,6 +213,7 @@ static void init_file(struct s_base *fp)
     fp->ev = (struct b_edge *) calloc(MAXE, sizeof (*fp->ev));
     fp->sv = (struct b_side *) calloc(MAXS, sizeof (*fp->sv));
     fp->tv = (struct b_texc *) calloc(MAXT, sizeof (*fp->tv));
+    fp->ov = (struct b_offs *) calloc(MAXO, sizeof (*fp->ov));
     fp->gv = (struct b_geom *) calloc(MAXG, sizeof (*fp->gv));
     fp->lv = (struct b_lump *) calloc(MAXL, sizeof (*fp->lv));
     fp->nv = (struct b_node *) calloc(MAXN, sizeof (*fp->nv));
@@ -400,6 +413,8 @@ static void size_image(const char *name, int *w, int *h)
 static int read_mtrl(struct s_base *fp, const char *name)
 {
     static char line[MAXSTR];
+    static char word[MAXSTR];
+
     struct b_mtrl *mp;
     fs_file fin;
     int mi;
@@ -432,7 +447,27 @@ static int read_mtrl(struct s_base *fp, const char *name)
             mp->h[0] = strtod(line, NULL);
 
         if (fs_gets(line, sizeof (line), fin))
-            mp->fl = strtol(line, NULL, 10);
+        {
+            char *p = line;
+            int   f = 0;
+            int   n;
+
+            while (sscanf(p, "%s%n", word, &n) > 0)
+            {
+                if      (strcmp(word, "additive")    == 0) f |= M_ADDITIVE;
+                else if (strcmp(word, "clamp-s")     == 0) f |= M_CLAMP_S;
+                else if (strcmp(word, "clamp-t")     == 0) f |= M_CLAMP_T;
+                else if (strcmp(word, "decal")       == 0) f |= M_DECAL;
+                else if (strcmp(word, "environment") == 0) f |= M_ENVIRONMENT;
+                else if (strcmp(word, "reflective")  == 0) f |= M_REFLECTIVE;
+                else if (strcmp(word, "shadowed")    == 0) f |= M_SHADOWED;
+                else if (strcmp(word, "transparent") == 0) f |= M_TRANSPARENT;
+                else if (strcmp(word, "two-sided")   == 0) f |= M_TWO_SIDED;
+
+                p += n;
+            }
+            mp->fl = f;
+        }
 
         if (fs_gets(line, sizeof (line), fin))
             mp->angle = strtod(line, NULL);
@@ -496,9 +531,11 @@ static void move_body(struct s_base *fp,
 
         for (i = 0; i < bp->gc; i++)
         {
-            b[fp->gv[fp->iv[bp->g0 + i]].vi] = 1;
-            b[fp->gv[fp->iv[bp->g0 + i]].vj] = 1;
-            b[fp->gv[fp->iv[bp->g0 + i]].vk] = 1;
+            const struct b_geom *gp = fp->gv + fp->iv[bp->g0 + i];
+
+            b[fp->ov[gp->oi].vi] = 1;
+            b[fp->ov[gp->oj].vi] = 1;
+            b[fp->ov[gp->ok].vi] = 1;
         }
 
         /* Apply the motion to the marked vertices. */
@@ -555,24 +592,28 @@ static void read_f(struct s_base *fp, const char *line,
                    int v0, int t0, int s0, int mi)
 {
     struct b_geom *gp = fp->gv + incg(fp);
+    
+    struct b_offs *op = fp->ov + (gp->oi = inco(fp));
+    struct b_offs *oq = fp->ov + (gp->oj = inco(fp));
+    struct b_offs *or = fp->ov + (gp->ok = inco(fp));
 
     char c1;
     char c2;
 
     sscanf(line, "%d%c%d%c%d %d%c%d%c%d %d%c%d%c%d",
-           &gp->vi, &c1, &gp->ti, &c2, &gp->si,
-           &gp->vj, &c1, &gp->tj, &c2, &gp->sj,
-           &gp->vk, &c1, &gp->tk, &c2, &gp->sk);
-
-    gp->vi += (v0 - 1);
-    gp->vj += (v0 - 1);
-    gp->vk += (v0 - 1);
-    gp->ti += (t0 - 1);
-    gp->tj += (t0 - 1);
-    gp->tk += (t0 - 1);
-    gp->si += (s0 - 1);
-    gp->sj += (s0 - 1);
-    gp->sk += (s0 - 1);
+           &op->vi, &c1, &op->ti, &c2, &op->si,
+           &oq->vi, &c1, &oq->ti, &c2, &oq->si,
+           &or->vi, &c1, &or->ti, &c2, &or->si);
+
+    op->vi += (v0 - 1);
+    oq->vi += (v0 - 1);
+    or->vi += (v0 - 1);
+    op->ti += (t0 - 1);
+    oq->ti += (t0 - 1);
+    or->ti += (t0 - 1);
+    op->si += (s0 - 1);
+    oq->si += (s0 - 1);
+    or->si += (s0 - 1);
 
     gp->mi  = mi;
 }
@@ -1053,7 +1094,7 @@ static void make_bill(struct s_base *fp,
         if (strcmp(k[i], "image") == 0)
         {
             rp->mi = read_mtrl(fp, v[i]);
-            fp->mv[rp->mi].fl |= M_CLAMPED;
+            fp->mv[rp->mi].fl |= M_CLAMP_S | M_CLAMP_T;
         }
 
         if (strcmp(k[i], "origin") == 0)
@@ -1529,24 +1570,31 @@ static void clip_geom(struct s_base *fp,
 
     for (i = 0; i < n - 2; i++)
     {
-        fp->gv[fp->gc].mi = plane_m[si];
+        const int gi = incg(fp);
 
-        fp->gv[fp->gc].ti = t[0];
-        fp->gv[fp->gc].tj = t[i + 1];
-        fp->gv[fp->gc].tk = t[i + 2];
+        struct b_geom *gp = fp->gv + gi;
 
-        fp->gv[fp->gc].si = si;
-        fp->gv[fp->gc].sj = si;
-        fp->gv[fp->gc].sk = si;
+        struct b_offs *op = fp->ov + (gp->oi = inco(fp));
+        struct b_offs *oq = fp->ov + (gp->oj = inco(fp));
+        struct b_offs *or = fp->ov + (gp->ok = inco(fp));
 
-        fp->gv[fp->gc].vi = m[0];
-        fp->gv[fp->gc].vj = m[i + 1];
-        fp->gv[fp->gc].vk = m[i + 2];
+        gp->mi = plane_m[si];
 
-        fp->iv[fp->ic] = fp->gc;
-        inci(fp);
-        incg(fp);
+        op->ti = t[0];
+        oq->ti = t[i + 1];
+        or->ti = t[i + 2];
+
+        op->si = si;
+        oq->si = si;
+        or->si = si;
+
+        op->vi = m[0];
+        oq->vi = m[i + 1];
+        or->vi = m[i + 2];
+
+        fp->iv[fp->ic] = gi;
         lp->gc++;
+        inci(fp);
     }
 }
 
@@ -1672,27 +1720,35 @@ static int comp_texc(const struct b_texc *tp, const struct b_texc *tq)
     return 1;
 }
 
-static int comp_geom(const struct b_geom *gp, const struct b_geom *gq)
+static int comp_offs(const struct b_offs *op, const struct b_offs *oq)
 {
-    if (gp->mi != gq->mi) return 0;
+    if (op->ti != oq->ti) return 0;
+    if (op->si != oq->si) return 0;
+    if (op->vi != oq->vi) return 0;
 
-    if (gp->ti != gq->ti) return 0;
-    if (gp->si != gq->si) return 0;
-    if (gp->vi != gq->vi) return 0;
-
-    if (gp->tj != gq->tj) return 0;
-    if (gp->sj != gq->sj) return 0;
-    if (gp->vj != gq->vj) return 0;
+    return 1;
+}
 
-    if (gp->tk != gq->tk) return 0;
-    if (gp->sk != gq->sk) return 0;
-    if (gp->vk != gq->vk) return 0;
+static int comp_geom(const struct b_geom *gp, const struct b_geom *gq)
+{
+    if (gp->mi != gq->mi) return 0;
+    if (gp->oi != gq->oi) return 0;
+    if (gp->oj != gq->oj) return 0;
+    if (gp->ok != gq->ok) return 0;
 
     return 1;
 }
 
 /*---------------------------------------------------------------------------*/
 
+static int mtrl_swaps[MAXM];
+static int vert_swaps[MAXV];
+static int edge_swaps[MAXE];
+static int side_swaps[MAXS];
+static int texc_swaps[MAXT];
+static int offs_swaps[MAXO];
+static int geom_swaps[MAXG];
+
 /*
  * For each file  element type, replace all references  to element 'i'
  * with a  reference to element  'j'.  These are used  when optimizing
@@ -1709,55 +1765,54 @@ static void swap_mtrl(struct s_base *fp, int mi, int mj)
         if (fp->rv[i].mi == mi) fp->rv[i].mi = mj;
 }
 
-static int vert_swaps[MAXV];
-
-static void apply_vert_swaps(struct s_base *fp)
+static void swap_vert(struct s_base *fp, int vi, int vj)
 {
     int i, j;
 
     for (i = 0; i < fp->ec; i++)
     {
-        fp->ev[i].vi = vert_swaps[fp->ev[i].vi];
-        fp->ev[i].vj = vert_swaps[fp->ev[i].vj];
+        if (fp->ev[i].vi == vi) fp->ev[i].vi = vj;
+        if (fp->ev[i].vj == vi) fp->ev[i].vj = vj;
     }
 
-    for (i = 0; i < fp->gc; i++)
-    {
-        fp->gv[i].vi = vert_swaps[fp->gv[i].vi];
-        fp->gv[i].vj = vert_swaps[fp->gv[i].vj];
-        fp->gv[i].vk = vert_swaps[fp->gv[i].vk];
-    }
+    for (i = 0; i < fp->oc; i++)
+        if (fp->ov[i].vi == vi) fp->ov[i].vi = vj;
 
     for (i = 0; i < fp->lc; i++)
         for (j = 0; j < fp->lv[i].vc; j++)
-            fp->iv[fp->lv[i].v0 + j] = vert_swaps[fp->iv[fp->lv[i].v0 + j]];
+            if (fp->iv[fp->lv[i].v0 + j] == vi)
+                fp->iv[fp->lv[i].v0 + j]  = vj;
 }
 
-static void swap_vert(struct s_base *fp, int vi, int vj)
+static void apply_mtrl_swaps(struct s_base *fp)
+{
+    int i;
+
+    for (i = 0; i < fp->gc; i++)
+        fp->gv[i].mi = mtrl_swaps[fp->gv[i].mi];
+    for (i = 0; i < fp->rc; i++)
+        fp->rv[i].mi = mtrl_swaps[fp->rv[i].mi];
+}
+
+
+static void apply_vert_swaps(struct s_base *fp)
 {
     int i, j;
 
     for (i = 0; i < fp->ec; i++)
     {
-        if (fp->ev[i].vi == vi) fp->ev[i].vi = vj;
-        if (fp->ev[i].vj == vi) fp->ev[i].vj = vj;
+        fp->ev[i].vi = vert_swaps[fp->ev[i].vi];
+        fp->ev[i].vj = vert_swaps[fp->ev[i].vj];
     }
 
-    for (i = 0; i < fp->gc; i++)
-    {
-        if (fp->gv[i].vi == vi) fp->gv[i].vi = vj;
-        if (fp->gv[i].vj == vi) fp->gv[i].vj = vj;
-        if (fp->gv[i].vk == vi) fp->gv[i].vk = vj;
-    }
+    for (i = 0; i < fp->oc; i++)
+        fp->ov[i].vi = vert_swaps[fp->ov[i].vi];
 
     for (i = 0; i < fp->lc; i++)
         for (j = 0; j < fp->lv[i].vc; j++)
-            if (fp->iv[fp->lv[i].v0 + j] == vi)
-                fp->iv[fp->lv[i].v0 + j]  = vj;
+            fp->iv[fp->lv[i].v0 + j] = vert_swaps[fp->iv[fp->lv[i].v0 + j]];
 }
 
-static int edge_swaps[MAXE];
-
 static void apply_edge_swaps(struct s_base *fp)
 {
     int i, j;
@@ -1767,18 +1822,12 @@ static void apply_edge_swaps(struct s_base *fp)
             fp->iv[fp->lv[i].e0 + j] = edge_swaps[fp->iv[fp->lv[i].e0 + j]];
 }
 
-static int side_swaps[MAXS];
-
 static void apply_side_swaps(struct s_base *fp)
 {
     int i, j;
 
-    for (i = 0; i < fp->gc; i++)
-    {
-        fp->gv[i].si = side_swaps[fp->gv[i].si];
-        fp->gv[i].sj = side_swaps[fp->gv[i].sj];
-        fp->gv[i].sk = side_swaps[fp->gv[i].sk];
-    }
+    for (i = 0; i < fp->oc; i++)
+        fp->ov[i].si = side_swaps[fp->ov[i].si];
     for (i = 0; i < fp->nc; i++)
         fp->nv[i].si = side_swaps[fp->nv[i].si];
 
@@ -1787,22 +1836,26 @@ static void apply_side_swaps(struct s_base *fp)
             fp->iv[fp->lv[i].s0 + j] = side_swaps[fp->iv[fp->lv[i].s0 + j]];
 }
 
-static int texc_swaps[MAXT];
-
 static void apply_texc_swaps(struct s_base *fp)
 {
     int i;
 
+    for (i = 0; i < fp->oc; i++)
+        fp->ov[i].ti = texc_swaps[fp->ov[i].ti];
+}
+
+static void apply_offs_swaps(struct s_base *fp)
+{
+    int i;
+
     for (i = 0; i < fp->gc; i++)
     {
-        fp->gv[i].ti = texc_swaps[fp->gv[i].ti];
-        fp->gv[i].tj = texc_swaps[fp->gv[i].tj];
-        fp->gv[i].tk = texc_swaps[fp->gv[i].tk];
+        fp->gv[i].oi = offs_swaps[fp->gv[i].oi];
+        fp->gv[i].oj = offs_swaps[fp->gv[i].oj];
+        fp->gv[i].ok = offs_swaps[fp->gv[i].ok];
     }
 }
 
-static int geom_swaps[MAXG];
-
 static void apply_geom_swaps(struct s_base *fp)
 {
     int i, j;
@@ -1826,22 +1879,20 @@ static void uniq_mtrl(struct s_base *fp)
     {
         for (j = 0; j < k; j++)
             if (comp_mtrl(fp->mv + i, fp->mv + j))
-            {
-                swap_mtrl(fp, i, j);
                 break;
-            }
+
+        mtrl_swaps[i] = j;
 
         if (j == k)
         {
             if (i != k)
-            {
                 fp->mv[k] = fp->mv[i];
-                swap_mtrl(fp, i, k);
-            }
             k++;
         }
     }
 
+    apply_mtrl_swaps(fp);
+
     fp->mc = k;
 }
 
@@ -1895,34 +1946,49 @@ static void uniq_edge(struct s_base *fp)
     fp->ec = k;
 }
 
-static int geomlist[MAXV];
-static int nextgeom[MAXG];
-
-static void uniq_geom(struct s_base *fp)
+static void uniq_offs(struct s_base *fp)
 {
     int i, j, k = 0;
 
-    for (i = 0; i < MAXV; i++)
-        geomlist[i] = -1;
-
-    for (i = 0; i < fp->gc; i++)
+    for (i = 0; i < fp->oc; i++)
     {
-        int key = fp->gv[i].vj;
+        for (j = 0; j < k; j++)
+            if (comp_offs(fp->ov + i, fp->ov + j))
+                break;
 
-        for (j = geomlist[key]; j != -1; j = nextgeom[j])
-            if (comp_geom(fp->gv + i, fp->gv + j))
-                goto found;
+        offs_swaps[i] = j;
+
+        if (j == k)
+        {
+            if (i != k)
+                fp->ov[k] = fp->ov[i];
+            k++;
+        }
+    }
 
-        fp->gv[k] = fp->gv[i];
+    apply_offs_swaps(fp);
 
-        nextgeom[k] = geomlist[key];
-        geomlist[key] = k;
+    fp->oc = k;
+}
 
-        j = k;
-        k++;
+static void uniq_geom(struct s_base *fp)
+{
+    int i, j, k = 0;
+
+    for (i = 0; i < fp->gc; i++)
+    {
+        for (j = 0; j < k; j++)
+            if (comp_geom(fp->gv + i, fp->gv + j))
+                break;
 
-found:
         geom_swaps[i] = j;
+
+        if (j == k)
+        {
+            if (i != k)
+                fp->gv[k] = fp->gv[i];
+            k++;
+        }
     }
 
     apply_geom_swaps(fp);
@@ -1991,6 +2057,7 @@ static void uniq_file(struct s_base *fp)
         uniq_edge(fp);
         uniq_side(fp);
         uniq_texc(fp);
+        uniq_offs(fp);
         uniq_geom(fp);
     }
 }
@@ -2034,21 +2101,21 @@ static void smth_file(struct s_base *fp)
             {
                 struct b_geom *gp = fp->gv + gi;
 
-                T[c].vi = gp->vi;
+                T[c].vi = fp->ov[gp->oi].vi;
+                T[c].si = fp->ov[gp->oi].si;
                 T[c].mi = gp->mi;
-                T[c].si = gp->si;
                 T[c].gi = gi;
                 c++;
 
-                T[c].vi = gp->vj;
+                T[c].vi = fp->ov[gp->oj].vi;
+                T[c].si = fp->ov[gp->oj].si;
                 T[c].mi = gp->mi;
-                T[c].si = gp->sj;
                 T[c].gi = gi;
                 c++;
 
-                T[c].vi = gp->vk;
+                T[c].vi = fp->ov[gp->ok].vi;
+                T[c].si = fp->ov[gp->ok].si;
                 T[c].mi = gp->mi;
-                T[c].si = gp->sk;
                 T[c].gi = gi;
                 c++;
             }
@@ -2131,26 +2198,46 @@ static void smth_file(struct s_base *fp)
             for (i = 0; i < c; ++i)
             {
                 struct b_geom *gp = fp->gv + T[i].gi;
+                struct b_offs *op = fp->ov + gp->oi;
+                struct b_offs *oq = fp->ov + gp->oj;
+                struct b_offs *or = fp->ov + gp->ok;
 
-                if (gp->vi == T[i].vi) gp->si = T[i].si;
-                if (gp->vj == T[i].vi) gp->sj = T[i].si;
-                if (gp->vk == T[i].vi) gp->sk = T[i].si;
+                if (op->vi == T[i].vi) op->si = T[i].si;
+                if (oq->vi == T[i].vi) oq->si = T[i].si;
+                if (or->vi == T[i].vi) or->si = T[i].si;
             }
 
             free(T);
         }
 
         uniq_side(fp);
+        uniq_offs(fp);
     }
 }
 
-
 /*---------------------------------------------------------------------------*/
 
 static void sort_file(struct s_base *fp)
 {
     int i, j;
 
+    /* Sort materials by type to minimize state changes. */
+
+    for (i = 0; i < fp->mc; i++)
+        for (j = i + 1; j < fp->mc; j++)
+            if (fp->mv[i].fl > fp->mv[j].fl)
+            {
+                struct b_mtrl t;
+
+                t         = fp->mv[i];
+                fp->mv[i] = fp->mv[j];
+                fp->mv[j] =         t;
+
+                swap_mtrl(fp,  i, -1);
+                swap_mtrl(fp,  j,  i);
+                swap_mtrl(fp, -1,  j);
+            }
+
     /* Sort billboards by material within distance. */
 
     for (i = 0; i < fp->rc; i++)
@@ -2426,12 +2513,11 @@ static void node_file(struct s_base *fp)
 
 /*---------------------------------------------------------------------------*/
 
-static void dump_file(struct s_base *p, const char *name)
+static void dump_file(struct s_base *p, const char *name, double t)
 {
-    int i, j;
+    int i;
     int c = 0;
     int n = 0;
-    int m;
 
     /* Count the number of solid lumps. */
 
@@ -2439,41 +2525,34 @@ static void dump_file(struct s_base *p, const char *name)
         if ((p->lv[i].fl & 1) == 0)
             n++;
 
-    /* Count the number of visible geoms. */
-
-    m = p->rc + (p->zc + p->jc + p->xc) * 32;
-
-    for (i = 0; i < p->hc; i++)
-        if (p->hv[i].t == ITEM_COIN)
-            m += 124;
-        else
-            m += 304;
-
-    for (i = 0; i < p->bc; i++)
-    {
-        for (j = 0; j < p->bv[i].lc; j++)
-            m += p->lv[p->bv[i].l0 + j].gc;
-        m += p->bv[i].gc;
-    }
-
     /* Count the total value of all coins. */
 
     for (i = 0; i < p->hc; i++)
         if (p->hv[i].t == ITEM_COIN)
             c += p->hv[i].n;
 
-    printf("%s (%d/%d/$%d)\n"
-           "  mtrl  vert  edge  side  texc"
-           "  geom  lump  path  node  body\n"
-           "%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d\n"
-           "  item  goal  view  jump  swch"
-           "  bill  ball  char  dict  indx\n"
-           "%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d\n",
-           name, n, m, c,
-           p->mc, p->vc, p->ec, p->sc, p->tc,
-           p->gc, p->lc, p->pc, p->nc, p->bc,
-           p->hc, p->zc, p->wc, p->jc, p->xc,
-           p->rc, p->uc, p->ac, p->dc, p->ic);
+    if (csv_output)
+        printf("%s,%d,%d,%.3f"
+               "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,"
+               "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",
+               name, n, c, t,
+               p->mc, p->vc, p->ec, p->sc, p->tc,
+               p->oc, p->gc, p->lc, p->pc, p->nc, p->bc,
+               p->hc, p->zc, p->wc, p->jc, p->xc,
+               p->rc, p->uc, p->ac, p->dc, p->ic);
+    else
+        printf("%s (%d/$%d) %.3f\n"
+               "  mtrl  vert  edge  side  texc"
+               "  offs  geom  lump  path  node  body\n"
+               "%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d\n"
+               "  item  goal  view  jump  swch"
+               "  bill  ball  char  dict  indx\n"
+               "%6d%6d%6d%6d%6d%6d%6d%6d%6d%6d\n",
+               name, n, c, t,
+               p->mc, p->vc, p->ec, p->sc, p->tc,
+               p->oc, p->gc, p->lc, p->pc, p->nc, p->bc,
+               p->hc, p->zc, p->wc, p->jc, p->xc,
+               p->rc, p->uc, p->ac, p->dc, p->ic);
 }
 
 int main(int argc, char *argv[])
@@ -2494,10 +2573,15 @@ int main(int argc, char *argv[])
 
     if (argc > 2)
     {
+        int argi;
+
         input_file = argv[1];
 
-        if (argc > 3 && strcmp(argv[3], "--debug") == 0)
-            debug_output = 1;
+        for (argi = 3; argi < argc; ++argi)
+        {
+            if (strcmp(argv[argi], "--debug") == 0) debug_output = 1;
+            if (strcmp(argv[argi], "--csv")   == 0)   csv_output = 1;
+        }
 
         strncpy(src, argv[1], MAXSTR - 1);
         strncpy(dst, argv[1], MAXSTR - 1);
@@ -2520,28 +2604,34 @@ int main(int argc, char *argv[])
                 return 1;
             }
 
-            init_file(&f);
-            read_map(&f, fin);
+            gettimeofday(&t0, 0);
+            {
+                init_file(&f);
+                read_map(&f, fin);
+
+                resolve();
+                targets(&f);
 
-            resolve();
-            targets(&f);
+                clip_file(&f);
+                move_file(&f);
+                uniq_file(&f);
+                smth_file(&f);
+                sort_file(&f);
+                node_file(&f);
 
-            clip_file(&f);
-            move_file(&f);
-            uniq_file(&f);
-            smth_file(&f);
-            sort_file(&f);
-            node_file(&f);
-            dump_file(&f, dst);
+                sol_stor_base(&f, base_name(dst));
+            }
+            gettimeofday(&t1, 0);
 
-            sol_stor_base(&f, base_name(dst));
+            dump_file(&f, dst, (t1.tv_sec  - t0.tv_sec) +
+                               (t1.tv_usec - t0.tv_usec) / 1000000.0);
 
             fs_close(fin);
 
             free_imagedata();
         }
     }
-    else fprintf(stderr, "Usage: %s <map> <data> [--debug]\n", argv[0]);
+    else fprintf(stderr, "Usage: %s <map> <data> [--debug] [--csv]\n", argv[0]);
 
     return 0;
 }
index 1583f67..35299f4 100644 (file)
 #include <string.h>
 #include <math.h>
 
+#include "config.h"
 #include "glext.h"
 #include "part.h"
 #include "vec3.h"
 #include "image.h"
+#include "geom.h"
 
 /*---------------------------------------------------------------------------*/
+/*
+#define PARTICLEVBO 1
+*/
+
+struct part_vary
+{
+    GLfloat v[3];             /* Velocity                                    */
+};
 
-struct part
+struct part_draw
 {
-    float t;
-    float a;
-    float w;
-    float c[3];
-    float p[3];
-    float v[3];
+    GLfloat p[3];             /* Position                                    */
+    GLfloat c[3];             /* Color                                       */
+    GLfloat t;                /* Time until death. Doubles as opacity.       */
 };
 
-static struct part part_coin[PART_MAX_COIN];
-static struct part part_goal[PART_MAX_GOAL];
-static struct part part_jump[PART_MAX_JUMP];
-static GLuint      part_text_star;
-static GLuint      part_text_squiggle;
-static GLuint      part_list;
+static struct part_vary coin_vary[PART_MAX_COIN];
+static struct part_draw coin_draw[PART_MAX_COIN];
+
+static GLuint coin_vbo;
+
+/*---------------------------------------------------------------------------*/
+
+static struct b_mtrl coin_base_mtrl =
+{
+    { 0.8f, 0.8f, 0.8f, 1.0f },
+    { 0.2f, 0.2f, 0.2f, 1.0f },
+    { 0.0f, 0.0f, 0.0f, 1.0f },
+    { 0.0f, 0.0f, 0.0f, 1.0f },
+    { 0.0f }, 0.0f, M_TRANSPARENT, IMG_PART_STAR
+};
 
-static float goal_height;
-static float jump_height;
+static struct d_mtrl coin_draw_mtrl;
 
 /*---------------------------------------------------------------------------*/
 
@@ -64,48 +79,26 @@ struct part_lerp
 };
 
 static struct part_lerp part_lerp_coin[PART_MAX_COIN];
-static struct part_lerp part_lerp_goal[PART_MAX_GOAL];
-static struct part_lerp part_lerp_jump[PART_MAX_JUMP];
 
 void part_lerp_copy(void)
 {
     int i;
 
     for (i = 0; i < PART_MAX_COIN; i++)
-        v_cpy(part_lerp_coin[i].p[PREV], part_lerp_coin[i].p[CURR]);
-
-    for (i = 0; i < PART_MAX_GOAL; i++)
-        v_cpy(part_lerp_goal[i].p[PREV], part_lerp_goal[i].p[CURR]);
-
-    for (i = 0; i < PART_MAX_JUMP; i++)
-        v_cpy(part_lerp_jump[i].p[PREV], part_lerp_jump[i].p[CURR]);
+        v_cpy(part_lerp_coin[i].p[PREV],
+              part_lerp_coin[i].p[CURR]);
 }
 
 void part_lerp_init(void)
 {
-    int i;
-
-    for (i = 0; i < PART_MAX_GOAL; i++)
-        if (part_goal[i].t > 0.0f)
-        {
-            v_cpy(part_lerp_goal[i].p[PREV], part_goal[i].p);
-            v_cpy(part_lerp_goal[i].p[CURR], part_goal[i].p);
-        }
-
-    for (i = 0; i < PART_MAX_JUMP; i++)
-        if (part_jump[i].t > 0.0f)
-        {
-            v_cpy(part_lerp_jump[i].p[PREV], part_jump[i].p);
-            v_cpy(part_lerp_jump[i].p[CURR], part_jump[i].p);
-        }
 }
 
 void part_lerp_burst(int i)
 {
-    if (part_coin[i].t >= 1.0f)
+    if (coin_draw[i].t >= 1.0f)
     {
-        v_cpy(part_lerp_coin[i].p[PREV], part_coin[i].p);
-        v_cpy(part_lerp_coin[i].p[CURR], part_coin[i].p);
+        v_cpy(part_lerp_coin[i].p[PREV], coin_draw[i].p);
+        v_cpy(part_lerp_coin[i].p[CURR], coin_draw[i].p);
     }
 }
 
@@ -114,137 +107,58 @@ void part_lerp_apply(float a)
     int i;
 
     for (i = 0; i < PART_MAX_COIN; i++)
-        if (part_coin[i].t > 0.0f)
-        {
-            v_lerp(part_coin[i].p,
+        if (coin_draw[i].t > 0.0f)
+            v_lerp(coin_draw[i].p,
                    part_lerp_coin[i].p[PREV],
                    part_lerp_coin[i].p[CURR], a);
-        }
 
-    for (i = 0; i < PART_MAX_GOAL; i++)
-        if (part_goal[i].t > 0.0f)
-        {
-            v_lerp(part_goal[i].p,
-                   part_lerp_goal[i].p[PREV],
-                   part_lerp_goal[i].p[CURR], a);
-        }
+    /* Upload the current state of the particles. It would be best to limit  */
+    /* this upload to only active particles, but it's more important to do   */
+    /* it all in a single call.                                              */
 
-    for (i = 0; i < PART_MAX_GOAL; i++)
-        if (part_jump[i].t > 0.0f)
-        {
-            v_lerp(part_jump[i].p,
-                   part_lerp_jump[i].p[PREV],
-                   part_lerp_jump[i].p[CURR], a);
-        }
+#ifdef PARTICLEVBO
+    glBindBuffer_   (GL_ARRAY_BUFFER, coin_vbo);
+    glBufferSubData_(GL_ARRAY_BUFFER, 0, sizeof (coin_draw), coin_draw);
+    glBindBuffer_   (GL_ARRAY_BUFFER, 0);
+#endif
 }
 
 /*---------------------------------------------------------------------------*/
 
-void part_reset(float zh, float jh)
+void part_reset(void)
 {
     int i;
 
-    goal_height = zh;
-    jump_height = jh;
-
     for (i = 0; i < PART_MAX_COIN; i++)
-        part_coin[i].t = 0.0f;
-
-    for (i = 0; i < PART_MAX_GOAL; i++)
-    {
-        float t = rnd(+0.1f,      +1.0f);
-        float a = rnd(-1.0f * PI, +1.0f * PI);
-        float w = rnd(-2.0f * PI, +2.0f * PI);
-
-        part_goal[i].t = t;
-        part_goal[i].a = V_DEG(a);
-        part_goal[i].w = V_DEG(w);
-
-        part_goal[i].c[0] = 1.0f;
-        part_goal[i].c[1] = 1.0f;
-        part_goal[i].c[2] = 0.0f;
-
-        part_goal[i].p[0] = fsinf(a);
-        part_goal[i].p[1] = (1.f - t) * goal_height;
-        part_goal[i].p[2] = fcosf(a);
-
-        part_goal[i].v[0] = 0.f;
-        part_goal[i].v[1] = 0.f;
-        part_goal[i].v[2] = 0.f;
-    }
-
-    for (i = 0; i < PART_MAX_JUMP; i++)
-    {
-        float t = rnd(+0.1f,      +1.0f);
-        float a = rnd(-1.0f * PI, +1.0f * PI);
-        float w = rnd(+0.5f,      +2.5f);
-
-        float vy = rnd(+0.025f, +0.25f);
-
-        part_jump[i].t = t;
-        part_jump[i].a = V_DEG(a);
-        part_jump[i].w = w;
-
-        part_jump[i].c[0] = 1.0f;
-        part_jump[i].c[1] = 1.0f;
-        part_jump[i].c[2] = 1.0f;
-
-        part_jump[i].p[0] = fsinf(a);
-        part_jump[i].p[1] = (1.f - t) * jump_height;
-        part_jump[i].p[2] = fcosf(a);
-
-        part_jump[i].v[0] = 0.f;
-        part_jump[i].v[1] = vy;
-        part_jump[i].v[2] = 0.f;
-    }
+        coin_draw[i].t = 0.0f;
 
     part_lerp_init();
 }
 
-void part_init(float zh, float jh)
+void part_init(void)
 {
-    memset(part_coin, 0, PART_MAX_COIN * sizeof (struct part));
-    memset(part_goal, 0, PART_MAX_GOAL * sizeof (struct part));
-    memset(part_jump, 0, PART_MAX_JUMP * sizeof (struct part));
-
-    part_text_star     = make_image_from_file(IMG_PART_STAR);
-    part_text_squiggle = make_image_from_file(IMG_PART_SQUIGGLE);
-
-    part_list = glGenLists(1);
-
-    glNewList(part_list, GL_COMPILE);
-    {
-        glBegin(GL_QUADS);
-        {
-            glTexCoord2f(0.f, 0.f);
-            glVertex2f(-PART_SIZE, -PART_SIZE);
-
-            glTexCoord2f(1.f, 0.f);
-            glVertex2f(+PART_SIZE, -PART_SIZE);
+    sol_load_mtrl(&coin_draw_mtrl, &coin_base_mtrl);
 
-            glTexCoord2f(1.f, 1.f);
-            glVertex2f(+PART_SIZE, +PART_SIZE);
+    memset(coin_vary, 0, PART_MAX_COIN * sizeof (struct part_vary));
+    memset(coin_draw, 0, PART_MAX_COIN * sizeof (struct part_draw));
 
-            glTexCoord2f(0.f, 1.f);
-            glVertex2f(-PART_SIZE, +PART_SIZE);
-        }
-        glEnd();
-    }
-    glEndList();
+#ifdef PARTICLEVBO
+    glGenBuffers_(1,              &coin_vbo);
+    glBindBuffer_(GL_ARRAY_BUFFER, coin_vbo);
+    glBufferData_(GL_ARRAY_BUFFER, sizeof (coin_draw),
+                                          coin_draw, GL_DYNAMIC_DRAW);
+    glBindBuffer_(GL_ARRAY_BUFFER, 0);
+#endif
 
-    part_reset(zh, jh);
+    part_reset();
 }
 
 void part_free(void)
 {
-    if (glIsList(part_list))
-        glDeleteLists(part_list, 1);
-
-    if (glIsTexture(part_text_star))
-        glDeleteTextures(1, &part_text_star);
+    if (glIsBuffer_(coin_vbo))
+        glDeleteBuffers_(1, &coin_vbo);
 
-    if (glIsTexture(part_text_squiggle))
-        glDeleteTextures(1, &part_text_squiggle);
+    sol_free_mtrl(&coin_draw_mtrl);
 }
 
 /*---------------------------------------------------------------------------*/
@@ -254,27 +168,24 @@ void part_burst(const float *p, const float *c)
     int i, n = 0;
 
     for (i = 0; n < 10 && i < PART_MAX_COIN; i++)
-        if (part_coin[i].t <= 0.f)
+        if (coin_draw[i].t <= 0.f)
         {
             float a = rnd(-1.0f * PI, +1.0f * PI);
             float b = rnd(+0.3f * PI, +0.5f * PI);
-            float w = rnd(-4.0f * PI, +4.0f * PI);
 
-            part_coin[i].p[0] = p[0];
-            part_coin[i].p[1] = p[1];
-            part_coin[i].p[2] = p[2];
+            coin_draw[i].c[0] = c[0];
+            coin_draw[i].c[1] = c[1];
+            coin_draw[i].c[2] = c[2];
 
-            part_coin[i].v[0] = 4.f * fcosf(a) * fcosf(b);
-            part_coin[i].v[1] = 4.f *            fsinf(b);
-            part_coin[i].v[2] = 4.f * fsinf(a) * fcosf(b);
+            coin_draw[i].p[0] = p[0];
+            coin_draw[i].p[1] = p[1];
+            coin_draw[i].p[2] = p[2];
 
-            part_coin[i].c[0] = c[0];
-            part_coin[i].c[1] = c[1];
-            part_coin[i].c[2] = c[2];
+            coin_vary[i].v[0] = 4.f * fcosf(a) * fcosf(b);
+            coin_vary[i].v[1] = 4.f *            fsinf(b);
+            coin_vary[i].v[2] = 4.f * fsinf(a) * fcosf(b);
 
-            part_coin[i].t = 1.f;
-            part_coin[i].a = 0.f;
-            part_coin[i].w = V_DEG(w);
+            coin_draw[i].t = 1.f;
 
             part_lerp_burst(i);
 
@@ -285,139 +196,94 @@ void part_burst(const float *p, const float *c)
 /*---------------------------------------------------------------------------*/
 
 static void part_fall(struct part_lerp *lerp,
-                      struct part *part, int n,
-                      const float *g, float dt)
+                      struct part_vary *vary,
+                      struct part_draw *draw,
+                      int n, const float *g, float dt)
 {
     int i;
 
     for (i = 0; i < n; i++)
-        if (part[i].t > 0.f)
+        if (draw[i].t > 0.f)
         {
-            part[i].t -= dt;
-
-            v_mad(part[i].v, part[i].v, g, dt);
-
-            v_mad(lerp[i].p[CURR], lerp[i].p[CURR], part[i].v, dt);
-        }
-}
-
-static void part_spin(struct part_lerp *lerp,
-                      struct part *part, int n,
-                      const float *g, float dt)
-{
-    int i;
+            draw[i].t -= dt;
 
-    for (i = 0; i < n; i++)
-        if (part[i].t > 0.f)
-        {
-            part[i].a += 30.f * dt;
+            v_mad(vary[i].v, vary[i].v, g, dt);
 
-            lerp[i].p[CURR][0] = fsinf(V_RAD(part[i].a));
-            lerp[i].p[CURR][2] = fcosf(V_RAD(part[i].a));
+            v_mad(lerp[i].p[CURR], lerp[i].p[CURR], vary[i].v, dt);
         }
+        else draw[i].t = 0.0f;
 }
 
 void part_step(const float *g, float dt)
 {
-    int i;
-
     part_lerp_copy();
-
-    part_fall(part_lerp_coin, part_coin, PART_MAX_COIN, g, dt);
-
-    if (g[1] > 0.f)
-        part_fall(part_lerp_goal, part_goal, PART_MAX_GOAL, g, dt);
-    else
-        part_spin(part_lerp_goal, part_goal, PART_MAX_GOAL, g, dt);
-
-    for (i = 0; i < PART_MAX_JUMP; i++)
-    {
-        part_lerp_jump[i].p[CURR][1] += part_jump[i].v[1] * dt;
-
-        if (part_lerp_jump[i].p[PREV][1] > jump_height)
-        {
-            part_lerp_jump[i].p[PREV][1] = 0.0f;
-            part_lerp_jump[i].p[CURR][1] = 0.0f;
-        }
-    }
+    part_fall(part_lerp_coin, coin_vary, coin_draw, PART_MAX_COIN, g, dt);
 }
 
 /*---------------------------------------------------------------------------*/
 
-static void part_draw(const float *M,
-                      const float *p, float r, float rz, float s)
+void part_draw_coin(struct s_rend *rend)
 {
-    glPushMatrix();
-    {
-        glTranslatef(r * p[0], p[1], r * p[2]);
-        glMultMatrixf(M);
-        glRotatef(rz, 0.f, 0.f, 1.f);
-        glScalef(s, s, 1.0f);
+    const GLfloat c[3] = { 0.0f, 1.0f, 0.0f };
+    GLint s = config_get_d(CONFIG_HEIGHT) / 8;
 
-        glCallList(part_list);
-    }
-    glPopMatrix();
-}
-
-void part_draw_coin(const float *M, float t)
-{
-    int i;
-
-    glBindTexture(GL_TEXTURE_2D, part_text_star);
-
-    for (i = 0; i < PART_MAX_COIN; i++)
-        if (part_coin[i].t > 0.f)
-        {
-            glColor4f(part_coin[i].c[0],
-                      part_coin[i].c[1],
-                      part_coin[i].c[2],
-                      part_coin[i].t);
+    sol_apply_mtrl(&coin_draw_mtrl, rend);
 
-            part_draw(M, part_coin[i].p, 1.0f, t * part_coin[i].w, 1.0f);
-        }
-}
+    /* Draw the entire buffer.  Dead particles have zero opacity anyway. */
 
-void part_draw_goal(const float *M, float radius, float a, float t)
-{
-    int i;
+#ifdef PARTICLEVBO
+    glBindBuffer_(GL_ARRAY_BUFFER, coin_vbo);
+#else
+    glBindBuffer_(GL_ARRAY_BUFFER, 0);
+#endif
 
-    glBindTexture(GL_TEXTURE_2D, part_text_star);
-
-    glColor4f(1.0f, 1.0f, 0.0f, a);
-
-    for (i = 0; i < PART_MAX_GOAL; i++)
-        if (part_goal[i].t > 0.0f)
-            part_draw(M, part_goal[i].p, radius - 0.05f,
-                      t * part_goal[i].w, 1.0f);
-}
+    if (tex_env_stage(TEX_STAGE_SHADOW))
+    {
+        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
 
-void part_draw_jump(const float *M, float radius, float a, float t)
-{
-    int i;
+        if (tex_env_stage(TEX_STAGE_CLIP))
+            glDisableClientState(GL_TEXTURE_COORD_ARRAY);
 
-    glBindTexture(GL_TEXTURE_2D, part_text_squiggle);
+        tex_env_stage(TEX_STAGE_TEXTURE);
+    }
+    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
 
-    for (i = 0; i < PART_MAX_JUMP; i++)
+    glDisableClientState(GL_NORMAL_ARRAY);
+    glEnableClientState(GL_COLOR_ARRAY);
     {
-        glColor4f(part_jump[i].c[0],
-                  part_jump[i].c[1],
-                  part_jump[i].c[2],
-                  1.0f - part_jump[i].p[1] / jump_height);
+#ifdef PARTICLEVBO
+        glColorPointer (4, GL_FLOAT, sizeof (struct part_draw),
+                        (GLvoid *) offsetof (struct part_draw, c));
+        glVertexPointer(3, GL_FLOAT, sizeof (struct part_draw),
+                        (GLvoid *) offsetof (struct part_draw, p));
+#else
+        glColorPointer (4, GL_FLOAT, sizeof (struct part_draw), coin_draw[0].c);
+        glVertexPointer(3, GL_FLOAT, sizeof (struct part_draw), coin_draw[0].p);
+#endif
+
+        glEnable(GL_POINT_SPRITE);
+        {
+            glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
+            glPointParameterfv_(GL_POINT_DISTANCE_ATTENUATION, c);
+            glPointSize(s);
 
-        /*
-         * X is the current time since some Epoch, Y is the time it
-         * takes for a squiggle to grow to its full size and then
-         * shrink again.  F is the current scale of the squiggle in
-         * the interval [0.0, 1.0].
-         */
+            glDrawArrays(GL_POINTS, 0, PART_MAX_COIN);
+        }
+        glDisable(GL_POINT_SPRITE);
+    }
+    glDisableClientState(GL_COLOR_ARRAY);
+    glEnableClientState(GL_NORMAL_ARRAY);
 
-#define F(x, y) fabsf(fcosf(((x) / (y)) * PI))
+    if (tex_env_stage(TEX_STAGE_SHADOW))
+    {
+        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 
-        part_draw(M, part_jump[i].p, radius - 0.05f,
-                  0.0f, F(t, part_jump[i].w));
+        if (tex_env_stage(TEX_STAGE_CLIP))
+            glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 
-#undef F
+        tex_env_stage(TEX_STAGE_TEXTURE);
     }
+    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 }
 
 /*---------------------------------------------------------------------------*/
index 08cc645..41583ac 100644 (file)
@@ -1,12 +1,13 @@
 #ifndef PART_H
 #define PART_H
 
+#include "solid_draw.h"
+
 /*---------------------------------------------------------------------------*/
 
-#define IMG_PART_STAR     "png/part.png"
-#define IMG_PART_SQUIGGLE "png/squiggle.png"
+#define IMG_PART_STAR     "png/part"
 
-#define PART_MAX_COIN 256
+#define PART_MAX_COIN  64
 #define PART_MAX_GOAL  64
 #define PART_MAX_JUMP  64
 
 
 /*---------------------------------------------------------------------------*/
 
-void part_reset(float, float);
-void part_init(float, float);
+void part_reset(void);
+void part_init(void);
 void part_free(void);
 
 void part_burst(const float *, const float *);
 void part_step(const float *, float);
 
-void part_draw_coin(const float *, float);
-void part_draw_goal(const float *, float, float, float);
-void part_draw_jump(const float *, float, float, float);
+void part_draw_coin(struct s_rend *);
 
 void part_lerp_apply(float);
 
index cecece3..4e9041a 100644 (file)
@@ -26,8 +26,8 @@
 enum
 {
     SOL_VER_MINIMUM = 6,
-    SOL_VER_PATH_FLAGS,
-    SOL_VER_CURRENT = SOL_VER_PATH_FLAGS
+    SOL_VER_GLES,
+    SOL_VER_CURRENT = SOL_VER_GLES
 };
 
 #define SOL_MAGIC (0xAF | 'S' << 8 | 'O' << 16 | 'L' << 24)
@@ -63,6 +63,40 @@ static void sol_load_mtrl(fs_file fin, struct b_mtrl *mp)
     get_index(fin, &mp->fl);
 
     fs_read(mp->f, 1, PATHMAX, fin);
+
+    if (sol_version < SOL_VER_GLES)
+    {
+        static const int flags[][2] = {
+            { 1, M_SHADOWED },
+            { 2, M_TRANSPARENT },
+            { 4, M_REFLECTIVE | M_SHADOWED },
+            { 8, M_ENVIRONMENT },
+            { 16, M_ADDITIVE },
+            { 32, M_CLAMP_S | M_CLAMP_T },
+            { 64, M_DECAL },
+            { 128, M_TWO_SIDED }
+        };
+
+        /* Convert 1.5.4 material flags. */
+
+        if (mp->fl)
+        {
+            int i, f;
+
+            for (f = 0, i = 0; i < ARRAYSIZE(flags); i++)
+                if (mp->fl & flags[i][0])
+                    f |= flags[i][1];
+
+            mp->fl = f;
+        }
+        else
+        {
+            /* Must be "mtrl/invisible". */
+
+            mp->fl = M_TRANSPARENT;
+            mp->d[3] = 0.0f;
+        }
+    }
 }
 
 static void sol_load_vert(fs_file fin, struct b_vert *vp)
@@ -87,18 +121,68 @@ static void sol_load_texc(fs_file fin, struct b_texc *tp)
     get_array(fin,  tp->u, 2);
 }
 
-static void sol_load_geom(fs_file fin, struct b_geom *gp)
+static void sol_load_offs(fs_file fin, struct b_offs *op)
+{
+    get_index(fin, &op->ti);
+    get_index(fin, &op->si);
+    get_index(fin, &op->vi);
+}
+
+static void sol_load_geom(fs_file fin, struct b_geom *gp, struct s_base *fp)
 {
     get_index(fin, &gp->mi);
-    get_index(fin, &gp->ti);
-    get_index(fin, &gp->si);
-    get_index(fin, &gp->vi);
-    get_index(fin, &gp->tj);
-    get_index(fin, &gp->sj);
-    get_index(fin, &gp->vj);
-    get_index(fin, &gp->tk);
-    get_index(fin, &gp->sk);
-    get_index(fin, &gp->vk);
+
+    if (sol_version >= SOL_VER_GLES)
+    {
+        get_index(fin, &gp->oi);
+        get_index(fin, &gp->oj);
+        get_index(fin, &gp->ok);
+    }
+    else
+    {
+        struct b_offs ov[3];
+        int i, j, iv[3], oc;
+        void *p;
+
+        oc = 0;
+
+        for (i = 0; i < 3; i++)
+        {
+            get_index(fin, &ov[i].ti);
+            get_index(fin, &ov[i].si);
+            get_index(fin, &ov[i].vi);
+
+            iv[i] = -1;
+
+            for (j = 0; j < fp->oc; j++)
+                if (ov[i].ti == fp->ov[j].ti &&
+                    ov[i].si == fp->ov[j].si &&
+                    ov[i].vi == fp->ov[j].vi)
+                {
+                    iv[i] = j;
+                    break;
+                }
+
+            if (j == fp->oc)
+                oc++;
+        }
+
+        if (oc && (p = realloc(fp->ov, sizeof (struct b_offs) * (fp->oc + oc))))
+        {
+            fp->ov = p;
+
+            for (i = 0; i < 3; i++)
+                if (iv[i] < 0)
+                {
+                    fp->ov[fp->oc] = ov[i];
+                    iv[i] = fp->oc++;
+                }
+        }
+
+        gp->oi = iv[0];
+        gp->oj = iv[1];
+        gp->ok = iv[2];
+    }
 }
 
 static void sol_load_lump(fs_file fin, struct b_lump *lp)
@@ -134,7 +218,7 @@ static void sol_load_path(fs_file fin, struct b_path *pp)
     pp->tm = TIME_TO_MS(pp->t);
     pp->t  = MS_TO_TIME(pp->tm);
 
-    if (sol_version >= SOL_VER_PATH_FLAGS)
+    if (sol_version >= SOL_VER_GLES)
         get_index(fin, &pp->fl);
 
     pp->e[0] = 1.0f;
@@ -235,6 +319,10 @@ static void sol_load_indx(fs_file fin, struct s_base *fp)
     get_index(fin, &fp->ec);
     get_index(fin, &fp->sc);
     get_index(fin, &fp->tc);
+
+    if (sol_version >= SOL_VER_GLES)
+        get_index(fin, &fp->oc);
+
     get_index(fin, &fp->gc);
     get_index(fin, &fp->lc);
     get_index(fin, &fp->nc);
@@ -271,6 +359,8 @@ static int sol_load_file(fs_file fin, struct s_base *fp)
         fp->sv = (struct b_side *) calloc(fp->sc, sizeof (*fp->sv));
     if (fp->tc)
         fp->tv = (struct b_texc *) calloc(fp->tc, sizeof (*fp->tv));
+    if (fp->oc)
+        fp->ov = (struct b_offs *) calloc(fp->oc, sizeof (*fp->ov));
     if (fp->gc)
         fp->gv = (struct b_geom *) calloc(fp->gc, sizeof (*fp->gv));
     if (fp->lc)
@@ -309,7 +399,8 @@ static int sol_load_file(fs_file fin, struct s_base *fp)
     for (i = 0; i < fp->ec; i++) sol_load_edge(fin, fp->ev + i);
     for (i = 0; i < fp->sc; i++) sol_load_side(fin, fp->sv + i);
     for (i = 0; i < fp->tc; i++) sol_load_texc(fin, fp->tv + i);
-    for (i = 0; i < fp->gc; i++) sol_load_geom(fin, fp->gv + i);
+    for (i = 0; i < fp->oc; i++) sol_load_offs(fin, fp->ov + i);
+    for (i = 0; i < fp->gc; i++) sol_load_geom(fin, fp->gv + i, fp);
     for (i = 0; i < fp->lc; i++) sol_load_lump(fin, fp->lv + i);
     for (i = 0; i < fp->nc; i++) sol_load_node(fin, fp->nv + i);
     for (i = 0; i < fp->pc; i++) sol_load_path(fin, fp->pv + i);
@@ -396,6 +487,7 @@ void sol_free_base(struct s_base *fp)
     if (fp->ev) free(fp->ev);
     if (fp->sv) free(fp->sv);
     if (fp->tv) free(fp->tv);
+    if (fp->ov) free(fp->ov);
     if (fp->gv) free(fp->gv);
     if (fp->lv) free(fp->lv);
     if (fp->nv) free(fp->nv);
@@ -450,18 +542,19 @@ static void sol_stor_texc(fs_file fout, struct b_texc *tp)
     put_array(fout,  tp->u, 2);
 }
 
+static void sol_stor_offs(fs_file fout, struct b_offs *op)
+{
+    put_index(fout, op->ti);
+    put_index(fout, op->si);
+    put_index(fout, op->vi);
+}
+
 static void sol_stor_geom(fs_file fout, struct b_geom *gp)
 {
     put_index(fout, gp->mi);
-    put_index(fout, gp->ti);
-    put_index(fout, gp->si);
-    put_index(fout, gp->vi);
-    put_index(fout, gp->tj);
-    put_index(fout, gp->sj);
-    put_index(fout, gp->vj);
-    put_index(fout, gp->tk);
-    put_index(fout, gp->sk);
-    put_index(fout, gp->vk);
+    put_index(fout, gp->oi);
+    put_index(fout, gp->oj);
+    put_index(fout, gp->ok);
 }
 
 static void sol_stor_lump(fs_file fout, struct b_lump *lp)
@@ -589,6 +682,7 @@ static void sol_stor_file(fs_file fout, struct s_base *fp)
     put_index(fout, fp->ec);
     put_index(fout, fp->sc);
     put_index(fout, fp->tc);
+    put_index(fout, fp->oc);
     put_index(fout, fp->gc);
     put_index(fout, fp->lc);
     put_index(fout, fp->nc);
@@ -611,6 +705,7 @@ static void sol_stor_file(fs_file fout, struct s_base *fp)
     for (i = 0; i < fp->ec; i++) sol_stor_edge(fout, fp->ev + i);
     for (i = 0; i < fp->sc; i++) sol_stor_side(fout, fp->sv + i);
     for (i = 0; i < fp->tc; i++) sol_stor_texc(fout, fp->tv + i);
+    for (i = 0; i < fp->oc; i++) sol_stor_offs(fout, fp->ov + i);
     for (i = 0; i < fp->gc; i++) sol_stor_geom(fout, fp->gv + i);
     for (i = 0; i < fp->lc; i++) sol_stor_lump(fout, fp->lv + i);
     for (i = 0; i < fp->nc; i++) sol_stor_node(fout, fp->nv + i);
index c041300..8a8f21f 100644 (file)
  * structure to which the variable  refers.  Y determines the usage of
  * the variable.
  *
- * The Xs are as documented by struct s_file:
+ * The Xs are as documented by struct s_base:
  *
- *     f  File          (struct s_file)
- *     m  Material      (struct s_mtrl)
- *     v  Vertex        (struct s_vert)
- *     e  Edge          (struct s_edge)
- *     s  Side          (struct s_side)
- *     t  Texture coord (struct s_texc)
- *     g  Geometry      (struct s_geom)
- *     l  Lump          (struct s_lump)
- *     n  Node          (struct s_node)
- *     p  Path          (struct s_path)
- *     b  Body          (struct s_body)
- *     h  Item          (struct s_item)
- *     z  Goal          (struct s_goal)
- *     j  Jump          (struct s_jump)
- *     x  Switch        (struct s_swch)
- *     r  Billboard     (struct s_bill)
- *     u  User          (struct s_ball)
- *     w  Viewpoint     (struct s_view)
- *     d  Dictionary    (struct s_dict)
+ *     f  File          (struct s_base)
+ *     m  Material      (struct b_mtrl)
+ *     v  Vertex        (struct b_vert)
+ *     e  Edge          (struct b_edge)
+ *     s  Side          (struct b_side)
+ *     t  Texture coord (struct b_texc)
+ *     g  Geometry      (struct b_geom)
+ *     o  Offset        (struct b_offs)
+ *     l  Lump          (struct b_lump)
+ *     n  Node          (struct b_node)
+ *     p  Path          (struct b_path)
+ *     b  Body          (struct b_body)
+ *     h  Item          (struct b_item)
+ *     z  Goal          (struct b_goal)
+ *     j  Jump          (struct b_jump)
+ *     x  Switch        (struct b_swch)
+ *     r  Billboard     (struct b_bill)
+ *     u  User          (struct b_ball)
+ *     w  Viewpoint     (struct b_view)
+ *     d  Dictionary    (struct b_dict)
  *     i  Index         (int)
  *     a  Text          (char)
  *
@@ -71,7 +72,7 @@
  * Those members that do not conform to this convention are explicitly
  * documented with a comment.
  *
- * These prefixes are still available: c k o q y.
+ * These prefixes are still available: c k q y.
  */
 
 /*
 
 /* Material type flags */
 
-#define M_OPAQUE       1
-#define M_TRANSPARENT  2
-#define M_REFLECTIVE   4
-#define M_ENVIRONMENT  8
-#define M_ADDITIVE    16
-#define M_CLAMPED     32
-#define M_DECAL       64
-#define M_TWO_SIDED  128
-#define M_SHADOWED   256
+#define M_REFLECTIVE  (1 <<  8)
+#define M_TRANSPARENT (1 <<  7)
+#define M_SHADOWED    (1 <<  6)
+#define M_DECAL       (1 <<  5)
+#define M_ENVIRONMENT (1 <<  4)
+#define M_TWO_SIDED   (1 <<  3)
+#define M_ADDITIVE    (1 <<  2)
+#define M_CLAMP_S     (1 <<  1)
+#define M_CLAMP_T     (1 <<  0)
 
 /* Billboard types. */
 
@@ -153,12 +154,15 @@ struct b_texc
     float u[2];                                /* texture coordinate         */
 };
 
+struct b_offs
+{
+    int ti, si, vi;
+};
+
 struct b_geom
 {
     int mi;
-    int ti, si, vi;
-    int tj, sj, vj;
-    int tk, sk, vk;
+    int oi, oj, ok;
 };
 
 struct b_lump
@@ -280,6 +284,7 @@ struct s_base
     int ec;
     int sc;
     int tc;
+    int oc;
     int gc;
     int lc;
     int nc;
@@ -301,6 +306,7 @@ struct s_base
     struct b_edge *ev;
     struct b_side *sv;
     struct b_texc *tv;
+    struct b_offs *ov;
     struct b_geom *gv;
     struct b_lump *lv;
     struct b_node *nv;
index 5cab6d3..1ab4289 100644 (file)
@@ -22,6 +22,7 @@
 
 #include "glext.h"
 #include "vec3.h"
+#include "geom.h"
 #include "image.h"
 #include "base_image.h"
 #include "base_config.h"
 
 /*---------------------------------------------------------------------------*/
 
-static int sol_enum_mtrl(const struct s_base *base,
-                         const struct b_body *bp, int mi)
+/* EXCLUDED material flags for each rendering pass. */
+
+static const int pass_ex[] = {
+    M_REFLECTIVE | M_TRANSPARENT | M_DECAL,
+    M_REFLECTIVE | M_TRANSPARENT,
+    M_REFLECTIVE,
+    M_REFLECTIVE | M_DECAL,
+    0,
+};
+
+/* INCLUDED material flags for each rendering pass. */
+
+static const int pass_in[] = {
+    0,
+    M_DECAL,
+    M_DECAL | M_TRANSPARENT,
+    M_TRANSPARENT,
+    M_REFLECTIVE,
+};
+
+/*---------------------------------------------------------------------------*/
+
+static void sol_transform(const struct s_vary *vary,
+                          const struct v_body *bp, int ui)
 {
-    int li, gi, c = 0;
+    float a;
+    float e[4];
+    float p[3];
+    float v[3];
 
-    /* Count all lump geoms with this material. */
+    /* Apply the body position and rotation to the model-view matrix. */
 
-    for (li = 0; li < bp->lc; li++)
+    sol_body_p(p, vary, bp->pi, bp->t);
+    sol_body_e(e, vary, bp, 0);
+
+    q_as_axisangle(e, v, &a);
+
+    glTranslatef(p[0], p[1], p[2]);
+    glRotatef(V_DEG(a), v[0], v[1], v[2]);
+
+    /* Apply the shadow transform to the texture matrix. */
+
+    if (ui >= 0 && ui < vary->uc && vary->uv[ui].r > 0.0f)
     {
-        int g0 = base->lv[bp->l0 + li].g0;
-        int gc = base->lv[bp->l0 + li].gc;
+        struct v_ball *up = vary->uv + ui;
+
+        if (tex_env_stage(TEX_STAGE_SHADOW))
+        {
+            glMatrixMode(GL_TEXTURE);
+            {
+                float k = 0.25f / up->r;
+
+                glLoadIdentity();
+
+                /* Center the shadow texture on the ball. */
+
+                glTranslatef(0.5f, 0.5f, 0.0f);
+
+                /* Transform ball XZ position to ST texture coordinate. */
+
+                glRotatef(-90.0f, 1.0f, 0.0f, 0.0f);
 
-        for (gi = 0; gi < gc; gi++)
-            if (base->gv[base->iv[g0 + gi]].mi == mi)
-                c++;
+                /* Scale the shadow texture to the radius of the ball. */
+
+                glScalef(k, k, k);
+
+                /* Move the shadow texture under the ball. */
+
+                glTranslatef(-up->p[0], -up->p[1], -up->p[2]);
+
+                /* Apply the body position and rotation. */
+
+                glTranslatef(p[0], p[1], p[2]);
+                glRotatef(V_DEG(a), v[0], v[1], v[2]);
+
+                /* Vertically center clipper texture on ball position. */
+
+                if (tex_env_stage(TEX_STAGE_CLIP))
+                {
+                    glLoadIdentity();
+                    glTranslatef(p[0] - up->p[0],
+                                 p[1] - up->p[1] + 0.5f,
+                                 p[2] - up->p[2]);
+                    glRotatef(V_DEG(a), v[0], v[1], v[2]);
+
+                }
+            }
+            glMatrixMode(GL_MODELVIEW);
+
+            tex_env_stage(TEX_STAGE_TEXTURE);
+        }
     }
+}
 
-    /* Count all body geoms with this material. */
+/*---------------------------------------------------------------------------*/
 
-    for (gi = 0; gi < bp->gc; gi++)
-        if (base->gv[base->iv[bp->g0 + gi]].mi == mi)
-            c++;
+static void sol_load_bill(struct s_draw *draw)
+{
+    static const GLfloat data[] = {
+        0.0f,  0.0f, -1.0f, -1.0f,
+        1.0f,  0.0f,  1.0f, -1.0f,
+        0.0f,  1.0f, -1.0f,  1.0f,
+        1.0f,  1.0f,  1.0f,  1.0f,
+
+        0.0f,  0.0f, -0.5f,  0.0f,
+        1.0f,  0.0f,  0.5f,  0.0f,
+        0.0f,  1.0f, -0.5f,  1.0f,
+        1.0f,  1.0f,  0.5f,  1.0f,
+
+        0.0f,  0.0f, -0.5f, -0.5f,
+        1.0f,  0.0f,  0.5f, -0.5f,
+        0.0f,  1.0f, -0.5f,  0.5f,
+        1.0f,  1.0f,  0.5f,  0.5f,
+    };
+
+    /* Initialize a vertex buffer object for billboard drawing. */
+
+    glGenBuffers_(1,              &draw->bill);
+    glBindBuffer_(GL_ARRAY_BUFFER, draw->bill);
+    glBufferData_(GL_ARRAY_BUFFER, sizeof (data), data, GL_STATIC_DRAW);
+    glBindBuffer_(GL_ARRAY_BUFFER, 0);
+}
 
-    return c;
+static void sol_free_bill(struct s_draw *draw)
+{
+    if (glIsBuffer_(draw->bill))
+        glDeleteBuffers_(1, &draw->bill);
 }
 
-static int sol_enum_body(const struct s_base *base,
-                         const struct b_body *bp, int fl)
+static void sol_draw_bill(GLfloat w, GLfloat h, GLboolean edge)
 {
-    int mi, c = 0;
+    glPushMatrix();
+    {
+        glScalef(0.5f * w, 0.5f * h, 1.0f);
 
-    /* Count all geoms with this flag. */
+        if (edge)
+            glTranslatef(0.0f, 0.5f, 0.0f);
 
-    for (mi = 0; mi < base->mc; mi++)
-        if (base->mv[mi].fl & fl)
-            c = c + sol_enum_mtrl(base, bp, mi);
+        glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+    }
+    glPopMatrix();
+}
 
-    return c;
+/*---------------------------------------------------------------------------*/
+
+/* NOTE: The state management here presumes that billboard rendering is      */
+/* NESTED within a wider SOL rendering process. That is: sol_draw_enable     */
+/* has been called and sol_draw_disable will be called in the future.        */
+/* Thus the "default" VBO state retained by billboard rendering is the       */
+/* state appropriate for normal SOL rendering.                               */
+
+static void sol_bill_enable(const struct s_draw *draw)
+{
+    const size_t s = sizeof (GLfloat);
+
+    glBindBuffer_(GL_ARRAY_BUFFER, draw->bill);
+
+    glTexCoordPointer(2, GL_FLOAT, s * 4, (GLvoid *) (    0));
+    glVertexPointer  (2, GL_FLOAT, s * 4, (GLvoid *) (s * 2));
+}
+
+static void sol_bill_disable(void)
+{
 }
 
 /*---------------------------------------------------------------------------*/
 
 #define tobyte(f) ((GLubyte) (f * 255.0f))
 
-#define color_cmp(a, b) (tobyte((a)[0]) == tobyte((b)[0]) && \
-                         tobyte((a)[1]) == tobyte((b)[1]) && \
-                         tobyte((a)[2]) == tobyte((b)[2]) && \
-                         tobyte((a)[3]) == tobyte((b)[3]))
-
 static struct b_mtrl default_base_mtrl =
 {
     { 0.8f, 0.8f, 0.8f, 1.0f },
     { 0.2f, 0.2f, 0.2f, 1.0f },
     { 0.0f, 0.0f, 0.0f, 1.0f },
     { 0.0f, 0.0f, 0.0f, 1.0f },
-    { 0.0f }, 0.0f, M_OPAQUE, ""
+    { 0.0f }, 0.0f, 0, ""
 };
 
+/* Nasty. */
+
 static struct d_mtrl default_draw_mtrl =
 {
-    &default_base_mtrl, 0
+    &default_base_mtrl,
+    0xffcccccc,
+    0xff333333,
+    0xff000000,
+    0xff000000,
+    0x00000000,
+    0
 };
 
-static const struct d_mtrl *sol_draw_mtrl(const struct s_draw *draw,
-                                          const struct d_mtrl *mp_draw,
-                                          const struct d_mtrl *mq_draw)
+void sol_apply_mtrl(const struct d_mtrl *mp_draw, struct s_rend *rend)
 {
     const struct b_mtrl *mp_base = mp_draw->base;
+    const struct d_mtrl *mq_draw = rend->mp;
     const struct b_mtrl *mq_base = mq_draw->base;
 
-    /* Change material properties only as needed. */
+    /* Bind the texture. */
 
-    if (!color_cmp(mp_base->a, mq_base->a))
-        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,   mp_base->a);
-    if (!color_cmp(mp_base->d, mq_base->d))
+    if (mp_draw->o != mq_draw->o)
+        glBindTexture(GL_TEXTURE_2D, mp_draw->o);
+
+    /* Set material properties. */
+
+    if (mp_draw->d != mq_draw->d)
         glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE,   mp_base->d);
-    if (!color_cmp(mp_base->s, mq_base->s))
+    if (mp_draw->a != mq_draw->a)
+        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT,   mp_base->a);
+    if (mp_draw->s != mq_draw->s)
         glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR,  mp_base->s);
-    if (!color_cmp(mp_base->e, mq_base->e))
+    if (mp_draw->e != mq_draw->e)
         glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION,  mp_base->e);
-    if (tobyte(mp_base->h[0]) != tobyte(mq_base->h[0]))
+    if (mp_draw->h != mq_draw->h)
         glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mp_base->h);
 
-    /* Bind the texture. */
+    /* Ball shadow. */
 
-    if (mp_draw->o != mq_draw->o)
-        glBindTexture(GL_TEXTURE_2D, mp_draw->o);
+    if ((mp_base->fl & M_SHADOWED) ^ (mq_base->fl & M_SHADOWED))
+    {
+        if (mp_base->fl & M_SHADOWED)
+            shad_draw_set();
+        else
+            shad_draw_clr();
+    }
 
-    /* Enable environment mapping. */
+    /* Environment mapping. */
 
-    if ((mp_base->fl & M_ENVIRONMENT) && !(mq_base->fl & M_ENVIRONMENT))
+#if !ENABLE_OPENGLES
+    if ((mp_base->fl & M_ENVIRONMENT) ^ (mq_base->fl & M_ENVIRONMENT))
     {
-        glEnable(GL_TEXTURE_GEN_S);
-        glEnable(GL_TEXTURE_GEN_T);
+        if (mp_base->fl & M_ENVIRONMENT)
+        {
+            glEnable(GL_TEXTURE_GEN_S);
+            glEnable(GL_TEXTURE_GEN_T);
 
-        glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
-        glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+            glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+            glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP);
+        }
+        else
+        {
+            glDisable(GL_TEXTURE_GEN_S);
+            glDisable(GL_TEXTURE_GEN_T);
+        }
     }
+#endif
 
-    /* Disable environment mapping. */
+    /* Additive blending. */
 
-    if ((mq_base->fl & M_ENVIRONMENT) && !(mp_base->fl & M_ENVIRONMENT))
+    if ((mp_base->fl & M_ADDITIVE) ^ (mq_base->fl & M_ADDITIVE))
     {
-        glDisable(GL_TEXTURE_GEN_S);
-        glDisable(GL_TEXTURE_GEN_T);
+        if (mp_base->fl & M_ADDITIVE)
+            glBlendFunc(GL_ONE, GL_ONE);
+        else
+            glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
     }
 
-    /* Enable additive blending. */
-
-    if ((mp_base->fl & M_ADDITIVE) && !(mq_base->fl & M_ADDITIVE))
-        glBlendFunc(GL_ONE, GL_ONE);
-
-    /* Enable standard blending. */
-
-    if ((mq_base->fl & M_ADDITIVE) && !(mp_base->fl & M_ADDITIVE))
-        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
-
-    /* Enable visibility-from-behind. */
+    /* Visibility-from-behind. */
 
-    if ((mp_base->fl & M_TWO_SIDED) && !(mq_base->fl & M_TWO_SIDED))
+    if ((mp_base->fl & M_TWO_SIDED) ^ (mq_base->fl & M_TWO_SIDED))
     {
-        glDisable(GL_CULL_FACE);
-        glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1);
+        if (mp_base->fl & M_TWO_SIDED)
+        {
+            glDisable(GL_CULL_FACE);
+            glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, 1);
+        }
+        else
+        {
+            glEnable(GL_CULL_FACE);
+            glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, 0);
+        }
     }
 
-    /* Disable visibility-from-behind. */
+    /* Decal offset. */
 
-    if ((mq_base->fl & M_TWO_SIDED) && !(mp_base->fl & M_TWO_SIDED))
+    if ((mp_base->fl & M_DECAL) ^ (mq_base->fl & M_DECAL))
     {
-        glEnable(GL_CULL_FACE);
-        glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 0);
+        if (mp_base->fl & M_DECAL)
+        {
+            glEnable(GL_POLYGON_OFFSET_FILL);
+            glPolygonOffset(-1.0f, -2.0f);
+        }
+        else
+            glDisable(GL_POLYGON_OFFSET_FILL);
     }
 
-    /* Enable decal offset. */
+    rend->mp = mp_draw;
+}
 
-    if ((mp_base->fl & M_DECAL) && !(mq_base->fl & M_DECAL))
-    {
-        glEnable(GL_POLYGON_OFFSET_FILL);
-        glPolygonOffset(-1.0f, -2.0f);
-    }
+static GLuint sol_find_texture(const char *name)
+{
+    char png[MAXSTR];
+    char jpg[MAXSTR];
 
-    /* Disable decal offset. */
+    GLuint o;
 
-    if ((mq_base->fl & M_DECAL) && !(mp_base->fl & M_DECAL))
-        glDisable(GL_POLYGON_OFFSET_FILL);
+    /* Prefer a lossless copy of the texture over a lossy compression. */
 
-    return mp_draw;
-}
+    strncpy(png, name, PATHMAX); strcat(png, ".png");
+    strncpy(jpg, name, PATHMAX); strcat(jpg, ".jpg");
 
-static const struct d_mtrl *sol_back_bill(const struct s_draw *draw,
-                                           const struct b_bill *rp,
-                                           const struct d_mtrl *mp,
-                                           float t)
-{
-    float T = (rp->t > 0.0f) ? (fmodf(t, rp->t) - rp->t / 2) : 0.0f;
+    /* Check for a PNG. */
 
-    float w = rp->w[0] + rp->w[1] * T + rp->w[2] * T * T;
-    float h = rp->h[0] + rp->h[1] * T + rp->h[2] * T * T;
+    if ((o = make_image_from_file(png)))
+        return o;
 
-    if (w > 0 && h > 0)
-    {
-        float rx = rp->rx[0] + rp->rx[1] * T + rp->rx[2] * T * T;
-        float ry = rp->ry[0] + rp->ry[1] * T + rp->ry[2] * T * T;
-        float rz = rp->rz[0] + rp->rz[1] * T + rp->rz[2] * T * T;
+    /* Check for a JPG. */
 
-        glPushMatrix();
-        {
-            float y0 = (rp->fl & B_EDGE) ? 0 : -h / 2;
-            float y1 = (rp->fl & B_EDGE) ? h : +h / 2;
+    if ((o = make_image_from_file(jpg)))
+        return o;
 
-            glRotatef(ry, 0.0f, 1.0f, 0.0f);
-            glRotatef(rx, 1.0f, 0.0f, 0.0f);
-            glTranslatef(0.0f, 0.0f, -rp->d);
+    return 0;
+}
 
-            if (rp->fl & B_FLAT)
-            {
-                glRotatef(-rx - 90.0f, 1.0f, 0.0f, 0.0f);
-                glRotatef(-ry,         0.0f, 0.0f, 1.0f);
-            }
-            if (rp->fl & B_EDGE)
-                glRotatef(-rx,         1.0f, 0.0f, 0.0f);
+void sol_load_mtrl(struct d_mtrl *mp, const struct b_mtrl *mq)
+{
+    mp->base = mq;
 
-            glRotatef(rz, 0.0f, 0.0f, 1.0f);
+    if ((mp->o = sol_find_texture(_(mq->f))))
+    {
+        /* Set the texture to clamp or repeat based on material type. */
 
-            mp = sol_draw_mtrl(draw, draw->mv + rp->mi, mp);
+        if (mq->fl & M_CLAMP_S)
+            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+        else
+            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
 
-            glBegin(GL_QUADS);
-            {
-                glTexCoord2f(0.0f, 0.0f); glVertex2f(-w / 2, y0);
-                glTexCoord2f(1.0f, 0.0f); glVertex2f(+w / 2, y0);
-                glTexCoord2f(1.0f, 1.0f); glVertex2f(+w / 2, y1);
-                glTexCoord2f(0.0f, 1.0f); glVertex2f(-w / 2, y1);
-            }
-            glEnd();
-        }
-        glPopMatrix();
+        if (mq->fl & M_CLAMP_T)
+            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+        else
+            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
     }
 
-    return mp;
+    /* Cache the 32-bit material values for quick comparison. */
+
+    mp->d = (tobyte(mq->d[0]))
+        |   (tobyte(mq->d[1]) <<  8)
+        |   (tobyte(mq->d[2]) << 16)
+        |   (tobyte(mq->d[3]) << 24);
+    mp->a = (tobyte(mq->a[0]))
+        |   (tobyte(mq->a[1]) <<  8)
+        |   (tobyte(mq->a[2]) << 16)
+        |   (tobyte(mq->a[3]) << 24);
+    mp->s = (tobyte(mq->s[0]))
+        |   (tobyte(mq->s[1]) <<  8)
+        |   (tobyte(mq->s[2]) << 16)
+        |   (tobyte(mq->s[3]) << 24);
+    mp->e = (tobyte(mq->e[0]))
+        |   (tobyte(mq->e[1]) <<  8)
+        |   (tobyte(mq->e[2]) << 16)
+        |   (tobyte(mq->e[3]) << 24);
+    mp->h = (tobyte(mq->h[0]));
 }
 
-/*---------------------------------------------------------------------------*/
+void sol_free_mtrl(struct d_mtrl *mp)
+{
+    if (glIsTexture(mp->o))
+        glDeleteTextures(1, &mp->o);
+}
 
-void sol_back(const struct s_draw *draw, float n, float f, float t)
+static int sol_test_mtrl(const struct d_mtrl *mp, int p)
 {
-    const struct d_mtrl *mp = &default_draw_mtrl;
+    /* Test whether the material flags exclude f0 and include f1. */
 
-    int ri;
+    return ((mp->base->fl & pass_in[p]) == pass_in[p] &&
+            (mp->base->fl & pass_ex[p]) == 0);
+}
 
-    /* Render all billboards in the given range. */
+/*---------------------------------------------------------------------------*/
 
-    if (draw && draw->base)
-    {
-        glDisable(GL_LIGHTING);
-        glDepthMask(GL_FALSE);
-        {
-            for (ri = 0; ri < draw->base->rc; ri++)
-                if (n <= draw->base->rv[ri].d && draw->base->rv[ri].d < f)
-                    mp = sol_back_bill(draw, draw->base->rv + ri, mp, t);
+static int sol_count_geom(const struct s_base *base, int g0, int gc, int mi)
+{
+    int gi, c = 0;
 
-            mp = sol_draw_mtrl(draw, &default_draw_mtrl, mp);
-        }
-        glDepthMask(GL_TRUE);
-        glEnable(GL_LIGHTING);
-    }
-}
+    /* The arguments g0 and gc specify a range of the index array. These     */
+    /* indices refer to geoms. Determine how many of these geoms use the     */
+    /* given material                                                        */
 
-/*---------------------------------------------------------------------------*/
-/*
- * The  following code  renders a  body in  a  ludicrously inefficient
- * manner.  It iterates the materials and scans the data structure for
- * geometry using each.  This  has the effect of absolutely minimizing
- * material  changes,  texture  bindings,  and  Begin/End  pairs,  but
- * maximizing trips through the data.
- *
- * However, this  is only done once  for each level.   The results are
- * stored in display lists.  Thus, it is well worth it.
- */
+    for (gi = 0; gi < gc; gi++)
+        if (base->gv[base->iv[g0 + gi]].mi == mi)
+            c++;
+
+    return c;
+}
 
-static void sol_draw_geom(const struct s_base *base,
-                          const struct b_geom *gp, int mi)
+static int sol_count_body(const struct b_body *bp,
+                          const struct s_base *base, int mi)
 {
-    if (gp->mi == mi)
-    {
-        const float *ui = base->tv[gp->ti].u;
-        const float *uj = base->tv[gp->tj].u;
-        const float *uk = base->tv[gp->tk].u;
+    int li, c = 0;
 
-        const float *ni = base->sv[gp->si].n;
-        const float *nj = base->sv[gp->sj].n;
-        const float *nk = base->sv[gp->sk].n;
+    /* Count all lump geoms with the given material. */
 
-        const float *vi = base->vv[gp->vi].p;
-        const float *vj = base->vv[gp->vj].p;
-        const float *vk = base->vv[gp->vk].p;
+    for (li = 0; li < bp->lc; li++)
+        c += sol_count_geom(base, base->lv[bp->l0 + li].g0,
+                                  base->lv[bp->l0 + li].gc, mi);
 
-        glTexCoord2fv(ui);
-        glNormal3fv(ni);
-        glVertex3fv(vi);
+    /* Count all body geoms with the given material. */
 
-        glTexCoord2fv(uj);
-        glNormal3fv(nj);
-        glVertex3fv(vj);
+    c += sol_count_geom(base, bp->g0, bp->gc, mi);
 
-        glTexCoord2fv(uk);
-        glNormal3fv(nk);
-        glVertex3fv(vk);
-    }
+    return c;
 }
 
-static void sol_draw_lump(const struct s_base *base,
-                          const struct b_lump *lp, int mi)
+static int sol_count_mesh(const struct d_body *bp, int p)
 {
-    int i;
+    int mi, c = 0;
 
-    for (i = 0; i < lp->gc; i++)
-        sol_draw_geom(base, base->gv + base->iv[lp->g0 + i], mi);
+    /* Count the body meshes matching the given material flags. */
+
+    for (mi = 0; mi < bp->mc; ++mi)
+        if (sol_test_mtrl(bp->mv[mi].mp, p))
+            c++;
+
+    return c;
 }
 
-static const struct d_mtrl *sol_draw_body(const struct s_draw *draw,
-                                          const struct b_body *bp,
-                                          const struct d_mtrl *mp,
-                                          int fl, int decal)
+/*---------------------------------------------------------------------------*/
+
+static void sol_mesh_vert(struct d_vert *vp,
+                          const struct s_base *base, int oi)
 {
-    const struct s_base *base = draw->base;
+    /* Gather all vertex attributes for the given offs. */
 
-    int mi, li, gi;
+    const struct b_texc *tq = base->tv + base->ov[oi].ti;
+    const struct b_side *sq = base->sv + base->ov[oi].si;
+    const struct b_vert *vq = base->vv + base->ov[oi].vi;
 
-    /* Iterate all materials of the correct opacity. */
+    vp->p[0] = vq->p[0];
+    vp->p[1] = vq->p[1];
+    vp->p[2] = vq->p[2];
 
-    for (mi = 0; mi < draw->mc; mi++)
+    vp->n[0] = sq->n[0];
+    vp->n[1] = sq->n[1];
+    vp->n[2] = sq->n[2];
+
+    vp->t[0] = tq->u[0];
+    vp->t[1] = tq->u[1];
+}
+
+static void sol_mesh_geom(struct d_vert *vv,   int *vn,
+                          struct d_geom *gv,   int *gn,
+                          const struct s_base *base, int *iv, int g0, int gc, int mi)
+{
+    int gi;
+
+    /* Insert all geoms with material mi into the vertex and element data. */
+
+    for (gi = 0; gi < gc; gi++)
     {
-        struct d_mtrl *mq = draw->mv + mi;
+        const struct b_geom *gq = base->gv + base->iv[g0 + gi];
 
-        if ((mq->base->fl & fl) && (mq->base->fl & M_DECAL) == decal)
+        if (gq->mi == mi)
         {
-            if (sol_enum_mtrl(draw->base, bp, mi))
+            /* Insert a d_vert into the VBO data for each referenced b_off. */
+
+            if (iv[gq->oi] == -1)
+            {
+                iv[gq->oi] = *vn;
+                sol_mesh_vert(vv + (*vn)++, base, gq->oi);
+            }
+            if (iv[gq->oj] == -1)
+            {
+                iv[gq->oj] = *vn;
+                sol_mesh_vert(vv + (*vn)++, base, gq->oj);
+            }
+            if (iv[gq->ok] == -1)
             {
-                /* Set the material state. */
+                iv[gq->ok] = *vn;
+                sol_mesh_vert(vv + (*vn)++, base, gq->ok);
+            }
 
-                mp = sol_draw_mtrl(draw, mq, mp);
+            /* Populate the EBO data using remapped b_off indices. */
 
-                /* Render all geometry of that material. */
+            gv[*gn].i = iv[gq->oi];
+            gv[*gn].j = iv[gq->oj];
+            gv[*gn].k = iv[gq->ok];
 
-                glBegin(GL_TRIANGLES);
-                {
-                    for (li = 0; li < bp->lc; li++)
-                        sol_draw_lump(draw->base,
-                                      base->lv + bp->l0 + li,
-                                      mi);
-                    for (gi = 0; gi < bp->gc; gi++)
-                        sol_draw_geom(draw->base,
-                                      base->gv + base->iv[bp->g0 + gi],
-                                      mi);
-                }
-                glEnd();
-            }
+            (*gn)++;
         }
     }
-
-    return mp;
 }
 
-static void sol_draw_list(const struct s_vary *vary,
-                          const struct v_body *bp, GLuint list)
+static void sol_load_mesh(struct d_mesh *mp,
+                          const struct b_body *bp,
+                          const struct s_draw *draw, int mi)
 {
-    float p[3], e[4], u[3], a;
+    const size_t vs = sizeof (struct d_vert);
+    const size_t gs = sizeof (struct d_geom);
 
-    sol_body_p(p, vary, bp->pi, bp->t);
-    sol_body_e(e, vary, bp, 0);
+    struct d_vert *vv = 0;
+    struct d_geom *gv = 0;
+    int           *iv = 0;
 
-    q_as_axisangle(e, u, &a);
-    a = V_DEG(a);
+    int oc = draw->base->oc;
+    int vn = 0;
+    int gn = 0;
 
-    glPushMatrix();
+    const int gc = sol_count_body(bp, draw->base, mi);
+
+    /* Get temporary storage for vertex and element array creation. */
+
+    if ((vv = (struct d_vert *) calloc(oc, vs)) &&
+        (gv = (struct d_geom *) calloc(gc, gs)) &&
+        (iv = (int           *) calloc(oc, sizeof (int))))
     {
-        /* Translate and rotate a moving body. */
+        int li, i;
 
-        glTranslatef(p[0], p[1], p[2]);
-        glRotatef(a, u[0], u[1], u[2]);
+        /* Initialize the index remapping. */
 
-        /* Draw the body. */
+        for (i = 0; i < oc; ++i) iv[i] = -1;
 
-        glCallList(list);
-    }
-    glPopMatrix();
-}
+        /* Include all matching lump geoms in the arrays. */
 
-void sol_draw(const struct s_draw *draw, int depthmask, int depthtest)
-{
-    int bi;
+        for (li = 0; li < bp->lc; li++)
+            sol_mesh_geom(vv, &vn, gv, &gn, draw->base, iv,
+                          draw->base->lv[bp->l0 + li].g0,
+                          draw->base->lv[bp->l0 + li].gc, mi);
 
-    /* Render all opaque geometry into the color and depth buffers. */
+        /* Include all matching body geoms in the arrays. */
 
-    for (bi = 0; bi < draw->bc; bi++)
-        if (draw->bv[bi].ol)
-            sol_draw_list(draw->vary, draw->vary->bv + bi, draw->bv[bi].ol);
+        sol_mesh_geom(vv, &vn, gv, &gn, draw->base, iv, bp->g0, bp->gc, mi);
 
-    /* Render all translucent geometry into only the color buffer. */
+        /* Initialize buffer objects for all data. */
 
-    if (depthtest == 0) glDisable(GL_DEPTH_TEST);
-    if (depthmask == 0) glDepthMask(GL_FALSE);
-    {
-        for (bi = 0; bi < draw->bc; bi++)
-            if (draw->bv[bi].tl)
-                sol_draw_list(draw->vary, draw->vary->bv + bi, draw->bv[bi].tl);
+        glGenBuffers_(1, &mp->vbo);
+        glBindBuffer_(GL_ARRAY_BUFFER,         mp->vbo);
+        glBufferData_(GL_ARRAY_BUFFER,         vn * vs, vv, GL_STATIC_DRAW);
+        glBindBuffer_(GL_ARRAY_BUFFER,         0);
+
+        glGenBuffers_(1, &mp->ebo);
+        glBindBuffer_(GL_ELEMENT_ARRAY_BUFFER, mp->ebo);
+        glBufferData_(GL_ELEMENT_ARRAY_BUFFER, gn * gs, gv, GL_STATIC_DRAW);
+        glBindBuffer_(GL_ELEMENT_ARRAY_BUFFER, 0);
+
+        mp->mp  = draw->mv + mi;
+        mp->ebc = gn * 3;
     }
-    if (depthmask == 0) glDepthMask(GL_TRUE);
-    if (depthtest == 0) glEnable(GL_DEPTH_TEST);
+
+    free(iv);
+    free(gv);
+    free(vv);
 }
 
-void sol_bill(const struct s_draw *draw, const float *M, float t)
+static void sol_free_mesh(struct d_mesh *mp)
 {
-    const struct d_mtrl *mp = &default_draw_mtrl;
+    if (glIsBuffer_(mp->ebo))
+        glDeleteBuffers_(1, &mp->ebo);
+    if (glIsBuffer_(mp->vbo))
+        glDeleteBuffers_(1, &mp->vbo);
+}
 
-    int ri;
+void sol_draw_mesh(const struct d_mesh *mp, struct s_rend *rend, int p)
+{
+    /* If this mesh has material matching the given flags... */
 
-    for (ri = 0; ri < draw->base->rc; ++ri)
+    if (sol_test_mtrl(mp->mp, p))
     {
-        const struct b_bill *rp = draw->base->rv + ri;
+        const size_t s = sizeof (struct d_vert);
+        const GLenum T = GL_FLOAT;
 
-        float T = rp->t * t;
-        float S = fsinf(T);
+        /* Apply the material state. */
 
-        float w  = rp->w [0] + rp->w [1] * T + rp->w [2] * S;
-        float h  = rp->h [0] + rp->h [1] * T + rp->h [2] * S;
-        float rx = rp->rx[0] + rp->rx[1] * T + rp->rx[2] * S;
-        float ry = rp->ry[0] + rp->ry[1] * T + rp->ry[2] * S;
-        float rz = rp->rz[0] + rp->rz[1] * T + rp->rz[2] * S;
+        sol_apply_mtrl(mp->mp, rend);
 
-        mp = sol_draw_mtrl(draw, draw->mv + rp->mi, mp);
+        /* Bind the mesh data. */
 
-        glPushMatrix();
-        {
-            glTranslatef(rp->p[0], rp->p[1], rp->p[2]);
+        glBindBuffer_(GL_ARRAY_BUFFER,         mp->vbo);
+        glBindBuffer_(GL_ELEMENT_ARRAY_BUFFER, mp->ebo);
 
-            if (M && ((rp->fl & B_NOFACE) == 0)) glMultMatrixf(M);
+        glVertexPointer  (3, T, s, (GLvoid *) offsetof (struct d_vert, p));
+        glNormalPointer  (   T, s, (GLvoid *) offsetof (struct d_vert, n));
 
-            if (fabsf(rx) > 0.0f) glRotatef(rx, 1.0f, 0.0f, 0.0f);
-            if (fabsf(ry) > 0.0f) glRotatef(ry, 0.0f, 1.0f, 0.0f);
-            if (fabsf(rz) > 0.0f) glRotatef(rz, 0.0f, 0.0f, 1.0f);
+        if (tex_env_stage(TEX_STAGE_SHADOW))
+        {
+            glTexCoordPointer(3, T, s, (GLvoid *) offsetof (struct d_vert, p));
 
-            glBegin(GL_QUADS);
-            {
-                glTexCoord2f(0.0f, 0.0f); glVertex2f(-w / 2, -h / 2);
-                glTexCoord2f(1.0f, 0.0f); glVertex2f(+w / 2, -h / 2);
-                glTexCoord2f(1.0f, 1.0f); glVertex2f(+w / 2, +h / 2);
-                glTexCoord2f(0.0f, 1.0f); glVertex2f(-w / 2, +h / 2);
-            }
-            glEnd();
+            if (tex_env_stage(TEX_STAGE_CLIP))
+                glTexCoordPointer(3, T, s, (GLvoid *) offsetof (struct d_vert, p));
+
+            tex_env_stage(TEX_STAGE_TEXTURE);
         }
-        glPopMatrix();
-    }
+        glTexCoordPointer(2, T, s, (GLvoid *) offsetof (struct d_vert, t));
+
+        /* Draw the mesh. */
 
-    mp = sol_draw_mtrl(draw, &default_draw_mtrl, mp);
+        glDrawElements(GL_TRIANGLES, mp->ebc, GL_UNSIGNED_SHORT, 0);
+    }
 }
 
-void sol_refl(const struct s_draw *draw)
+/*---------------------------------------------------------------------------*/
+
+static void sol_load_body(struct d_body *bp,
+                          const struct b_body *bq,
+                          const struct s_draw *draw)
 {
-    int bi;
+    int mi;
 
-    /* Render all reflective geometry into the color and depth buffers. */
+    bp->base = bq;
+    bp->mc   =  0;
 
-    for (bi = 0; bi < draw->bc; bi++)
-        if (draw->bv[bi].rl)
-            sol_draw_list(draw->vary, draw->vary->bv + bi, draw->bv[bi].rl);
-}
+    /* Determine how many materials this body uses. */
 
-/*---------------------------------------------------------------------------*/
+    for (mi = 0; mi < draw->mc; ++mi)
+        if (sol_count_body(bq, draw->base, mi))
+            bp->mc++;
 
-static void sol_shad_geom(const struct s_base *base,
-                          const struct b_geom *gp, int mi)
-{
-    if (gp->mi == mi)
+    /* Allocate and initialize a mesh for each material. */
+
+    if ((bp->mv = (struct d_mesh *) calloc(bp->mc, sizeof (struct d_mesh))))
     {
-        const float *vi = base->vv[gp->vi].p;
-        const float *vj = base->vv[gp->vj].p;
-        const float *vk = base->vv[gp->vk].p;
+        int mj = 0;
 
-        glVertex3fv(vi);
-        glVertex3fv(vj);
-        glVertex3fv(vk);
+        for (mi = 0; mi < draw->mc; ++mi)
+            if (sol_count_body(bq, draw->base, mi))
+                sol_load_mesh(bp->mv + mj++, bq, draw, mi);
     }
-}
 
-static void sol_shad_lump(const struct s_base *base,
-                          const struct b_lump *lp, int mi)
-{
-    int i;
+    /* Cache a mesh count for each pass. */
 
-    for (i = 0; i < lp->gc; i++)
-        sol_shad_geom(base, base->gv + base->iv[lp->g0 + i], mi);
+    bp->pass[0] = sol_count_mesh(bp, 0);
+    bp->pass[1] = sol_count_mesh(bp, 1);
+    bp->pass[2] = sol_count_mesh(bp, 2); 
+    bp->pass[3] = sol_count_mesh(bp, 3); 
+    bp->pass[4] = sol_count_mesh(bp, 4);
 }
 
-static void sol_shad_body(const struct s_base *base,
-                          const struct b_body *bp,
-                          int fl, int decal)
+static void sol_free_body(struct d_body *bp)
 {
-    int mi, li, gi;
-
-    if (decal)
-    {
-        glEnable(GL_POLYGON_OFFSET_FILL);
-        glPolygonOffset(-1.0f, -2.0f);
-    }
+    int mi;
 
-    glBegin(GL_TRIANGLES);
-    {
-        for (mi = 0; mi < base->mc; mi++)
-        {
-            struct b_mtrl *mp = base->mv + mi;
-
-            if ((mp->fl & fl) && (mp->fl & M_DECAL) == decal)
-            {
-                for (li = 0; li < bp->lc; li++)
-                    sol_shad_lump(base, base->lv + bp->l0 + li, mi);
-                for (gi = 0; gi < bp->gc; gi++)
-                    sol_shad_geom(base, base->gv + base->iv[bp->g0 + gi], mi);
-            }
-        }
-    }
-    glEnd();
+    for (mi = 0; mi < bp->mc; ++mi)
+        sol_free_mesh(bp->mv + mi);
 
-    if (decal)
-        glDisable(GL_POLYGON_OFFSET_FILL);
+    free(bp->mv);
 }
 
-static void sol_shad_list(const struct s_vary *vary,
-                          const struct v_ball *up,
-                          const struct v_body *bp, GLuint list)
+static void sol_draw_body(const struct d_body *bp, struct s_rend *rend, int p)
 {
-    float p[3], e[4], u[3], a;
-    float d[3];
+    int i;
 
-    float X[] = { 1.0f, 0.0f, 0.0f, 0.0f };
-    float Y[] = { 0.0f, 1.0f, 0.0f, 0.0f };
-    float Z[] = { 0.0f, 0.0f, 1.0f, 0.0f };
+    for (i = 0; i < bp->mc; ++i)
+        sol_draw_mesh(bp->mv + i, rend, p);
+}
 
-    sol_body_p(p, vary, bp->pi, bp->t);
-    sol_body_e(e, vary, bp, 0);
+/*---------------------------------------------------------------------------*/
 
-    v_sub(d, up->p, p);
+int sol_load_draw(struct s_draw *draw, const struct s_vary *vary, int s)
+{
+    int i;
 
-    Y[3] = 0.5f - v_dot(Y, d);
+    memset(draw, 0, sizeof (struct s_draw));
 
-    if (e[0] != 1.0f)
-    {
-        q_as_axisangle(e, u, &a);
-        a = V_DEG(a);
+    draw->vary = vary;
+    draw->base = vary->base;
 
-        q_conj(e, e);
+    /* Initialize all materials for this file. */
 
-        q_rot(X, e, X);
-        q_rot(Y, e, Y);
-        q_rot(Z, e, Z);
-    }
-    else
+    if (draw->base->mc)
     {
-        u[0] = 0.0f;
-        u[1] = 0.0f;
-        u[2] = 0.0f;
-
-        a = 0.0f;
-    }
-
-    glTexGenfv(GL_S, GL_OBJECT_PLANE, X);
-    glTexGenfv(GL_T, GL_OBJECT_PLANE, Z);
+        if ((draw->mv = calloc(draw->base->mc, sizeof (*draw->mv))))
+        {
+            draw->mc = draw->base->mc;
 
-    /* Translate the shadow on a moving body. */
+            for (i = 0; i < draw->mc; i++)
+            {
+                sol_load_mtrl(draw->mv + i, draw->base->mv + i);
 
-    glMatrixMode(GL_TEXTURE);
-    {
-        float k = 0.25f / up->r;
+                /* If at least one material is reflective, mark it. */
 
-        glPushMatrix();
-        glTranslatef(0.5f - k * d[0],
-                     0.5f - k * d[2], 0.0f);
-        glScalef(k, k, 0.0f);
+                if (draw->base->mv[i].fl & M_REFLECTIVE)
+                    draw->reflective = 1;
+            }
+        }
     }
-    glMatrixMode(GL_MODELVIEW);
 
-    /* Set up shadow clipping. */
+    /* Initialize shadow state. */
 
-    if (glActiveTextureARB_)
-    {
-        glActiveTextureARB_(GL_TEXTURE1_ARB);
-        glTexGenfv(GL_S, GL_OBJECT_PLANE, Y);
-        glActiveTextureARB_(GL_TEXTURE0_ARB);
-    }
+    draw->shadow_ui = -1;
 
-    /* Draw the body. */
+    /* Initialize all bodies for this file. */
 
-    glPushMatrix();
+    if (draw->base->bc)
     {
-        glTranslatef(p[0], p[1], p[2]);
-        glRotatef(a, u[0], u[1], u[2]);
+        if ((draw->bv = calloc(draw->base->bc, sizeof (*draw->bv))))
+        {
+            draw->bc = draw->base->bc;
 
-        glCallList(list);
+            for (i = 0; i < draw->bc; i++)
+                sol_load_body(draw->bv + i, draw->base->bv + i, draw);
+        }
     }
-    glPopMatrix();
 
-    /* Pop the shadow translation. */
+    sol_load_bill(draw);
 
-    glMatrixMode(GL_TEXTURE);
-    {
-        glPopMatrix();
-    }
-    glMatrixMode(GL_MODELVIEW);
+    return 1;
 }
 
-void sol_shad(const struct s_draw *draw, int ui)
+void sol_free_draw(struct s_draw *draw)
 {
-    int bi;
+    int i;
 
-    /* Render all shadowed geometry. */
+    sol_free_bill(draw);
 
-    glDepthMask(GL_FALSE);
-    {
-        for (bi = 0; bi < draw->bc; bi++)
-            if (draw->bv[bi].sl)
-                sol_shad_list(draw->vary,
-                              draw->vary->uv + ui,
-                              draw->vary->bv + bi, draw->bv[bi].sl);
-    }
-    glDepthMask(GL_TRUE);
+    for (i = 0; i < draw->bc; i++)
+        sol_free_body(draw->bv + i);
+    for (i = 0; i < draw->mc; i++)
+        sol_free_mtrl(draw->mv + i);
 }
 
 /*---------------------------------------------------------------------------*/
 
-static void sol_load_objects(struct s_draw *draw, int s)
+static void sol_draw_all(const struct s_draw *draw, struct s_rend *rend, int p)
 {
-    int i;
-
-    /* Here we sort geometry into display lists by material type. */
-
-    for (i = 0; i < draw->bc; i++)
-    {
-        struct d_body *bp = draw->bv + i;
+    int bi;
 
-        int on = sol_enum_body(draw->base, bp->base, M_OPAQUE);
-        int tn = sol_enum_body(draw->base, bp->base, M_TRANSPARENT);
-        int rn = sol_enum_body(draw->base, bp->base, M_REFLECTIVE);
-        int dn = sol_enum_body(draw->base, bp->base, M_DECAL);
-        int sn = sol_enum_body(draw->base, bp->base, M_SHADOWED);
+    /* Draw all meshes of all bodies matching the given material flags. */
 
-        /* Draw all opaque geometry, decals last. */
+    for (bi = 0; bi < draw->bc; ++bi)
 
-        if (on)
+        if (draw->bv[bi].pass[p])
         {
-            bp->ol = glGenLists(1);
-
-            glNewList(bp->ol, GL_COMPILE);
+            glPushMatrix();
             {
-                const struct d_mtrl *mp = &default_draw_mtrl;
-
-                mp = sol_draw_body(draw, bp->base, mp, M_OPAQUE, 0);
-                mp = sol_draw_body(draw, bp->base, mp, M_OPAQUE, M_DECAL);
-                mp = sol_draw_mtrl(draw, &default_draw_mtrl, mp);
+                sol_transform(draw->vary, draw->vary->bv + bi, draw->shadow_ui);
+                sol_draw_body(draw->bv + bi, rend, p);
             }
-            glEndList();
+            glPopMatrix();
         }
-        else bp->ol = 0;
-
-        /* Draw all translucent geometry, decals first. */
-
-        if (tn)
-        {
-            bp->tl = glGenLists(1);
+}
 
-            glNewList(bp->tl, GL_COMPILE);
-            {
-                const struct d_mtrl *mp = &default_draw_mtrl;
+void sol_draw_enable(struct s_rend *rend)
+{
+    glEnableClientState(GL_VERTEX_ARRAY);
+    glEnableClientState(GL_NORMAL_ARRAY);
 
-                mp = sol_draw_body(draw, bp->base, mp, M_TRANSPARENT, M_DECAL);
-                mp = sol_draw_body(draw, bp->base, mp, M_TRANSPARENT, 0);
-                mp = sol_draw_mtrl(draw, &default_draw_mtrl, mp);
-            }
-            glEndList();
-        }
-        else bp->tl = 0;
+    if (gli.max_texture_units > 2)
+        tex_env_active(&tex_env_shadow_clip);
+    else if (gli.max_texture_units > 1)
+        tex_env_active(&tex_env_shadow);
+    else
+        tex_env_active(&tex_env_default);
 
-        /* Draw all reflective geometry. */
+    if (tex_env_stage(TEX_STAGE_SHADOW))
+    {
+        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 
-        if (rn)
-        {
-            bp->rl = glGenLists(1);
+        if (tex_env_stage(TEX_STAGE_CLIP))
+            glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 
-            glNewList(bp->rl, GL_COMPILE);
-            {
-                const struct d_mtrl *mp = &default_draw_mtrl;
+        tex_env_stage(TEX_STAGE_TEXTURE);
+    }
+    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
 
-                mp = sol_draw_body(draw, bp->base, mp, M_REFLECTIVE, 0);
-                mp = sol_draw_mtrl(draw, &default_draw_mtrl, mp);
-            }
-            glEndList();
+    rend->mp = &default_draw_mtrl;
+}
 
-            draw->reflective = 1;
-        }
-        else bp->rl = 0;
+void sol_draw_disable(struct s_rend *rend)
+{
+    sol_apply_mtrl(&default_draw_mtrl, rend);
 
-        /* Draw all shadowed geometry. */
+    if (tex_env_stage(TEX_STAGE_SHADOW))
+    {
+        glDisableClientState(GL_TEXTURE_COORD_ARRAY);
 
-        if (s && (on || rn || sn))
-        {
-            bp->sl = glGenLists(1);
+        if (tex_env_stage(TEX_STAGE_CLIP))
+            glDisableClientState(GL_TEXTURE_COORD_ARRAY);
 
-            glNewList(bp->sl, GL_COMPILE);
-            {
-                if (on) sol_shad_body(draw->base, bp->base, M_OPAQUE, 0);
-                if (rn) sol_shad_body(draw->base, bp->base, M_REFLECTIVE, 0);
-                if (dn) sol_shad_body(draw->base, bp->base, M_OPAQUE, M_DECAL);
-                if (sn)
-                {
-                    /* Transparent shadowed geometry hack. */
+        tex_env_stage(TEX_STAGE_TEXTURE);
+    }
+    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
 
-                    if (dn)
-                        sol_shad_body(draw->base, bp->base, M_SHADOWED, M_DECAL);
+    tex_env_active(&tex_env_default);
 
-                    sol_shad_body(draw->base, bp->base, M_SHADOWED, 0);
-                }
-            }
-            glEndList();
-        }
-        else bp->sl = 0;
-    }
+    glDisableClientState(GL_NORMAL_ARRAY);
+    glDisableClientState(GL_VERTEX_ARRAY);
 }
 
-static GLuint sol_find_texture(const char *name)
+/*---------------------------------------------------------------------------*/
+
+void sol_draw(const struct s_draw *draw, struct s_rend *rend, int mask, int test)
 {
-    char png[MAXSTR];
-    char jpg[MAXSTR];
+    /* Render all opaque geometry, decals last. */
 
-    GLuint o;
+    sol_draw_all(draw, rend, 0);
+    sol_draw_all(draw, rend, 1);
 
-    /* Prefer a lossless copy of the texture over a lossy compression. */
+    /* Render all transparent geometry, decals first. */
 
-    strncpy(png, name, PATHMAX); strcat(png, ".png");
-    strncpy(jpg, name, PATHMAX); strcat(jpg, ".jpg");
+    if (!test) glDisable(GL_DEPTH_TEST);
+    if (!mask) glDepthMask(GL_FALSE);
+    {
+        sol_draw_all(draw, rend, 2);
+        sol_draw_all(draw, rend, 3);
+    }
+    if (!mask) glDepthMask(GL_TRUE);
+    if (!test) glEnable(GL_DEPTH_TEST);
 
-    /* Check for a PNG. */
+    /* Revert the buffer object state. */
 
-    if ((o = make_image_from_file(png)))
-        return o;
+    glBindBuffer_(GL_ARRAY_BUFFER,         0);
+    glBindBuffer_(GL_ELEMENT_ARRAY_BUFFER, 0);
+}
 
-    /* Check for a JPG. */
+void sol_refl(const struct s_draw *draw, struct s_rend *rend)
+{
+    /* Render all reflective geometry. */
 
-    if ((o = make_image_from_file(jpg)))
-        return o;
+    sol_draw_all(draw, rend, 4);
 
-    return 0;
+    /* Revert the buffer object state. */
+
+    glBindBuffer_(GL_ARRAY_BUFFER,         0);
+    glBindBuffer_(GL_ELEMENT_ARRAY_BUFFER, 0);
 }
 
-static void sol_load_textures(struct s_draw *draw)
+void sol_back(const struct s_draw *draw,
+              struct s_rend *rend,
+              float n, float f, float t)
 {
-    int i;
+    if (!draw || !draw->base)
+        return;
 
-    /* Load the image referenced by each material. */
+    glDisable(GL_LIGHTING);
+    glDepthMask(GL_FALSE);
 
-    for (i = 0; i < draw->mc; i++)
+    sol_bill_enable(draw);
     {
-        struct d_mtrl *mp = draw->mv + i;
+        int ri;
 
-        if ((mp->o = sol_find_texture(_(mp->base->f))))
+        /* Consider each billboard. */
+
+        for (ri = 0; ri < draw->base->rc; ri++)
         {
-            /* Set the texture to clamp or repeat based on material type. */
+            const struct b_bill *rp = draw->base->rv + ri;
 
-            if (mp->base->fl & M_CLAMPED)
-            {
-                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
-            }
-            else
+            /* Render only billboards at distances between n and f. */
+
+            if (n <= rp->d && rp->d < f)
             {
-                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
-                glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
-            }
-        }
-    }
-}
+                float T = (rp->t > 0.0f) ? (fmodf(t, rp->t) - rp->t / 2) : 0;
 
-/*---------------------------------------------------------------------------*/
+                float w = rp->w[0] + rp->w[1] * T + rp->w[2] * T * T;
+                float h = rp->h[0] + rp->h[1] * T + rp->h[2] * T * T;
 
-int sol_load_draw(struct s_draw *draw, const struct s_vary *vary, int s)
-{
-    int i;
+                /* Render only billboards facing the viewer. */
 
-    memset(draw, 0, sizeof (*draw));
+                if (w > 0 && h > 0)
+                {
+                    float rx = rp->rx[0] + rp->rx[1] * T + rp->rx[2] * T * T;
+                    float ry = rp->ry[0] + rp->ry[1] * T + rp->ry[2] * T * T;
+                    float rz = rp->rz[0] + rp->rz[1] * T + rp->rz[2] * T * T;
 
-    draw->vary = vary;
-    draw->base = draw->vary->base;
+                    glPushMatrix();
+                    {
+                        if (ry) glRotatef(ry, 0.0f, 1.0f, 0.0f);
+                        if (rx) glRotatef(rx, 1.0f, 0.0f, 0.0f);
 
-    if (draw->base->mc)
-    {
-        draw->mv = calloc(draw->base->mc, sizeof (*draw->mv));
-        draw->mc = draw->base->mc;
+                        glTranslatef(0.0f, 0.0f, -rp->d);
 
-        for (i = 0; i < draw->base->mc; i++)
-        {
-            struct d_mtrl *mp = draw->mv + i;
-            struct b_mtrl *mq = draw->base->mv + i;
+                        if (rp->fl & B_FLAT)
+                        {
+                            glRotatef(-rx - 90.0f, 1.0f, 0.0f, 0.0f);
+                            glRotatef(-ry,         0.0f, 0.0f, 1.0f);
+                        }
+                        if (rp->fl & B_EDGE)
+                            glRotatef(-rx,         1.0f, 0.0f, 0.0f);
+
+                        if (rz) glRotatef(rz, 0.0f, 0.0f, 1.0f);
+
+                        glScalef(w, h, 1.0f);
+
+                        sol_apply_mtrl(draw->mv + rp->mi, rend);
 
-            mp->base = mq;
+                        if (rp->fl & B_EDGE)
+                            glDrawArrays(GL_TRIANGLE_STRIP, 4, 4);
+                        else
+                            glDrawArrays(GL_TRIANGLE_STRIP, 8, 4);
+                    }
+                    glPopMatrix();
+                }
+            }
         }
     }
+    sol_bill_disable();
 
-    if (draw->base->bc)
+    glDepthMask(GL_TRUE);
+    glEnable(GL_LIGHTING);
+}
+
+void sol_bill(const struct s_draw *draw,
+              struct s_rend *rend, const float *M, float t)
+{
+    sol_bill_enable(draw);
     {
-        draw->bv = calloc(draw->base->bc, sizeof (*draw->bv));
-        draw->bc = draw->base->bc;
+        int ri;
 
-        for (i = 0; i < draw->base->bc; i++)
+        for (ri = 0; ri < draw->base->rc; ++ri)
         {
-            struct d_body *bp = draw->bv + i;
-            struct b_body *bq = draw->base->bv + i;
+            const struct b_bill *rp = draw->base->rv + ri;
 
-            bp->base = bq;
-        }
-    }
+            float T = rp->t * t;
+            float S = fsinf(T);
 
-    sol_load_textures(draw);
-    sol_load_objects (draw, s);
+            float w  = rp->w [0] + rp->w [1] * T + rp->w [2] * S;
+            float h  = rp->h [0] + rp->h [1] * T + rp->h [2] * S;
+            float rx = rp->rx[0] + rp->rx[1] * T + rp->rx[2] * S;
+            float ry = rp->ry[0] + rp->ry[1] * T + rp->ry[2] * S;
+            float rz = rp->rz[0] + rp->rz[1] * T + rp->rz[2] * S;
 
-    return 1;
-}
+            sol_apply_mtrl(draw->mv + rp->mi, rend);
 
-void sol_free_draw(struct s_draw *draw)
-{
-    int i;
+            glPushMatrix();
+            {
+                glTranslatef(rp->p[0], rp->p[1], rp->p[2]);
 
-    for (i = 0; i < draw->mc; i++)
-    {
-        if (glIsTexture(draw->mv[i].o))
-            glDeleteTextures(1, &draw->mv[i].o);
+                if (M && ((rp->fl & B_NOFACE) == 0)) glMultMatrixf(M);
+
+                if (fabsf(rx) > 0.0f) glRotatef(rx, 1.0f, 0.0f, 0.0f);
+                if (fabsf(ry) > 0.0f) glRotatef(ry, 0.0f, 1.0f, 0.0f);
+                if (fabsf(rz) > 0.0f) glRotatef(rz, 0.0f, 0.0f, 1.0f);
+
+                sol_draw_bill(w, h, GL_FALSE);
+            }
+            glPopMatrix();
+        }
     }
+    sol_bill_disable();
+}
 
-    for (i = 0; i < draw->bc; i++)
+void sol_fade(const struct s_draw *draw, float k)
+{
+    if (k > 0.0f)
     {
-        if (glIsList(draw->bv[i].ol))
-            glDeleteLists(draw->bv[i].ol, 1);
-        if (glIsList(draw->bv[i].tl))
-            glDeleteLists(draw->bv[i].tl, 1);
-        if (glIsList(draw->bv[i].rl))
-            glDeleteLists(draw->bv[i].rl, 1);
-        if (glIsList(draw->bv[i].sl))
-            glDeleteLists(draw->bv[i].sl, 1);
-    }
+        glMatrixMode(GL_PROJECTION);
+        glPushMatrix();
+        glLoadIdentity();
+        glMatrixMode(GL_MODELVIEW);
+        glPushMatrix();
+        glLoadIdentity();
+        {
+            glEnable(GL_COLOR_MATERIAL);
+            glDisable(GL_LIGHTING);
+            glDisable(GL_DEPTH_TEST);
+            glDisable(GL_TEXTURE_2D);
+
+            glColor4f(0.0f, 0.0f, 0.0f, k);
 
-    free(draw->mv);
-    free(draw->bv);
+            sol_bill_enable(draw);
+            glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+            sol_bill_disable();
 
-    memset(draw, 0, sizeof (*draw));
+            glColor4f(1.0f, 1.0f, 1.0f, 1.0f);
+
+            glEnable(GL_TEXTURE_2D);
+            glEnable(GL_DEPTH_TEST);
+            glEnable(GL_LIGHTING);
+            glDisable(GL_COLOR_MATERIAL);
+        }
+        glMatrixMode(GL_PROJECTION);
+        glPopMatrix();
+        glMatrixMode(GL_MODELVIEW);
+        glPopMatrix();
+    }
 }
 
 /*---------------------------------------------------------------------------*/
index 30d1583..4a99fdd 100644 (file)
@@ -15,6 +15,7 @@
 #ifndef SOLID_DRAW_H
 #define SOLID_DRAW_H
 
+#include "glext.h"
 #include "solid_base.h"
 #include "solid_vary.h"
 
 
 /*---------------------------------------------------------------------------*/
 
+struct d_vert
+{
+    float p[3];
+    float n[3];
+    float t[2];
+};
+
+struct d_geom
+{
+    GLushort i;
+    GLushort j;
+    GLushort k;
+};
+
+/*---------------------------------------------------------------------------*/
+
 struct d_mtrl
 {
     const struct b_mtrl *base;
 
-    GLuint o;                                  /* OpenGL texture object      */
+    GLuint d;                              /* 32-bit diffuse color cache     */
+    GLuint a;                              /* 32-bit ambient color cache     */
+    GLuint s;                              /* 32-bit specular color cache    */
+    GLuint e;                              /* 32-bit emissive color cache    */
+    GLuint h;                              /* 32-bit specular exponent cache */
+    GLuint o;                              /* OpenGL texture object          */
+};
+
+struct d_mesh
+{
+    const struct d_mtrl *mp;
+
+    GLuint vbo;                                /* Vertex  buffer object      */
+    GLuint ebo;                                /* Element buffer object      */
+    GLuint ebc;                                /* Element buffer count       */
 };
 
 struct d_body
 {
     const struct b_body *base;
 
-    GLuint ol;                                 /* opaque geometry list       */
-    GLuint tl;                                 /* transparent geometry list  */
-    GLuint rl;                                 /* reflective geometry list   */
-    GLuint sl;                                 /* shadowed geometry list     */
+    int pass[5];
+    int mc;
+
+    struct d_mesh *mv;
 };
 
 struct s_draw
@@ -52,7 +83,22 @@ struct s_draw
     struct d_mtrl *mv;
     struct d_body *bv;
 
+    GLuint bill;
+
     int reflective;
+    int shadow_ui;
+};
+
+/*---------------------------------------------------------------------------*/
+
+/*
+ * This structure holds rendering state shared between separate
+ * SOLs. I am aware that the name leaves much to be desired.
+ */
+
+struct s_rend
+{
+    const struct d_mtrl *mp;
 };
 
 /*---------------------------------------------------------------------------*/
@@ -60,11 +106,20 @@ struct s_draw
 int  sol_load_draw(struct s_draw *, const struct s_vary *, int);
 void sol_free_draw(struct s_draw *);
 
-void sol_back(const struct s_draw *, float, float, float);
-void sol_refl(const struct s_draw *);
-void sol_draw(const struct s_draw *, int, int);
-void sol_bill(const struct s_draw *, const float *, float);
-void sol_shad(const struct s_draw *, int);
+void sol_draw_enable(struct s_rend *);
+void sol_draw_disable(struct s_rend *);
+
+void sol_load_mtrl(struct d_mtrl *, const struct b_mtrl *);
+void sol_free_mtrl(struct d_mtrl *);
+
+void sol_apply_mtrl(const struct d_mtrl *, struct s_rend *);
+
+void sol_back(const struct s_draw *, struct s_rend *, float, float, float);
+void sol_refl(const struct s_draw *, struct s_rend *);
+void sol_draw(const struct s_draw *, struct s_rend *, int, int);
+void sol_bill(const struct s_draw *, struct s_rend *, const float *, float);
+
+void sol_fade(const struct s_draw *, float);
 
 /*---------------------------------------------------------------------------*/
 
index e0f9799..8e3d8da 100644 (file)
@@ -17,7 +17,6 @@
 #include <string.h>
 
 #include "gui.h"
-#include "back.h"
 #include "geom.h"
 #include "part.h"
 #include "audio.h"
@@ -146,7 +145,7 @@ static void resol_paint(int id, float st)
 {
     video_push_persp((float) config_get_d(CONFIG_VIEW_FOV), 0.1f, FAR_DIST);
     {
-        back_draw(0);
+        back_draw_easy();
     }
     video_pop_matrix();
     gui_paint(id);
index 991248f..a144527 100644 (file)
@@ -60,13 +60,13 @@ int goto_state(struct state *st)
 
 void st_paint(float t)
 {
-    int stereo = config_get_d(CONFIG_STEREO);
-
     state_drawn = 1;
 
     if (state && state->paint)
     {
-        if (stereo)
+        /* TODO: reimplement stereo using LR instead of quad-buffer.
+
+        if (config_get_d(CONFIG_STEREO))
         {
             glDrawBuffer(GL_BACK_LEFT);
             video_clear();
@@ -77,6 +77,7 @@ void st_paint(float t)
             state->paint(state->gui_id, t);
         }
         else
+        */
         {
             video_clear();
             state->paint(state->gui_id, t);
index 7a7df36..0395ba9 100644 (file)
@@ -30,7 +30,7 @@ void sync_init(void)
 
 void sync_init(void)
 {
-    long swap = 1;
+    GLint swap = 1;
     CGLSetParameter(CGLGetCurrentContext(),  kCGLCPSwapInterval, &swap);
 }
 
index b71cc95..b305ae1 100644 (file)
@@ -56,27 +56,6 @@ int video_init(const char *title, const char *icon)
 
 /*---------------------------------------------------------------------------*/
 
-PFNGLACTIVETEXTUREARBPROC glActiveTextureARB_;
-
-int check_extension(const char *needle)
-{
-    const GLubyte *haystack, *c;
-
-    /* Search for the given string in the OpenGL extension strings. */
-
-    for (haystack = glGetString(GL_EXTENSIONS); *haystack; haystack++)
-    {
-        for (c = (const GLubyte *) needle; *c && *haystack; c++, haystack++)
-            if (*c != *haystack)
-                break;
-
-        if ((*c == 0) && (*haystack == ' ' || *haystack == '\0'))
-            return 1;
-    }
-
-    return 0;
-}
-
 int video_mode(int f, int w, int h)
 {
     int stereo  = config_get_d(CONFIG_STEREO)      ? 1 : 0;
@@ -107,8 +86,11 @@ int video_mode(int f, int w, int h)
         config_set_d(CONFIG_WIDTH,      w);
         config_set_d(CONFIG_HEIGHT,     h);
 
+        if (!glext_init())
+            return 0;
+
         glViewport(0, 0, w, h);
-        glClearColor(0.0f, 0.0f, 0.1f, 0.0f);
+        glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
 
         glEnable(GL_NORMALIZE);
         glEnable(GL_CULL_FACE);
@@ -117,9 +99,10 @@ int video_mode(int f, int w, int h)
         glEnable(GL_LIGHTING);
         glEnable(GL_BLEND);
 
+#if !ENABLE_OPENGLES
         glLightModeli(GL_LIGHT_MODEL_COLOR_CONTROL,
                       GL_SEPARATE_SPECULAR_COLOR);
-        glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1);
+#endif
 
         glPixelStorei(GL_PACK_ALIGNMENT, 1);
         glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
@@ -129,28 +112,11 @@ int video_mode(int f, int w, int h)
 
         /* If GL supports multisample, and SDL got a multisample buffer... */
 
-#ifdef GL_ARB_multisample
-        if (check_extension("ARB_multisample"))
+        if (glext_check("ARB_multisample"))
         {
             SDL_GL_GetAttribute(SDL_GL_MULTISAMPLEBUFFERS, &buffers);
-            if (buffers)
-                glEnable(GL_MULTISAMPLE_ARB);
+            if (buffers) glEnable(GL_MULTISAMPLE);
         }
-#endif
-
-        if (check_extension("ARB_multitexture"))
-        {
-            union
-            {
-                void *ob;
-                PFNGLACTIVETEXTUREARBPROC fn;
-            } cast;
-
-            cast.ob = SDL_GL_GetProcAddress("glActiveTextureARB");
-            glActiveTextureARB_ = cast.fn;
-        }
-
-        glReadBuffer(GL_FRONT);
 
         /* Attempt manual swap control if SDL's is broken. */
 
@@ -281,52 +247,52 @@ int  video_get_grab(void)
 
 void video_push_persp(float fov, float n, float f)
 {
-    GLdouble m[4][4];
+    GLfloat m[4][4];
 
-    GLdouble r = fov / 2 * V_PI / 180;
-    GLdouble s = sin(r);
-    GLdouble c = cos(r) / s;
+    GLfloat r = fov / 2 * V_PI / 180;
+    GLfloat s = sin(r);
+    GLfloat c = cos(r) / s;
 
-    GLdouble a = ((GLdouble) config_get_d(CONFIG_WIDTH) /
-                  (GLdouble) config_get_d(CONFIG_HEIGHT));
+    GLfloat a = ((GLfloat) config_get_d(CONFIG_WIDTH) /
+                 (GLfloat) config_get_d(CONFIG_HEIGHT));
 
     glMatrixMode(GL_PROJECTION);
     {
         glPushMatrix();
         glLoadIdentity();
 
-        m[0][0] =  c/a;
-        m[0][1] =  0.0;
-        m[0][2] =  0.0;
-        m[0][3] =  0.0;
-        m[1][0] =  0.0;
-        m[1][1] =    c;
-        m[1][2] =  0.0;
-        m[1][3] =  0.0;
-        m[2][0] =  0.0;
-        m[2][1] =  0.0;
+        m[0][0] = c / a;
+        m[0][1] =  0.0f;
+        m[0][2] =  0.0f;
+        m[0][3] =  0.0f;
+        m[1][0] =  0.0f;
+        m[1][1] =     c;
+        m[1][2] =  0.0f;
+        m[1][3] =  0.0f;
+        m[2][0] =  0.0f;
+        m[2][1] =  0.0f;
         m[2][2] = -(f + n) / (f - n);
-        m[2][3] = -1.0;
-        m[3][0] =  0.0;
-        m[3][1] =  0.0;
-        m[3][2] = -2.0 * n * f / (f - n);
-        m[3][3] =  0.0;
+        m[2][3] = -1.0f;
+        m[3][0] =  0.0f;
+        m[3][1] =  0.0f;
+        m[3][2] = -2.0f * n * f / (f - n);
+        m[3][3] =  0.0f;
 
-        glMultMatrixd(&m[0][0]);
+        glMultMatrixf(&m[0][0]);
     }
     glMatrixMode(GL_MODELVIEW);
 }
 
 void video_push_ortho(void)
 {
-    GLdouble w = (GLdouble) config_get_d(CONFIG_WIDTH);
-    GLdouble h = (GLdouble) config_get_d(CONFIG_HEIGHT);
+    GLfloat w = (GLfloat) config_get_d(CONFIG_WIDTH);
+    GLfloat h = (GLfloat) config_get_d(CONFIG_HEIGHT);
 
     glMatrixMode(GL_PROJECTION);
     {
         glPushMatrix();
         glLoadIdentity();
-        glOrtho(0.0, w, 0.0, h, -1.0, +1.0);
+        glOrtho_(0.0, w, 0.0, h, -1.0, +1.0);
     }
     glMatrixMode(GL_MODELVIEW);
 }
@@ -343,12 +309,10 @@ void video_pop_matrix(void)
 void video_clear(void)
 {
     if (config_get_d(CONFIG_REFLECTION))
-        glClear(GL_COLOR_BUFFER_BIT |
-                GL_DEPTH_BUFFER_BIT |
+        glClear(GL_DEPTH_BUFFER_BIT |
                 GL_STENCIL_BUFFER_BIT);
     else
-        glClear(GL_COLOR_BUFFER_BIT |
-                GL_DEPTH_BUFFER_BIT);
+        glClear(GL_DEPTH_BUFFER_BIT);
 }
 
 /*---------------------------------------------------------------------------*/