📄 skyfly.c
字号:
fog_params[2] = .78 + density *.22;
fog_params[3] = 1.0f;
}
void init_shmem(void)
{
int i;
unsigned int *flagsptr;
perfobj_vert_t *vertsptr;
int nflags, nverts;
AMALLOC(SharedData, shared_data, 1, "init_shmem");
AMALLOC(SharedData->terrain_cells, perfobj_t,
NumCells * NumCells, "init_shmem");
AMALLOC(SharedData->terrain_cell_flags, unsigned int *,
NumCells * NumCells, "init_shmem");
AMALLOC(SharedData->terrain_cell_verts, perfobj_vert_t *,
NumCells * NumCells, "init_shmem");
/*
* Allocate the flags and vertices of all terrain cells in 2 big chunks
* to improve data locality and consequently, cache hits
*/
nflags = 2 * CellDim + 1;
AMALLOC(flagsptr, unsigned int, nflags * NumCells * NumCells, "init_shmem");
nverts = (CellDim + 1) * 2 * CellDim;
AMALLOC(vertsptr, perfobj_vert_t, nverts * NumCells * NumCells, "init_shmem");
for (i = 0; i < NumCells * NumCells; i++) {
SharedData->terrain_cell_flags[i] = flagsptr;
flagsptr += nflags;
SharedData->terrain_cell_verts[i] = vertsptr;
vertsptr += nverts;
}
}
/*
* Initialize gfxpipe data structures. There is one set of semaphores
* per pipe.
*/
void init_gfxpipes(void)
{
int i, j;
num_pipes = 1;
for (i = 0; i < num_pipes; i++) {
AMALLOC(gfxpipes[i], gfxpipe_data, 1, "initgfxpipes");
AMALLOC(gfxpipes[i]->buffers, buffered_data *, NBUFFERS,
"init_gfxpipes");
gfxpipes[i]->gfxpipenum = i;
}
for (j = 0; j < NBUFFERS; j++) {
AMALLOC(gfxpipes[0]->buffers[j], buffered_data, 1,
"init_gfxpipes");
init_buffered_data(gfxpipes[0]->buffers[j]);
}
}
void init_buffered_data(buffered_data *buffered)
{
int i;
perfobj_t *pobj;
pobj = &(buffered->viewer_pos_obj);
pobj->flags = buffered->viewer_pos_flags;
pobj->vdata = buffered->viewer_position;
*(buffered->viewer_pos_flags) = PD_VIEWER_POS;
*(buffered->viewer_pos_flags + 1) = PD_END;
for (i = 0; i < NUM_PLANES; i++) {
pobj = &(buffered->paper_plane_pos_obj[i]);
pobj->flags = buffered->paper_plane_pos_flags;
pobj->vdata = buffered->paper_plane_position[i];
}
*(buffered->paper_plane_pos_flags) = PD_PAPER_PLANE_POS;
*(buffered->paper_plane_pos_flags + 1) = PD_END;
}
/* ARGSUSED */
void init_gl(int gfxpipenum)
{
glDrawBuffer(GL_BACK);
glClear(GL_COLOR_BUFFER_BIT);
if (!rgbmode)
glIndexi(0);
set_fog(fog);
glEnable(GL_CULL_FACE);
glEnable(GL_DEPTH_TEST);
set_dither(dither);
glHint( GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST );
init_texture_and_lighting();
glMatrixMode(GL_PROJECTION);
gluPerspective(FOV * RAD_TO_DEG, (float)Wxsize/(float)Wysize,
.1, far_cull *.95);
glMatrixMode(GL_MODELVIEW);
glHint(GL_FOG_HINT, GL_FASTEST);
glFogi(GL_FOG_MODE, GL_EXP2);
glFogf(GL_FOG_DENSITY, fog_density);
if (rgbmode) {
glFogfv(GL_FOG_COLOR, fog_params);
if (fog && fog_density > 0)
glEnable(GL_FOG);
} else if (FOG_LEVELS > 1) {
glFogi(GL_FOG_INDEX, FOG_LEVELS-1);
if (fog)
glEnable(GL_FOG);
}
}
unsigned char* read_bwimage(char *name, int *w, int *h);
void init_texture_and_lighting(void)
{
unsigned char *bwimage256, *bwimage128;
int w, h;
if(!(bwimage256 = (unsigned char*) read_bwimage("terrain.bw", &w, &h)))
if(!(bwimage256 = (unsigned char *)
read_bwimage("/usr/demos/data/textures/terrain.bw", &w, &h)))
err_msg(ERR_FATAL, "init_texture_and_lighting()",
"Can't open terrain.bw");
if(w != 256 || h != 256)
err_msg(ERR_FATAL, "init_texture_and_lighting()",
"terrain.bw must be 256x256");
if (!(bwimage128 = (unsigned char *) read_bwimage("clouds.bw", &w, &h)))
if (!(bwimage128 = (unsigned char *)
read_bwimage("/usr/demos/data/textures/clouds.bw", &w, &h)))
err_msg(ERR_FATAL, "init_misc()", "Can't open clouds.bw");
if (w != 128 || h != 128)
err_msg(ERR_FATAL, "init_misc()", "clouds.bw must be 128x128");
if (mipmap)
texmode = GL_LINEAR_MIPMAP_LINEAR;
else
texmode = GL_NEAREST;
if (!threecomp) {
/*
* 1 and 2-component textures offer the highest performance on SkyWriter
* so they are the most recommended.
*/
glBindTexture(GL_TEXTURE_2D, 1);
if (!mipmap)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texmode);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texmode);
if (mipmap)
gluBuild2DMipmaps(GL_TEXTURE_2D, /*0,*/ 1, 256, 256, /*0,*/ GL_LUMINANCE, GL_UNSIGNED_BYTE, bwimage256);
else if (rgbmode)
glTexImage2D(GL_TEXTURE_2D, 0, 1, 256, 256, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, bwimage256);
else {
#define TXSIZE 128
GLubyte buf[TXSIZE*TXSIZE];
int ii;
gluScaleImage(GL_LUMINANCE, 256, 256, GL_UNSIGNED_BYTE, bwimage256,
TXSIZE, TXSIZE, GL_UNSIGNED_BYTE, buf);
for (ii = 0; ii < TXSIZE*TXSIZE; ii++) {
buf[ii] = terr_base +
FOG_LEVELS * (buf[ii] >> (8-TERR_BITS));
}
#ifdef GL_COLOR_INDEX8_EXT /* Requires SGI_index_texture and EXT_paletted_texture */
glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, TXSIZE, TXSIZE,
0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, buf);
#endif
#undef TXSIZE
}
glBindTexture(GL_TEXTURE_2D, 2);
if (!mipmap)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texmode);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texmode);
if (mipmap)
gluBuild2DMipmaps(GL_TEXTURE_2D, /*0,*/ 1, 128, 128, /*0,*/ GL_LUMINANCE, GL_UNSIGNED_BYTE, bwimage128);
else if (rgbmode)
glTexImage2D(GL_TEXTURE_2D, 0, 1, 128, 128, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, bwimage128);
else {
#define TXSIZE 64
GLubyte buf[TXSIZE*TXSIZE];
int ii;
gluScaleImage(GL_LUMINANCE, 128, 128, GL_UNSIGNED_BYTE, bwimage128,
TXSIZE, TXSIZE, GL_UNSIGNED_BYTE, buf);
for (ii = 0; ii < TXSIZE*TXSIZE; ii++) {
buf[ii] = sky_base +
FOG_LEVELS * (buf[ii] >> (8-SKY_BITS));
}
#ifdef GL_COLOR_INDEX8_EXT /* Requires SGI_index_texture and EXT_paletted_texture */
glTexImage2D(GL_TEXTURE_2D, 0, GL_COLOR_INDEX8_EXT, TXSIZE, TXSIZE,
0, GL_COLOR_INDEX, GL_UNSIGNED_BYTE, buf);
#endif
#undef TXSIZE
}
} else {
float r0, r1, g0, g1, b0, b1;
int i;
unsigned char *t256 = (unsigned char *)malloc(256*256*3);
/* terrain */
r0 = 0.40f; r1 = 0.30f;
g0 = 0.30f; g1 = 0.70f;
b0 = 0.15f; b1 = 0.10f;
for(i = 0; i < 256*256; i++) {
float t = bwimage256[i] / 255.0f;
t256[3*i+0] = (unsigned char) (255.0f * (r0 + t*t * (r1-r0)));
t256[3*i+1] = (unsigned char) (255.0f * (g0 + t * (g1-g0)));
t256[3*i+2] = (unsigned char) (255.0f * (b0 + t*t * (b1-b0)));
}
glBindTexture(GL_TEXTURE_2D, 1);
if (!mipmap)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texmode);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texmode);
if (mipmap)
gluBuild2DMipmaps(GL_TEXTURE_2D, /*0,*/ 3, 256, 256, /*0,*/ GL_RGB, GL_UNSIGNED_BYTE, t256);
else
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, t256);
/* sky without fog */
r0 = 0.23; r1 = 1.0f;
g0 = 0.35; g1 = 1.0f;
b0 = 0.78; b1 = 1.0f;
for(i = 0; i < 128*128; i++) {
float t = bwimage128[i] / 255.0f;
t256[3*i+0] = (unsigned char) (255.0f * (r0 + t * (r1-r0)));
t256[3*i+1] = (unsigned char) (255.0f * (g0 + t * (g1-g0)));
t256[3*i+2] = (unsigned char) (255.0f * (b0 + t * (b1-b0)));
}
glBindTexture(GL_TEXTURE_2D, 2);
if (!mipmap)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texmode);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texmode);
if (mipmap)
gluBuild2DMipmaps(GL_TEXTURE_2D, /*0,*/ 3, 128, 128, /*0,*/ GL_RGB, GL_UNSIGNED_BYTE, t256);
else
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5, 128, 128, 0, GL_RGB, GL_UNSIGNED_BYTE, t256);
/* sky with fog */
r0 = fog_params[0]; r1 = 1.0f;
g0 = fog_params[1]; g1 = 1.0f;
b0 = fog_params[2]; b1 = 1.0f;
for(i = 0; i < 128*128; i++) {
float t = bwimage128[i] / 255.0f;
t256[3*i+0] = (unsigned char) (255.0f * (r0 + t * (r1-r0)));
t256[3*i+1] = (unsigned char) (255.0f * (g0 + t * (g1-g0)));
t256[3*i+2] = (unsigned char) (255.0f * (b0 + t * (b1-b0)));
}
glBindTexture(GL_TEXTURE_2D, 3);
if (!mipmap)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, texmode);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, texmode);
if (mipmap)
gluBuild2DMipmaps(GL_TEXTURE_2D, /*0,*/ 3, 128, 128, /*0,*/ GL_RGB, GL_UNSIGNED_BYTE, t256);
else
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB5, 128, 128, 0, GL_RGB, GL_UNSIGNED_BYTE, t256);
free(t256);
}
free(bwimage256);
free(bwimage128);
/* both textures use BLEND environment */
if (rgbmode) {
if (threecomp) {
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
}
else {
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
}
} else if (FOG_LEVELS > 1) {
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_ADD);
} else {
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
}
{
GLfloat position[] = { LX, LY, LZ, 0., };
GLfloat one[] = { 1.0, 1.0, 1.0, 1.0 };
if (rgbmode)
glLightfv(GL_LIGHT0, GL_AMBIENT, one);
glLightfv(GL_LIGHT0, GL_POSITION, position);
glLightfv(GL_LIGHT0, GL_DIFFUSE, one);
glLightfv(GL_LIGHT0, GL_SPECULAR, one);
}
if (rgbmode) {
GLfloat ambient[] = { 0.3, 0.3, 0.1, 0.0 };
GLfloat diffuse[] = { 0.7, 0.7, 0.1, 0.0 };
GLfloat zero[] = { 0.0, 0.0, 0.0, 0.0 };
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, zero);
} else {
glMaterialiv(GL_FRONT_AND_BACK, GL_COLOR_INDEXES, plane_colors);
}
{
glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 0);
glEnable(GL_LIGHT0);
}
}
void lightpos(void)
{
GLfloat position[] = { LX, LY, LZ, 0., };
glLightfv(GL_LIGHT0, GL_POSITION, position);
}
void texenv(int env)
{
GLfloat colors[3][4] = { { 0., 0., 0., 0., },
{ .1, .1, .1, 0., }, /* terrain */
{ 1., 1., 1., 0., }, }; /* sky */
glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, colors[env]);
}
/*-------------------------------- Utility ---------------------------------*/
void err_msg(int type, char* func, char* error)
{
char msg[512];
if (type & ERR_WARNING) {
fprintf(stderr, "Warning: ");
sprintf(msg, "Warning: %s", error);
}
else if (type & ERR_FATAL) {
fprintf(stderr, "FATAL: ");
sprintf(msg, "FATAL: %s", error);
}
fprintf(stderr, "%s: %s\n", func, error);
if (type & ERR_SYSERR) {
perror("perror() = ");
fprintf(stderr, "errno = %d\n", errno);
}
fflush(stderr);
if (type & ERR_FATAL) {
exit(-1);
}
}
void set_fog(int enable)
{
fog = enable;
if (fog) {
glEnable(GL_FOG);
if (rgbmode)
glClearColor(fog_params[0], fog_params[1], fog_params[2], 1.0);
else {
glClearIndex(sky_base + FOG_LEVELS - 1);
}
} else {
glDisable(GL_FOG);
if (rgbmode)
glClearColor(0.23, 0.35, 0.78, 1.0);
else {
glClearIndex(sky_base);
}
}
}
void set_dither(int enable)
{
dither = enable;
if (dither) {
glEnable(GL_DITHER);
} else {
glDisable(GL_DITHER);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -