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

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

?? r_part.c

?? 著名游戲quake2原代碼最新版本(vc6.0可以編譯的)
?? C
?? 第 1 頁 / 共 2 頁
字號:
/*
Copyright (C) 1997-2001 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.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

*/
#include "r_local.h"

vec3_t r_pright, r_pup, r_ppn;

#define PARTICLE_33     0
#define PARTICLE_66     1
#define PARTICLE_OPAQUE 2

typedef struct
{
	particle_t *particle;
	int         level;
	int         color;
} partparms_t;

static partparms_t partparms;

#if id386 && !defined __linux__

static unsigned s_prefetch_address;

/*
** BlendParticleXX
**
** Inputs:
** EAX = color
** EDI = pdest
**
** Scratch:
** EBX = scratch (dstcolor)
** EBP = scratch
**
** Outputs:
** none
*/
__declspec(naked) void BlendParticle33( void )
{
	//	return vid.alphamap[color + dstcolor*256];
	__asm mov ebp, vid.alphamap
	__asm xor ebx, ebx

	__asm mov bl,  byte ptr [edi]
	__asm shl ebx, 8

	__asm add ebp, ebx
	__asm add ebp, eax

	__asm mov al,  byte ptr [ebp]

	__asm mov byte ptr [edi], al

	__asm ret
}

__declspec(naked) void BlendParticle66( void )
{
	//	return vid.alphamap[pcolor*256 + dstcolor];
	__asm mov ebp, vid.alphamap
	__asm xor ebx, ebx

	__asm shl eax,  8
	__asm mov bl,   byte ptr [edi]

	__asm add ebp, ebx
	__asm add ebp, eax

	__asm mov al,  byte ptr [ebp]

	__asm mov byte ptr [edi], al

	__asm ret
}

__declspec(naked) void BlendParticle100( void )
{
	__asm mov byte ptr [edi], al
	__asm ret
}

