share/solid_cmd.o \
share/solid_all.o \
share/part.o \
- share/back.o \
share/geom.o \
share/item.o \
share/ball.o \
share/base_config.o \
share/config.o \
share/video.o \
+ share/glext.o \
share/binary.o \
share/state.o \
share/audio.o \
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 \
#include "vec3.h"
#include "geom.h"
#include "item.h"
-#include "back.h"
#include "part.h"
#include "ball.h"
#include "image.h"
/* Initialize particles. */
- part_reset(GOAL_HEIGHT, JUMP_HEIGHT);
+ part_reset();
/* Initialize command state. */
#include "part.h"
#include "geom.h"
#include "config.h"
-#include "back.h"
#include "video.h"
#include "solid_draw.h"
/*---------------------------------------------------------------------------*/
-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 };
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],
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;
{
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++)
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();
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;
1.0f,
xp->base->r);
- swch_draw(xp->f, xp->e);
+ swch_draw(rend, xp->f, xp->e);
}
glPopMatrix();
}
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();
{
/* Draw the floor. */
- sol_refl(&gd->draw);
+ sol_refl(&gd->draw, rend);
}
glPopMatrix();
}
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;
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();
}
{
/* 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. */
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();
{
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);
/*---------------------------------------------------------------------------*/
-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];
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);
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);
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);
}
/*---------------------------------------------------------------------------*/
/* 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);
/*---------------------------------------------------------------------------*/
for (i = SPEED_NONE + 1; i < SPEED_MAX; i++)
{
- const GLfloat *c = gui_gry;
+ const GLubyte *c = gui_gry;
if (speed != SPEED_NONE)
{
/*---------------------------------------------------------------------------*/
-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)
glDisable(GL_LIGHTING);
wire = 1;
}
+#endif
}
/*---------------------------------------------------------------------------*/
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;
/* Render. */
st_paint(0.001f * t0);
+ shot_take();
video_swap();
if (config_get_d(CONFIG_NICE))
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);
#include "ball.h"
#include "cmd.h"
#include "audio.h"
-#include "back.h"
+#include "geom.h"
#include "video.h"
#include "demo.h"
{
video_push_persp((float) config_get_d(CONFIG_VIEW_FOV), 0.1f, FAR_DIST);
{
- back_draw(0);
+ back_draw_easy();
}
video_pop_matrix();
#include "gui.h"
#include "hud.h"
-#include "back.h"
#include "geom.h"
#include "item.h"
#include "ball.h"
{
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);
{
hud_free();
gui_free();
- swch_free();
- jump_free();
- goal_free();
+ geom_free();
item_free();
ball_free();
shad_free();
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();
}
#include "config.h"
#include "video.h"
#include "text.h"
-#include "back.h"
+#include "geom.h"
#include "game_common.h"
#include "game_server.h"
{
video_push_persp((float) config_get_d(CONFIG_VIEW_FOV), 0.1f, FAR_DIST);
{
- back_draw(0);
+ back_draw_easy();
}
video_pop_matrix();
}
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;
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)
{
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
--- /dev/null
+{
+"classname" "worldspawn"
+"model" "geom/back/back.obj"
+}
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+{
+"classname" "worldspawn"
+"model" "geom/beam/beam.obj"
+}
--- /dev/null
+# 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
--- /dev/null
+# 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
--- /dev/null
+{
+"classname" "worldspawn"
+"model" "geom/flag/flag.obj"
+}
--- /dev/null
+# 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
--- /dev/null
+# 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
--- /dev/null
+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
--- /dev/null
+{
+"classname" "worldspawn"
+"model" "geom/goal/goal.obj"
+}
--- /dev/null
+# 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
--- /dev/null
+# 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
--- /dev/null
+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
--- /dev/null
+{
+"classname" "worldspawn"
+"model" "geom/jump/jump.obj"
+}
--- /dev/null
+# 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
--- /dev/null
+# 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
--- /dev/null
+{
+"classname" "worldspawn"
+"model" "geom/mark/mark.obj"
+}
--- /dev/null
+# 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
--- /dev/null
+# 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
--- /dev/null
+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
--- /dev/null
+{
+"classname" "worldspawn"
+"model" "geom/vect/vect.obj"
+}
--- /dev/null
+# 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
--- /dev/null
+# 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
-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
--- /dev/null
+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
-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
-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
"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"
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
--- /dev/null
+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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
-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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
--- /dev/null
+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
#include "vec3.h"
#include "geom.h"
#include "ball.h"
-#include "back.h"
#include "hole.h"
#include "hud.h"
#include "image.h"
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 */
view_e[2][2] = 1.f;
}
-void game_init(const char *s)
+int game_init(const char *s)
{
int i;
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++)
idle_t = 1.0f;
}
}
+ return 1;
}
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] = {
int ui;
+ glEnable(GL_COLOR_MATERIAL);
+
for (ui = curr_party(); ui > 0; ui--)
{
if (ui == ball)
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();
}
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;
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++)
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;
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();
}
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;
glPushMatrix();
{
glTranslatef(view_p[0], view_p[1], view_p[2]);
- back_draw(0);
+ back_draw(&rend, 0);
}
glPopMatrix();
/* 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. */
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);
}
/*---------------------------------------------------------------------------*/
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);
float st = 0.f;
int i, n = 1, m = 0;
+ if (!state)
+ return GAME_NONE;
+
s = (7.f * s + dt) / 8.f;
t = s;
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);
/*---------------------------------------------------------------------------*/
-void game_init(const char *);
+int game_init(const char *);
void game_free(void);
void game_draw(int, float);
#include "game.h"
#include "geom.h"
#include "hud.h"
-#include "back.h"
#include "audio.h"
#include "config.h"
#include "fs.h"
/*---------------------------------------------------------------------------*/
-void hole_goto(int h, int p)
+int hole_goto(int h, int p)
{
int i;
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)
game_free();
back_free();
- hole_goto(hole, party);
-
- return 1;
+ if (hole_goto(hole, party))
+ return 1;
}
return 0;
}
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);
void hud_init(void)
{
- static const float *color[5] = {
+ static const GLubyte *color[5] = {
gui_wht,
gui_red,
gui_grn,
/*---------------------------------------------------------------------------*/
-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)
glDisable(GL_LIGHTING);
wire = 1;
}
+#endif
}
/*---------------------------------------------------------------------------*/
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;
{
st_timer((t1 - t0) / 1000.f);
st_paint(0.001f * t1);
+ shot_take();
SDL_GL_SwapBuffers();
t0 = t1;
#include <math.h>
#include "hud.h"
-#include "back.h"
#include "geom.h"
#include "gui.h"
#include "vec3.h"
}
static int score_card(const char *title,
- const float *c0,
- const float *c1)
+ const GLubyte *c0,
+ const GLubyte *c1)
{
int id, jd, kd, ld;
{
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);
{
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);
}
#include "gui.h"
#include "hud.h"
-#include "back.h"
#include "geom.h"
#include "ball.h"
#include "part.h"
{
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);
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();
{
shad_init();
ball_init();
- mark_init();
- flag_init();
- jump_init();
- swch_init();
+ geom_init();
gui_init();
}
#include <SDL.h>
+#define OV_EXCLUDE_STATIC_CALLBACKS
#include <vorbis/codec.h>
#include <vorbis/vorbisfile.h>
+++ /dev/null
-/*
- * 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();
-}
-
-/*---------------------------------------------------------------------------*/
+++ /dev/null
-#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
/*---------------------------------------------------------------------------*/
-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)
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);
/* Draw the solid opaque and transparent geometry. */
- sol_draw(&solid.draw, mask, test);
+ sol_draw(&solid.draw, rend, mask, test);
}
glPopMatrix();
}
}
-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)
{
/* 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. */
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);
}
}
-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)
{
glAlphaFunc(GL_GEQUAL, outer_alpha);
}
- /* Apply the pendulum rotation. */
+ /* Apply the pendulum rotation. */
if (pend)
{
/* 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. */
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);
/*---------------------------------------------------------------------------*/
-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,
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);
}
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,
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);
}
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,
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);
}
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)
{
/* 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);
}
/*---------------------------------------------------------------------------*/
#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);
#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);
#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);
}
/*---------------------------------------------------------------------------*/
*/
static GLuint shad_text;
+static GLuint clip_text;
+
+static GLubyte clip_data[] = { 0xff, 0xff, 0x0, 0x0 };
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);
}
}
#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);
/*---------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------*/
+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
--- /dev/null
+/*
+ * 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
+}
+
+/*---------------------------------------------------------------------------*/
+/*
+ * 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
/*---------------------------------------------------------------------------*/
-#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
#define GUI_LINES 8
+/*---------------------------------------------------------------------------*/
+
struct widget
{
int type;
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)
}
/*---------------------------------------------------------------------------*/
-/*
- * 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);
}
/*---------------------------------------------------------------------------*/
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. */
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. */
}
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. */
/* 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. */
int w, h;
};
-
static struct size gui_measure(const char *text, TTF_Font *font)
{
struct size size = { 0, 0 };
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)
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)
{
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);
}
}
}
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;
}
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]);
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;
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;
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;
* 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;
{
/* 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;
{
/* 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)
/* 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;
}
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();
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. */
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();
}
glPushMatrix();
{
- glColor4fv(gui_wht);
-
/* Translate to the widget center, and apply the pulse scale. */
glTranslatef((GLfloat) (widget[id].x + widget[id].w / 2),
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();
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),
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();
}
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();
}
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);
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)
{
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)
{
#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];
/*---------------------------------------------------------------------------*/
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);
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);
#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;
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);
{
switch (hp->t)
{
-
case ITEM_COIN:
if (hp->n >= 1)
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;
c[0] = 0.00f;
c[1] = 0.51f;
c[2] = 0.80f;
+ c[3] = 1.00f;
break;
c[0] = 1.00f;
c[1] = 0.76f;
c[2] = 0.00f;
+ c[3] = 1.00f;
break;
c[0] = 1.0f;
c[1] = 1.0f;
c[2] = 1.0f;
+ c[3] = 1.0f;
break;
}
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)
{
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();
}
/*---------------------------------------------------------------------------*/
#define ITEM_H
#include "solid_vary.h"
+#include "solid_draw.h"
#define ITEM_RADIUS 0.15f
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
#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! */
#define MAXE 131072
#define MAXS 65536
#define MAXT 131072
+#define MAXO 131072
#define MAXG 65536
#define MAXL 4096
#define MAXN 2048
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");
fp->ec = 0;
fp->sc = 0;
fp->tc = 0;
+ fp->oc = 0;
fp->gc = 0;
fp->lc = 0;
fp->nc = 0;
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));
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;
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);
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. */
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;
}
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)
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);
}
}
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
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;
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];
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;
{
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;
}
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);
uniq_edge(fp);
uniq_side(fp);
uniq_texc(fp);
+ uniq_offs(fp);
uniq_geom(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++;
}
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++)
/*---------------------------------------------------------------------------*/
-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. */
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[])
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);
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;
}
#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;
/*---------------------------------------------------------------------------*/
};
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);
}
}
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);
}
/*---------------------------------------------------------------------------*/
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);
/*---------------------------------------------------------------------------*/
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);
}
/*---------------------------------------------------------------------------*/
#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);
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)
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)
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)
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;
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);
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)
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);
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);
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)
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);
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);
* 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)
*
* 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. */
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
int ec;
int sc;
int tc;
+ int oc;
int gc;
int lc;
int nc;
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;
#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();
+ }
}
/*---------------------------------------------------------------------------*/
#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
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;
};
/*---------------------------------------------------------------------------*/
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);
/*---------------------------------------------------------------------------*/
#include <string.h>
#include "gui.h"
-#include "back.h"
#include "geom.h"
#include "part.h"
#include "audio.h"
{
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);
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();
state->paint(state->gui_id, t);
}
else
+ */
{
video_clear();
state->paint(state->gui_id, t);
void sync_init(void)
{
- long swap = 1;
+ GLint swap = 1;
CGLSetParameter(CGLGetCurrentContext(), kCGLCPSwapInterval, &swap);
}
/*---------------------------------------------------------------------------*/
-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;
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);
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);
/* 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. */
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);
}
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);
}
/*---------------------------------------------------------------------------*/