亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? r_things.c

?? 游戲類程序源代碼---WinDoom 3D源程序.zip
?? C
?? 第 1 頁 / 共 2 頁
字號:
// Emacs style mode select   -*- C++ -*- 
//-----------------------------------------------------------------------------
//
// $Id:$
//
// Copyright (C) 1993-1996 by id Software, Inc.
//
// This source is available for distribution and/or modification
// only under the terms of the DOOM Source Code License as
// published by id Software. All rights reserved.
//
// The source is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License
// for more details.
//
// $Log:$
//
// DESCRIPTION:
//	Refresh of things, i.e. objects represented by sprites.
//
//-----------------------------------------------------------------------------


static const char
rcsid[] = "$Id: r_things.c,v 1.5 1997/02/03 16:47:56 b1 Exp $";


#include <stdio.h>
#include <stdlib.h>


#include "doomdef.h"
#include "m_swap.h"

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

#include "r_local.h"

#include "doomstat.h"



#define MINZ				(FRACUNIT*4)
//#define BASEYCENTER			(SCREENHEIGHT/2)
#define BASEYCENTER			100
//#define BASEYCENTER			(100-((SCREENHEIGHT-200)/256))
//void R_DrawColumn (void);
//void R_DrawFuzzColumn (void);


char MsgText[256];
void WriteDebug(char *);

typedef struct
{
    int		x1;
    int		x2;
	
    int		column;
    int		topclip;
    int		bottomclip;

} maskdraw_t;



//
// Sprite rotation 0 is facing the viewer,
//  rotation 1 is one angle turn CLOCKWISE around the axis.
// This is not the same as the angle,
//  which increases counter clockwise (protractor).
// There was a lot of stuff grabbed wrong, so I changed it...
//
fixed_t		pspritescale;
fixed_t		pspriteiscale;

lighttable_t**	spritelights;

// constant arrays
//  used for psprite clipping and initializing clipping
short      *negonearray;
short      *screenheightarray;
//short		negonearray[SCREENWIDTH];
//short		screenheightarray[SCREENWIDTH];


//
// INITIALIZATION FUNCTIONS
//

// variables used to look up
//  and range check thing_t sprites patches
spritedef_t*	sprites;
int		numsprites;

spriteframe_t	sprtemp[29];
int		maxframe;
char*		spritename;

// DQ start addition
extern angle_t *lefteyextoviewangle;		// table as viewed from the left eye
extern angle_t *righteyextoviewangle;	// table as viewed from the right eye
// DQ end addition



//
// R_InstallSpriteLump
// Local function for R_InitSprites.
//
void
R_InstallSpriteLump
( int		lump,
  unsigned	frame,
  unsigned	rotation,
  boolean	flipped )
{
    int		r;
	
    if (frame >= 29 || rotation > 8)
	I_Error("R_InstallSpriteLump: "
		"Bad frame characters in lump %i", lump);
	
    if ((int)frame > maxframe)
	maxframe = frame;
		
    if (rotation == 0)
    {
	// the lump should be used for all rotations
	if (sprtemp[frame].rotate == false)
	    I_Error ("R_InitSprites: Sprite %s frame %c has "
		     "multip rot=0 lump", spritename, 'A'+frame);

	if (sprtemp[frame].rotate == true)
	    I_Error ("R_InitSprites: Sprite %s frame %c has rotations "
		     "and a rot=0 lump", spritename, 'A'+frame);
			
	sprtemp[frame].rotate = false;
	for (r=0 ; r<8 ; r++)
	{
	    sprtemp[frame].lump[r] = lump - firstspritelump;
	    sprtemp[frame].flip[r] = (byte)flipped;
	}
	return;
    }
	
    // the lump is only used for one rotation
    if (sprtemp[frame].rotate == false)
	I_Error ("R_InitSprites: Sprite %s frame %c has rotations "
		 "and a rot=0 lump", spritename, 'A'+frame);
		
    sprtemp[frame].rotate = true;

    // make 0 based
    rotation--;		
    if (sprtemp[frame].lump[rotation] != -1)
	I_Error ("R_InitSprites: Sprite %s : %c : %c "
		 "has two lumps mapped to it",
		 spritename, 'A'+frame, '1'+rotation);
		
    sprtemp[frame].lump[rotation] = lump - firstspritelump;
    sprtemp[frame].flip[rotation] = (byte)flipped;
}




//
// R_InitSpriteDefs
// Pass a null terminated list of sprite names
//  (4 chars exactly) to be used.
// Builds the sprite rotation matrixes to account
//  for horizontally flipped sprites.
// Will report an error if the lumps are inconsistant. 
// Only called at startup.
//
// Sprite lump names are 4 characters for the actor,
//  a letter for the frame, and a number for the rotation.
// A sprite that is flippable will have an additional
//  letter/number appended.
// The rotation character can be 0 to signify no rotations.
//
void R_InitSpriteDefs (char** namelist) 
{ 
    char**	check;
    int		i;
    int		l;
    int		intname;
    int		frame;
    int		rotation;
    int		start;
    int		end;
    int		patched;
		
    // count the number of sprite names
    check = namelist;
    while (*check != NULL)
	check++;

    numsprites = check-namelist;
	
    if (!numsprites)
	return;
		
    sprites = Z_Malloc(numsprites *sizeof(*sprites), PU_STATIC, NULL);
	
    start = firstspritelump-1;
    end = lastspritelump+1;
	
    // scan all the lump names for each of the names,
    //  noting the highest frame letter.
    // Just compare 4 characters as ints
    for (i=0 ; i<numsprites ; i++)
    {
	spritename = namelist[i];
	memset (sprtemp,-1, sizeof(sprtemp));
		
	maxframe = -1;
	intname = *(int *)namelist[i];
	
	// scan the lumps,
	//  filling in the frames for whatever is found
	for (l=start+1 ; l<end ; l++)
	{
	    if (*(int *)lumpinfo[l].name == intname)
	    {
		frame = lumpinfo[l].name[4] - 'A';
		rotation = lumpinfo[l].name[5] - '0';

		if (modifiedgame)
		    patched = W_GetNumForName (lumpinfo[l].name);
		else
		    patched = l;

		R_InstallSpriteLump (patched, frame, rotation, false);

		if (lumpinfo[l].name[6])
		{
		    frame = lumpinfo[l].name[6] - 'A';
		    rotation = lumpinfo[l].name[7] - '0';
		    R_InstallSpriteLump (l, frame, rotation, true);
		}
	    }
	}
	
	// check the frames that were found for completeness
	if (maxframe == -1)
	{
	    sprites[i].numframes = 0;
	    continue;
	}
		
	maxframe++;
	
	for (frame = 0 ; frame < maxframe ; frame++)
	{
	    switch ((int)sprtemp[frame].rotate)
	    {
	      case -1:
		// no rotations were found for that frame at all
		I_Error ("R_InitSprites: No patches found "
			 "for %s frame %c", namelist[i], frame+'A');
		break;
		
	      case 0:
		// only the first rotation is needed
		break;
			
	      case 1:
		// must have all 8 frames
		for (rotation=0 ; rotation<8 ; rotation++)
		    if (sprtemp[frame].lump[rotation] == -1)
			I_Error ("R_InitSprites: Sprite %s frame %c "
				 "is missing rotations",
				 namelist[i], frame+'A');
		break;
	    }
	}
	
	// allocate space for the frames present and copy sprtemp to it
	sprites[i].numframes = maxframe;
	sprites[i].spriteframes = 
	    Z_Malloc (maxframe * sizeof(spriteframe_t), PU_STATIC, NULL);
	memcpy (sprites[i].spriteframes, sprtemp, maxframe*sizeof(spriteframe_t));
    }

}




//
// GAME FUNCTIONS
//
vissprite_t	vissprites[MAXVISSPRITES];
vissprite_t*	vissprite_p;
int		newvissprite;



//
// R_InitSprites
// Called at program start.
//
void R_InitSprites (char** namelist)
{
    int		i;
// DQFIXME - are not freeing the memory, and should not callos the xtoviewangle - it is 
// just a pointer	 
	// DQ start addition
	 // Note that there is no error detection - just like xtoviewangle was not tested before
	righteyextoviewangle = (angle_t *)calloc(SCREENWIDTH+1,sizeof(angle_t));
	lefteyextoviewangle = (angle_t *)calloc(SCREENWIDTH+1,sizeof(angle_t));
	// DQ end addition
   xtoviewangle = (angle_t *)calloc(SCREENWIDTH+1,sizeof(angle_t));  // original line

    negonearray = (short *)calloc(SCREENWIDTH,sizeof(short));
    screenheightarray = (short *)calloc(SCREENWIDTH,sizeof(short));
    for (i=0 ; i<SCREENWIDTH ; i++)
    {
	negonearray[i] = -1;
    }
	
    R_InitSpriteDefs (namelist);
}



//
// R_ClearSprites
// Called at frame start.
//
void R_ClearSprites (void)
{
    vissprite_p = vissprites;
}


//
// R_NewVisSprite
//
vissprite_t	overflowsprite;

vissprite_t* R_NewVisSprite (void)
{
    if (vissprite_p == &vissprites[MAXVISSPRITES])
	return &overflowsprite;
    
    vissprite_p++;
    return vissprite_p-1;
}



//
// R_DrawMaskedColumn
// Used for sprites and masked mid textures.
// Masked means: partly transparent, i.e. stored
//  in posts/runs of opaque pixels.
//
short*		mfloorclip;
short*		mceilingclip;

fixed_t		spryscale;
fixed_t		sprtopscreen;

void R_DrawMaskedColumn (column_t* column, PBUFFER ViewWindowBuffer/*DQ*/)
{
    int		topscreen;
    int 	bottomscreen;
    fixed_t	basetexturemid;
	
    basetexturemid = dc_texturemid;
	
    for ( ; column->topdelta != 0xff ; ) 
    {
	// calculate unclipped screen coordinates
	//  for post
	topscreen = sprtopscreen + spryscale*column->topdelta;
	bottomscreen = topscreen + spryscale*column->length;

	dc_yl = (topscreen+FRACUNIT-1)>>FRACBITS;
	dc_yh = (bottomscreen-1)>>FRACBITS;
		
	if (dc_yh >= mfloorclip[dc_x])
	    dc_yh = mfloorclip[dc_x]-1;
	if (dc_yl <= mceilingclip[dc_x])
	    dc_yl = mceilingclip[dc_x]+1;

	if (dc_yl <= dc_yh)
	{
	    dc_source = (byte *)column + 3;
	    dc_texturemid = basetexturemid - (column->topdelta<<FRACBITS);
	    // dc_source = (byte *)column + 3 - column->topdelta;

	    // Drawn by either R_DrawColumn
	    //  or (SHADOW) R_DrawFuzzColumn.
	    colfunc (ViewWindowBuffer/*DQ*/);	
	}
	column = (column_t *)(  (byte *)column + column->length + 4);
    }
	
    dc_texturemid = basetexturemid;
}



//
// R_DrawVisSprite
//  mfloorclip and mceilingclip should also be set.
//
void
R_DrawVisSprite
( vissprite_t*		vis,
  int			x1,
  int			x2,
  PBUFFER ViewWindowBuffer/*DQ*/)
{
    column_t*		column;
    int			texturecolumn;
    fixed_t		frac;
    patch_t*		patch;
	
	
    patch = W_CacheLumpNum (vis->patch+firstspritelump, PU_CACHE);

    dc_colormap = vis->colormap;
    
    if (!dc_colormap)
    {
	// NULL colormap = shadow draw
	colfunc = fuzzcolfunc;
    }
    else if (vis->mobjflags & MF_TRANSLATION)
    {
	colfunc = R_DrawTranslatedColumn;
	dc_translation = translationtables - 256 +
	    ( (vis->mobjflags & MF_TRANSLATION) >> (MF_TRANSSHIFT-8) );
    }
	
    dc_iscale = abs(vis->xiscale)>>detailshift;
    dc_texturemid = vis->texturemid;
    frac = vis->startfrac;
    spryscale = vis->scale;
    sprtopscreen = centeryfrac - FixedMul(dc_texturemid,spryscale);
	
    for (dc_x=vis->x1 ; dc_x<=vis->x2 ; dc_x++, frac += vis->xiscale)
    {
	texturecolumn = frac>>FRACBITS;
#ifdef RANGECHECK
	if (texturecolumn < 0 || texturecolumn >= SHORT(patch->width))
	    I_Error ("R_DrawSpriteRange: bad texturecolumn");
#endif
	column = (column_t *) ((byte *)patch +
			       LONG(patch->columnofs[texturecolumn]));
	R_DrawMaskedColumn (column, ViewWindowBuffer/*DQ*/);
    }

    colfunc = basecolfunc;
}



