Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Iskhodnyy_kod_Doom

.pdf
Скачиваний:
7
Добавлен:
13.02.2015
Размер:
1.01 Mб
Скачать

//a wall texture, with an episode dependend

//name.

texturepresent[skytexture] = 1;

texturememory = 0;

for (i=0 ; i<numtextures ; i++)

{

if (!texturepresent[i]) continue;

texture = textures[i];

for (j=0 ; j<texture->patchcount ; j++)

{

lump = texture->patches[j].patch; texturememory += lumpinfo[lump].size; W_CacheLumpNum(lump , PU_CACHE);

}

}

// Precache sprites.

spritepresent = alloca(numsprites); memset (spritepresent,0, numsprites);

for (th = thinkercap.next ; th != &thinkercap ; th=th->next)

{

if (th->function.acp1 == (actionf_p1)P_MobjThinker) spritepresent[((mobj_t *)th)->sprite] = 1;

}

spritememory = 0;

for (i=0 ; i<numsprites ; i++)

{

if (!spritepresent[i]) continue;

for (j=0 ; j<sprites[i].numframes ; j++)

{

sf = &sprites[i].spriteframes[j]; for (k=0 ; k<8 ; k++)

{

lump = firstspritelump + sf->lump[k]; spritememory += lumpinfo[lump].size; W_CacheLumpNum(lump , PU_CACHE);

}

}

}

}

10.4r data.h

// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------

//

//$Id:$

//Copyright (C) 1993-1996 by id Software, Inc.

//This program 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

621

tex, col );

//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.

//

//DESCRIPTION:

//Refresh module, data I/O, caching, retrieval of graphics

//by name.

//

//-----------------------------------------------------------------------------

#ifndef __R_DATA__ #define __R_DATA__

#include "r_defs.h" #include "r_state.h"

#ifdef __GNUG__ #pragma interface #endif

// Retrieve column data for span blitting. byte*

R_GetColumn ( int

int

//I/O, setting up the stuff. void R_InitData (void);

void R_PrecacheLevel (void);

//Retrieval.

//Floor/ceiling opaque texture tiles,

//lookup by name. For animation?

int R_FlatNumForName (char* name);

//Called by P_Ticker for switches and animations,

//returns the texture number for the texture name. int R_TextureNumForName (char *name);

int R_CheckTextureNumForName (char *name);

#endif //-----------------------------------------------------------------------------

//

// $Log:$

//

//-----------------------------------------------------------------------------

10.5 r defs.h

// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------

//

//$Id:$

//Copyright (C) 1993-1996 by id Software, Inc.

//This program is free software; you can redistribute it and/or

//modify it under the terms of the GNU General Public License

622

//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.

//

//DESCRIPTION:

//Refresh/rendering module, shared data struct definitions.

//-----------------------------------------------------------------------------

#ifndef __R_DEFS__ #define __R_DEFS__

//Screenwidth. #include "doomdef.h"

//Some more or less basic data types

//we depend on.

#include "m_fixed.h"

//We rely on the thinker data struct

//to handle sound origins in sectors. #include "d_think.h"

//SECTORS do store MObjs anyway. #include "p_mobj.h"

#ifdef __GNUG__ #pragma interface #endif

//Silhouette, needed for clipping Segs (mainly)

//and sprites representing things.

#define SIL_NONE

0

#define SIL_BOTTOM

1

#define SIL_TOP

2

#define

SIL_BOTH

3

#define

MAXDRAWSEGS

256

//

//INTERNAL MAP TYPES

//used by play and refresh

//

//Your plain vanilla vertex.

//Note: transformed values not buffered locally,

//like some DOOM-alikes ("wt", "WebView") did.

typedef struct

{

fixed_t x;

623

fixed_t y;

} vertex_t;

//Forward of LineDefs, for Sectors. struct line_s;

//Each sector has a degenmobj_t in its center

//for sound origin purposes.

//I suppose this does not handle sound from

//moving objects (doppler), because

//position is prolly just buffered, not

//updated.

typedef struct

 

 

{

 

 

thinker_t

thinker;

// not used for anything

fixed_t

x;

 

fixed_t

y;

 

fixed_t

z;

 

} degenmobj_t;

 

 

//

//The SECTORS record, at runtime.

//Stores things/mobjs.

//

typedef struct

{

fixed_t

 

floorheight;

 

fixed_t

 

ceilingheight;

 

short

floorpic;

 

short

ceilingpic;

 

short

lightlevel;

 

short

special;

 

short

tag;

 

// 0 = untraversed, 1,2 = sndlines -1

 

int

 

soundtraversed;

 

// thing that made a sound (or null)

 

mobj_t*

 

soundtarget;

 

// mapblock bounding box for height changes

int

 

blockbox[4];

 

// origin for any sounds played by the sector

degenmobj_t

 

soundorg;

 

// if == validcount, already checked

 

int

 

validcount;

 

// list of mobjs in sector

 

mobj_t*

 

thinglist;

 

// thinker_t for reversable actions

 

void*

specialdata;

 

int

 

linecount;

 

struct line_s**

lines;

// [linecount] size

} sector_t;

624

//

// The SideDef.

//

typedef struct

{

//

add

this to the

calculated texture column

fixed_t

textureoffset;

//

add

this to the

calculated texture top

fixed_t

rowoffset;

//Texture indices.

//We do not maintain names here.

short

toptexture;

short

bottomtexture;

short

midtexture;

// Sector the SideDef is facing.

sector_t*

sector;

} side_t;

//

// Move clipping aid for LineDefs.

//

typedef enum

{

ST_HORIZONTAL,

ST_VERTICAL,

ST_POSITIVE,

ST_NEGATIVE

} slopetype_t;

typedef struct line_s

{

// Vertices, from v1 to v2. vertex_t* v1; vertex_t* v2;

// Precalculated v2 - v1 for side checking.

fixed_t

dx;

fixed_t

dy;

// Animation

related.

short

flags;

short

special;

short

tag;

//Visual appearance: SideDefs.

//sidenum[1] will be -1 if one sided short sidenum[2];

//Neat. Another bounding box, for the extent

//of the LineDef.

fixed_t bbox[4];

// To aid move clipping. slopetype_t slopetype;

625

//Front and back sector.

//Note: redundant? Can be retrieved from SideDefs. sector_t* frontsector;

sector_t* backsector;

// if == validcount, already checked

int validcount;

// thinker_t for reversable actions void* specialdata;

} line_t;

//

//A SubSector.

//References a Sector.

//Basically, this is a list of LineSegs,

//indicating the visible walls that define

//(all or some) sides of a convex BSP leaf.

typedef struct subsector_s

{

sector_t*

sector;

short

numlines;

short

firstline;

} subsector_t;

 

//

 

// The LineSeg.

 

//

 

typedef struct

 

{

 

vertex_t*

v1;

vertex_t*

v2;

fixed_t

offset;

angle_t

angle;

side_t*

sidedef;

line_t*

linedef;

//Sector references.

//Could be retrieved from linedef, too.

//backsector is NULL for one sided lines sector_t* frontsector;

sector_t* backsector;

} seg_t;

//

// BSP node.

//

typedef struct

{

// Partition line. fixed_t x;

626

fixed_t

y;

fixed_t

dx;

fixed_t

dy;

// Bounding box for each child. fixed_t bbox[2][4];

// If NF_SUBSECTOR its a subsector. unsigned short children[2];

} node_t;

// posts are runs of non masked source pixels

typedef struct

 

 

{

 

 

byte

topdelta;

// -1 is the last post in a column

byte

length;

// length data bytes follows

} post_t;

 

 

// column_t is a list of 0 or more post_t, (byte)-1 terminated

typedef post_t

column_t;

 

// PC direct

to screen

pointers

//B UNUSED -

keep till

detailshift in r_draw.c resolved

//extern

byte*

destview;

//extern

byte*

destscreen;

//

//OTHER TYPES

//This could be wider for >8 bit display.

//Indeed, true color support is posibble

//precalculating 24bpp lightmap/colormap LUT.

//from darkening PLAYPAL to all black.

//Could even us emore than 32 levels.

typedef byte

lighttable_t;

//

 

// ?

 

//

 

typedef struct drawseg_s

 

{

 

seg_t*

curline;

int

x1;

int

x2;

fixed_t

scale1;

fixed_t

scale2;

fixed_t

scalestep;

// 0=none, 1=bottom, 2=top, 3=both

int

silhouette;

627

//

do not clip sprites above this

fixed_t

bsilheight;

//

do not clip sprites below this

fixed_t

tsilheight;

//Pointers to lists for sprite clipping,

//all three adjusted so [x1] is first value.

short*

sprtopclip;

short*

sprbottomclip;

short*

maskedtexturecol;

} drawseg_t;

 

//Patches.

//A patch holds one or more columns.

//Patches are used for sprites and all masked pictures,

//and we compose textures from the TEXTURE1/2 lists

//of patches.

typedef struct

 

 

 

{

 

 

 

short

width;

 

// bounding box size

short

height;

 

 

short

leftoffset;

 

// pixels to the left of origin

short

topoffset;

// pixels below the origin

int

columnofs[8];

// only [width] used

//the [0] is &columnofs[width]

}patch_t;

//A vissprite_t is a thing

//that will be drawn during a refresh.

//I.e. a sprite object that is partly visible. typedef struct vissprite_s

{

//Doubly linked list.

struct vissprite_s*

prev;

struct vissprite_s*

next;

int

x1;

int

x2;

// for line side calculation

fixed_t

gx;

fixed_t

gy;

// global bottom / top

for silhouette clipping

fixed_t

gz;

fixed_t

gzt;

// horizontal position

of x1

fixed_t

startfrac;

fixed_t

scale;

// negative if flipped

 

fixed_t

xiscale;

628

fixed_t

texturemid;

int

patch;

//for color translation and shadow draw,

//maxbright frames as well

lighttable_t* colormap;

int

mobjflags;

} vissprite_t;

//

//Sprites are patches with a special naming convention

//so they can be recognized by R_InitSprites.

//The base name is NNNNFx or NNNNFxFx, with

//x indicating the rotation, x = 0, 1-7.

//The sprite and frame specified by a thing_t

//is range checked at run time.

//A sprite is a patch_t that is assumed to represent

//a three dimensional object and may have multiple

//rotations pre drawn.

//Horizontal flipping is used to save space,

//thus NNNNF2F5 defines a mirrored patch.

//Some sprites will only have one picture used

//for all views: NNNNF0

//

typedef struct

{

//If false use 0 for any position.

//Note: as eight entries are available,

//we might as well insert the same name eight times.

boolean

 

rotate;

//

Lump

to use

for view angles 0-7.

short

lump[8];

//

Flip

bit (1

= flip) to use for view angles 0-7.

byte

flip[8];

} spriteframe_t;

//

//A sprite definition:

//a number of animation frames.

typedef struct

{

int

numframes;

spriteframe_t*

spriteframes;

} spritedef_t;

 

//

// Now what is a visplane, anyway?

//

typedef struct

{

fixed_t

height;

int

picnum;

629

int

lightlevel;

int

minx;

int

maxx;

// leave pads for [minx-1]/[maxx+1]

byte

pad1;

//Here lies the rub for all

//dynamic resize/change of resolution.

byte

top[SCREENWIDTH];

byte

pad2;

byte

pad3;

// See above.

 

byte

bottom[SCREENWIDTH];

byte

pad4;

} visplane_t;

 

#endif //-----------------------------------------------------------------------------

//

// $Log:$

//

//-----------------------------------------------------------------------------

10.6 r draw.c

// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------

//

//$Id:$

//Copyright (C) 1993-1996 by id Software, Inc.

//This program 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.

//

//$Log:$

//DESCRIPTION:

//The actual span/column drawing functions.

//Here find the main potential for optimization,

//e.g. inline assembly, different algorithms.

//-----------------------------------------------------------------------------

static const char

rcsid[] = "$Id: r_draw.c,v 1.4 1997/02/03 16:47:55 b1 Exp $";

#include "doomdef.h"

#include "i_system.h" #include "z_zone.h"

630

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]