/*
** R_DrawParticle (asm version)
**
** Since we use __declspec( naked ) we don't have a stack frame
** that we can use.  Since I want to reserve EBP anyway, I tossed
** all the important variables into statics.  This routine isn't
** meant to be re-entrant, so this shouldn't cause any problems
** other than a slightly higher global memory footprint.
**
*/
__declspec(naked) void R_DrawParticle( void )
{
	static vec3_t	local, transformed;
	static float	zi;
	static int      u, v, tmp;
	static short    izi;
	static int      ebpsave;

	static byte (*blendfunc)(void);

	/*
	** must be memvars since x86 can't load constants
	** directly.  I guess I could use fld1, but that
	** actually costs one more clock than fld [one]!
	*/
	static float    particle_z_clip    = PARTICLE_Z_CLIP;
	static float    one                = 1.0F;
	static float    point_five         = 0.5F;
	static float    eight_thousand_hex = 0x8000;

	/*
	** save trashed variables
	*/
	__asm mov  ebpsave, ebp
	__asm push esi
	__asm push edi

	/*
	** transform the particle
	*/
	// VectorSubtract (pparticle->origin, r_origin, local);
	__asm mov  esi, partparms.particle
	__asm fld  dword ptr [esi+0]          ; p_o.x
	__asm fsub dword ptr [r_origin+0]     ; p_o.x-r_o.x
	__asm fld  dword ptr [esi+4]          ; p_o.y | p_o.x-r_o.x
	__asm fsub dword ptr [r_origin+4]     ; p_o.y-r_o.y | p_o.x-r_o.x
	__asm fld  dword ptr [esi+8]          ; p_o.z | p_o.y-r_o.y | p_o.x-r_o.x
	__asm fsub dword ptr [r_origin+8]     ; p_o.z-r_o.z | p_o.y-r_o.y | p_o.x-r_o.x
	__asm fxch st(2)                      ; p_o.x-r_o.x | p_o.y-r_o.y | p_o.z-r_o.z
	__asm fstp dword ptr [local+0]        ; p_o.y-r_o.y | p_o.z-r_o.z
	__asm fstp dword ptr [local+4]        ; p_o.z-r_o.z
	__asm fstp dword ptr [local+8]        ; (empty)

	// transformed[0] = DotProduct(local, r_pright);
	// transformed[1] = DotProduct(local, r_pup);
	// transformed[2] = DotProduct(local, r_ppn);
	__asm fld  dword ptr [local+0]        ; l.x
	__asm fmul dword ptr [r_pright+0]     ; l.x*pr.x
	__asm fld  dword ptr [local+4]        ; l.y | l.x*pr.x
	__asm fmul dword ptr [r_pright+4]     ; l.y*pr.y | l.x*pr.x
	__asm fld  dword ptr [local+8]        ; l.z | l.y*pr.y | l.x*pr.x
	__asm fmul dword ptr [r_pright+8]     ; l.z*pr.z | l.y*pr.y | l.x*pr.x
	__asm fxch st(2)                      ; l.x*pr.x | l.y*pr.y | l.z*pr.z
	__asm faddp st(1), st                 ; l.x*pr.x + l.y*pr.y | l.z*pr.z
	__asm faddp st(1), st                 ; l.x*pr.x + l.y*pr.y + l.z*pr.z
	__asm fstp  dword ptr [transformed+0] ; (empty)

	__asm fld  dword ptr [local+0]        ; l.x
	__asm fmul dword ptr [r_pup+0]        ; l.x*pr.x
	__asm fld  dword ptr [local+4]        ; l.y | l.x*pr.x
	__asm fmul dword ptr [r_pup+4]        ; l.y*pr.y | l.x*pr.x
	__asm fld  dword ptr [local+8]        ; l.z | l.y*pr.y | l.x*pr.x
	__asm fmul dword ptr [r_pup+8]        ; l.z*pr.z | l.y*pr.y | l.x*pr.x
	__asm fxch st(2)                      ; l.x*pr.x | l.y*pr.y | l.z*pr.z
	__asm faddp st(1), st                 ; l.x*pr.x + l.y*pr.y | l.z*pr.z
	__asm faddp st(1), st                 ; l.x*pr.x + l.y*pr.y + l.z*pr.z
	__asm fstp  dword ptr [transformed+4] ; (empty)

	__asm fld  dword ptr [local+0]        ; l.x
	__asm fmul dword ptr [r_ppn+0]        ; l.x*pr.x
	__asm fld  dword ptr [local+4]        ; l.y | l.x*pr.x
	__asm fmul dword ptr [r_ppn+4]        ; l.y*pr.y | l.x*pr.x
	__asm fld  dword ptr [local+8]        ; l.z | l.y*pr.y | l.x*pr.x
	__asm fmul dword ptr [r_ppn+8]        ; l.z*pr.z | l.y*pr.y | l.x*pr.x
	__asm fxch st(2)                      ; l.x*pr.x | l.y*pr.y | l.z*pr.z
	__asm faddp st(1), st                 ; l.x*pr.x + l.y*pr.y | l.z*pr.z
	__asm faddp st(1), st                 ; l.x*pr.x + l.y*pr.y + l.z*pr.z
	__asm fstp  dword ptr [transformed+8] ; (empty)

	/*
	** make sure that the transformed particle is not in front of
	** the particle Z clip plane.  We can do the comparison in 
	** integer space since we know the sign of one of the inputs
	** and can figure out the sign of the other easily enough.
	*/
	//	if (transformed[2] < PARTICLE_Z_CLIP)
	//		return;

	__asm mov  eax, dword ptr [transformed+8]
	__asm and  eax, eax
	__asm js   end
	__asm cmp  eax, particle_z_clip
	__asm jl   end

	/*
	** project the point by initiating the 1/z calc
	*/
	//	zi = 1.0 / transformed[2];
	__asm fld   one
	__asm fdiv  dword ptr [transformed+8]

	/*
	** bind the blend function pointer to the appropriate blender
	** while we're dividing
	*/
	//if ( level == PARTICLE_33 )
	//	blendparticle = BlendParticle33;
	//else if ( level == PARTICLE_66 )
	//	blendparticle = BlendParticle66;
	//else 
	//	blendparticle = BlendParticle100;

	__asm cmp partparms.level, PARTICLE_66
	__asm je  blendfunc_66
	__asm jl  blendfunc_33
	__asm lea ebx, BlendParticle100
	__asm jmp done_selecting_blend_func
blendfunc_33:
	__asm lea ebx, BlendParticle33
	__asm jmp done_selecting_blend_func
blendfunc_66:
	__asm lea ebx, BlendParticle66
done_selecting_blend_func:
	__asm mov blendfunc, ebx

	// prefetch the next particle
	__asm mov ebp, s_prefetch_address
	__asm mov ebp, [ebp]

	// finish the above divide
	__asm fstp  zi

	// u = (int)(xcenter + zi * transformed[0] + 0.5);
	// v = (int)(ycenter - zi * transformed[1] + 0.5);
	__asm fld   zi                           ; zi
	__asm fmul  dword ptr [transformed+0]    ; zi * transformed[0]
	__asm fld   zi                           ; zi | zi * transformed[0]
	__asm fmul  dword ptr [transformed+4]    ; zi * transformed[1] | zi * transformed[0]
	__asm fxch  st(1)                        ; zi * transformed[0] | zi * transformed[1]
	__asm fadd  xcenter                      ; xcenter + zi * transformed[0] | zi * transformed[1]
	__asm fxch  st(1)                        ; zi * transformed[1] | xcenter + zi * transformed[0]
	__asm fld   ycenter                      ; ycenter | zi * transformed[1] | xcenter + zi * transformed[0]
    __asm fsubrp st(1), st(0)                ; ycenter - zi * transformed[1] | xcenter + zi * transformed[0]
  	__asm fxch  st(1)                        ; xcenter + zi * transformed[0] | ycenter + zi * transformed[1]
  	__asm fadd  point_five                   ; xcenter + zi * transformed[0] + 0.5 | ycenter - zi * transformed[1]
  	__asm fxch  st(1)                        ; ycenter - zi * transformed[1] | xcenter + zi * transformed[0] + 0.5 
  	__asm fadd  point_five                   ; ycenter - zi * transformed[1] + 0.5 | xcenter + zi * transformed[0] + 0.5 
  	__asm fxch  st(1)                        ; u | v
  	__asm fistp dword ptr [u]                ; v
  	__asm fistp dword ptr [v]                ; (empty)

	/*
	** clip out the particle
	*/

	//	if ((v > d_vrectbottom_particle) || 
	//		(u > d_vrectright_particle) ||
	//		(v < d_vrecty) ||
	//		(u < d_vrectx))
	//	{
	//		return;
	//	}

	__asm mov ebx, u
	__asm mov ecx, v
	__asm cmp ecx, d_vrectbottom_particle
	__asm jg  end
	__asm cmp ecx, d_vrecty
	__asm jl  end
	__asm cmp ebx, d_vrectright_particle
	__asm jg  end
	__asm cmp ebx, d_vrectx
	__asm jl  end

	/*
	** compute addresses of zbuffer, framebuffer, and 
	** compute the Z-buffer reference value.
	**
	** EBX      = U
	** ECX      = V
	**
	** Outputs:
	** ESI = Z-buffer address
	** EDI = framebuffer address
	*/
	// ESI = d_pzbuffer + (d_zwidth * v) + u;
	__asm mov esi, d_pzbuffer             ; esi = d_pzbuffer
	__asm mov eax, d_zwidth               ; eax = d_zwidth
	__asm mul ecx                         ; eax = d_zwidth*v
	__asm add eax, ebx                    ; eax = d_zwidth*v+u
	__asm shl eax, 1                      ; eax = 2*(d_zwidth*v+u)
	__asm add esi, eax                    ; esi = ( short * ) ( d_pzbuffer + ( d_zwidth * v ) + u )

	// initiate
	// izi = (int)(zi * 0x8000);
	__asm fld  zi
	__asm fmul eight_thousand_hex

	// EDI = pdest = d_viewbuffer + d_scantable[v] + u;
	__asm lea edi, [d_scantable+ecx*4]
	__asm mov edi, [edi]
	__asm add edi, d_viewbuffer
	__asm add edi, ebx

	// complete
	// izi = (int)(zi * 0x8000);
	__asm fistp tmp
	__asm mov   eax, tmp
	__asm mov   izi, ax

	/*
	** determine the screen area covered by the particle,

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩一区在线播放| 欧美色区777第一页| 日韩一级片网址| 久久久久久久网| 精品一区二区三区在线视频| 欧美国产欧美亚州国产日韩mv天天看完整 | 这里只有精品电影| 一区二区三区中文在线| 国产精品91一区二区| 久久综合九色综合97婷婷| 毛片av中文字幕一区二区| 这里只有精品免费| 日日噜噜夜夜狠狠视频欧美人 | 欧美大片在线观看一区| 婷婷久久综合九色国产成人| 欧美日韩视频一区二区| 一区2区3区在线看| 91国产福利在线| 午夜精品久久久久影视| 4438x成人网最大色成网站| 日韩av一级电影| 欧美tk—视频vk| 国产盗摄女厕一区二区三区| 国产精品美女www爽爽爽| 麻豆成人久久精品二区三区红| 日韩欧美的一区| 狠狠久久亚洲欧美| 久久久国产精品不卡| 成年人午夜久久久| 亚洲国产精品av| 色综合久久综合| 婷婷成人综合网| 久久久综合九色合综国产精品| 欧美aⅴ一区二区三区视频| 欧美亚男人的天堂| 久久精品国产一区二区| 国产欧美一区二区精品性| 99视频有精品| 三级影片在线观看欧美日韩一区二区| 国产欧美综合在线| 色先锋aa成人| 久久成人18免费观看| 国产精品免费视频网站| 欧美在线免费播放| 久久狠狠亚洲综合| 国产精品久久久久久久久免费相片 | 久久99国产精品免费网站| 国产视频一区在线播放| 91论坛在线播放| 蜜桃视频一区二区三区| 中文字幕在线一区| 欧美一区二区三区视频| 成人免费精品视频| 日本在线播放一区二区三区| 国产女主播视频一区二区| 欧美色视频在线观看| 美女视频一区二区三区| 中文字幕亚洲不卡| 欧美人牲a欧美精品| www国产亚洲精品久久麻豆| 成人免费va视频| 免费三级欧美电影| 国产精品超碰97尤物18| 日韩一区二区免费电影| 99精品国产视频| 中文字幕一区二区三区不卡在线| 制服.丝袜.亚洲.另类.中文| 91丨国产丨九色丨pron| 黑人巨大精品欧美黑白配亚洲| 亚洲午夜免费视频| 中文字幕乱码久久午夜不卡| 欧美成人一区二区三区| 欧美视频一区在线| 福利一区在线观看| 亚洲欧洲日产国码二区| 欧美zozozo| 3d成人h动漫网站入口| 成人精品国产一区二区4080| 激情av综合网| 蜜桃精品视频在线| 亚洲国产欧美另类丝袜| 国产精品久久久久久亚洲伦 | 日韩欧美成人一区| 欧美性生活久久| 一本大道av一区二区在线播放| 成人精品鲁一区一区二区| 麻豆成人免费电影| 国产一区二区三区在线看麻豆| 免费在线观看一区| 日韩av一级片| 蜜桃av一区二区| 天堂精品中文字幕在线| 亚洲成人av电影在线| 亚洲一二三区在线观看| 亚洲国产视频一区| 国产在线观看一区二区| 综合自拍亚洲综合图不卡区| 亚洲人成7777| 亚洲国产欧美日韩另类综合 | 制服丝袜日韩国产| 欧美电影免费观看高清完整版在线 | 精品国产伦一区二区三区免费| 国产偷国产偷精品高清尤物| 国产精品传媒视频| 午夜不卡av免费| 国产麻豆9l精品三级站| av综合在线播放| 制服丝袜亚洲精品中文字幕| 久久久另类综合| 亚洲激情校园春色| 欧美日韩国产天堂| 日韩一区二区三区四区| 国产欧美综合在线| 亚洲国产va精品久久久不卡综合| 美脚の诱脚舐め脚责91| 成人毛片视频在线观看| 在线不卡a资源高清| 中文乱码免费一区二区| 日本伊人精品一区二区三区观看方式| 国产福利一区二区三区视频在线| 欧美性受xxxx黑人xyx| 国产欧美va欧美不卡在线| 午夜精品成人在线视频| 成人免费视频视频在线观看免费 | 亚洲男同性视频| 日本91福利区| 色婷婷精品大在线视频| 欧美www视频| 亚洲成人免费av| 不卡区在线中文字幕| 日韩亚洲欧美在线| 亚洲柠檬福利资源导航| 国产精品一线二线三线精华| 欧美日韩色综合| 国产精品福利一区二区| 国模无码大尺度一区二区三区| 欧美日韩国产免费一区二区| 成人免费一区二区三区在线观看| 六月丁香综合在线视频| 欧美色图第一页| 亚洲精品视频在线看| 激情六月婷婷久久| 制服.丝袜.亚洲.中文.综合| 亚洲美女视频在线| 成人污视频在线观看| 精品美女一区二区三区| 日韩激情视频网站| 欧美三级乱人伦电影| 亚洲欧美另类在线| 成人免费精品视频| 久久久青草青青国产亚洲免观| 日av在线不卡| 91精品国产手机| 性久久久久久久久久久久| 色8久久精品久久久久久蜜| 中文字幕一区日韩精品欧美| 国产成人av福利| 久久久精品黄色| 国产乱国产乱300精品| 精品少妇一区二区三区在线播放| 七七婷婷婷婷精品国产| 欧美日韩久久不卡| 亚洲成人精品在线观看| 在线视频亚洲一区| 亚洲精品午夜久久久| 日本高清视频一区二区| 亚洲视频一区二区在线| 一本色道综合亚洲| 亚洲情趣在线观看| 色婷婷久久久亚洲一区二区三区| 亚洲欧洲制服丝袜| 91麻豆成人久久精品二区三区| 一区二区三区中文字幕在线观看| 91麻豆国产自产在线观看| 亚洲欧美国产高清| 99re在线视频这里只有精品| 国产女人18水真多18精品一级做| 福利一区二区在线| 综合久久给合久久狠狠狠97色 | 制服丝袜激情欧洲亚洲| 日本午夜精品视频在线观看| 日韩欧美一区二区视频| 国产麻豆成人传媒免费观看| 欧美激情在线免费观看| 99国产欧美另类久久久精品| 亚洲精品国产精品乱码不99 | 欧美一区二区三区四区在线观看| 日韩精品乱码免费| 日韩欧美一级二级三级| 国产真实乱子伦精品视频| 国产精品毛片高清在线完整版 | 日韩电影网1区2区| 精品精品欲导航| 成人a区在线观看| 亚洲午夜电影网| 久久综合久久综合久久综合| 99久久精品免费看| 日韩成人dvd| 国产欧美精品一区二区三区四区 | 欧美成人猛片aaaaaaa|