//
// R_ProjectSprite
// Generates a vissprite for a thing
//  if it might be visible.
//
void R_ProjectSprite (mobj_t* thing)
{
    fixed_t		tr_x;
    fixed_t		tr_y;
    
    fixed_t		gxt;
    fixed_t		gyt;
    
    fixed_t		tx;
    fixed_t		tz;

    fixed_t		xscale;
    
    int			x1;
    int			x2;

    spritedef_t*	sprdef;
    spriteframe_t*	sprframe;
    int			lump;
    
    unsigned		rot;
    boolean		flip;
    
    int			index;

    vissprite_t*	vis;
    
    angle_t		ang;
    fixed_t		iscale;
    
    // transform the origin point
    tr_x = thing->x - viewx;
    tr_y = thing->y - viewy;
	
    gxt = FixedMul(tr_x,viewcos); 
    gyt = -FixedMul(tr_y,viewsin);
    
    tz = gxt-gyt; 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
中文字幕日韩精品一区| 日本一区二区三区久久久久久久久不 | 日韩国产精品久久久久久亚洲| 国产自产2019最新不卡| 欧美性大战xxxxx久久久| 精品国精品自拍自在线| 亚洲成人免费视频| 99国产一区二区三精品乱码| 精品国产凹凸成av人导航| 五月综合激情婷婷六月色窝| 色综合久久中文综合久久97| 欧美精品一区二区久久久 | 日本一区二区电影| 久久 天天综合| 制服丝袜亚洲精品中文字幕| 亚洲激情在线激情| 99视频在线观看一区三区| 欧美精品一区二区三区很污很色的| 亚洲国产成人高清精品| 色综合久久久久综合体| 国产精品视频九色porn| 国产一区二区三区免费在线观看| 欧美一区二区三区四区在线观看| 亚洲综合在线视频| 一本大道综合伊人精品热热| 亚洲人成小说网站色在线| 成人av网站在线| 中文子幕无线码一区tr| 国产v综合v亚洲欧| 国产精品狼人久久影院观看方式| 国产精品99久久久久久久女警| 亚洲精品一区二区三区福利| 国产资源在线一区| 久久久精品蜜桃| 国产精品乡下勾搭老头1| 国产性做久久久久久| 国产电影精品久久禁18| 国产精品国产三级国产普通话蜜臀| 国产黄人亚洲片| 中文字幕一区三区| 欧美亚洲禁片免费| 三级在线观看一区二区| 日韩一区二区三区四区五区六区| 美国三级日本三级久久99 | 国产成人午夜视频| 中文字幕在线免费不卡| 99久久国产综合色|国产精品| 亚洲欧美二区三区| 欧美剧在线免费观看网站 | 夜夜精品视频一区二区| 制服丝袜亚洲色图| 国产乱子伦视频一区二区三区 | 欧美一级黄色录像| 国产一区欧美一区| 国产精品久久久久三级| 欧美午夜一区二区三区免费大片| 日本怡春院一区二区| 久久综合色综合88| 99久久99精品久久久久久 | 欧美一级高清大全免费观看| 国产米奇在线777精品观看| 亚洲欧洲精品一区二区三区| 欧美日韩日日摸| 国产一二精品视频| 亚洲一区二区三区美女| 久久亚洲精品国产精品紫薇| 91在线观看成人| 蜜臀av一区二区| 亚洲视频1区2区| 日韩欧美亚洲另类制服综合在线| 国产xxx精品视频大全| 亚洲成av人在线观看| 欧美激情在线免费观看| 777色狠狠一区二区三区| 成人aa视频在线观看| 日韩电影在线观看电影| 国产精品久久久久桃色tv| 日韩情涩欧美日韩视频| 97久久精品人人做人人爽| 久久99热国产| 亚洲国产欧美一区二区三区丁香婷| 久久久综合九色合综国产精品| 欧洲一区在线电影| 处破女av一区二区| 美腿丝袜在线亚洲一区| 亚洲综合无码一区二区| 欧美国产乱子伦| 2024国产精品| 91精品国产综合久久国产大片| 不卡视频免费播放| 精品午夜一区二区三区在线观看| 亚洲成av人**亚洲成av**| 成人欧美一区二区三区视频网页 | 欧美区一区二区三区| 91丝袜美女网| 成人三级伦理片| 国产在线精品一区二区三区不卡| 天堂成人国产精品一区| 一区二区三区在线免费观看| 中文字幕人成不卡一区| 国产亲近乱来精品视频| 欧美精品一区二区久久婷婷| 日韩一卡二卡三卡四卡| 欧美美女网站色| 在线视频综合导航| 在线免费视频一区二区| 色88888久久久久久影院野外| 成人一级片在线观看| 国产精品影音先锋| 国产精品资源网站| 国产精品一二三| 国产不卡视频一区| 高清shemale亚洲人妖| 国产成人自拍网| 国产福利精品导航| 风间由美一区二区三区在线观看| 国产v日产∨综合v精品视频| 床上的激情91.| 北条麻妃一区二区三区| jlzzjlzz亚洲日本少妇| 99久久国产综合精品色伊| 色综合天天性综合| 色天天综合久久久久综合片| 欧美在线视频全部完| 欧美精选一区二区| 日韩欧美中文字幕公布| 久久一夜天堂av一区二区三区 | 日韩免费高清电影| 久久久久亚洲蜜桃| 国产精品无圣光一区二区| 亚洲欧美国产高清| 日韩精品一卡二卡三卡四卡无卡| 蜜桃av一区二区| 高清国产一区二区三区| 色香蕉成人二区免费| 欧美人与性动xxxx| 久久这里只有精品视频网| 国产精品国产a| 洋洋成人永久网站入口| 蓝色福利精品导航| www.成人网.com| 欧美日本乱大交xxxxx| 精品国产人成亚洲区| 成人欧美一区二区三区白人| 亚洲一区二区高清| 国产在线视频一区二区三区| 99久久伊人精品| 欧美区视频在线观看| 久久免费美女视频| 亚洲影视在线播放| 国产麻豆一精品一av一免费| 成人app软件下载大全免费| 精品视频资源站| 久久九九99视频| 亚洲1区2区3区4区| 丁香六月综合激情| 欧美一级二级三级乱码| 日韩一区中文字幕| 狠狠色丁香久久婷婷综合_中 | 国产自产视频一区二区三区| 色av一区二区| 久久久久久久久久久久久久久99| 亚洲午夜久久久久久久久电影网| 国产精品中文欧美| 91精品啪在线观看国产60岁| 中文字幕中文字幕一区二区| 久久精品国产亚洲aⅴ| 日本高清不卡在线观看| 国产日韩欧美精品电影三级在线| 天堂在线一区二区| 91麻豆国产福利精品| 国产校园另类小说区| 日韩国产欧美在线播放| 91丨porny丨蝌蚪视频| 久久九九99视频| 免费观看久久久4p| 欧美伦理影视网| 亚洲精品视频在线观看网站| 国产激情精品久久久第一区二区 | 欧美日韩专区在线| 综合精品久久久| 成人精品国产一区二区4080| 精品欧美乱码久久久久久 | 欧美成人激情免费网| 日韩黄色片在线观看| 日本精品一区二区三区四区的功能| 久久久www成人免费无遮挡大片| 日韩在线a电影| 制服丝袜国产精品| 亚洲国产精品久久久久秋霞影院| 99re成人在线| 亚洲丝袜美腿综合| 91老师片黄在线观看| 国产精品久久久久久户外露出| 国产凹凸在线观看一区二区| 国产校园另类小说区| 国产高清在线精品| 亚洲国产成人私人影院tom| 丰满白嫩尤物一区二区| 国产日产欧产精品推荐色|