g_view.c

来自「著名物理引擎Hawk的源代码」· C语言 代码 · 共 157 行

C
157
字号
/* G_view.c, HAWK game engine
 *
 * Copyright 1997-1998 by Phil Frisbie, Jr.
 * for Hawk Software
 *
 */

#include "G_main.h"
#include "G_math.h"

#define E_FADEIN	30

void viewAddBlend (float r, float g, float b, float a, float *v_blend)
{
	float	a2, a3;

	if (a <= 0)
		return;
	a2 = v_blend[3] + (1-v_blend[3])*a;	/* new total alpha */
	a3 = v_blend[3]/a2;		/* fraction of color from old */

	v_blend[R] = v_blend[0]*a3 + r*(1-a3);
	v_blend[G] = v_blend[1]*a3 + g*(1-a3);
	v_blend[B] = v_blend[2]*a3 + b*(1-a3);
	v_blend[A] = a2;
}

/* effects that need to be done for each view seperately */

void G_viewUpdateView(VIEW *view)
{
	OBJECT	*obj = view->object;
	float	angle = view->angle / 2;
	float	pitch = obj->pitch;
	float	temp;
	int		contents;
	
	if(pitch > 89)
		pitch = 89;
	if(pitch < -89)
		pitch = -89;
	if(view->type&V_REAR)
		pitch = -pitch;

	if(view->type&V_EXTERNAL)/* 3rd person view */
	{
		pitch = -20.0f;
		view->look[X] = cos(RAD(obj->angles[Z] + view->hangle));
		view->look[Y] = sin(RAD(obj->angles[Z] + view->hangle));
		temp = cos(RAD(pitch));
		view->look[X] *= temp;
		view->look[Y] *= temp;
		view->look[Z] = sin(RAD(pitch));
		VectorNormalize(view->look, view->look);
		view->cam[X] = obj->origin[X] - 100.0f * view->look[X];
		view->cam[Y] = obj->origin[Y] - 100.0f * view->look[Y];
		view->cam[Z] = obj->origin[Z] + 60.0f;

		/* the left view clipping plane */
		view->clipl[X] = cos(RAD(obj->angles[Z] + view->hangle - 89 + angle));
		view->clipl[Y] = sin(RAD(obj->angles[Z] + view->hangle - 89 + angle));
		view->clipl[Z] = sin(RAD(pitch));
		VectorNormalize(view->clipl, view->clipl);

		/* the right view clipping plane */
		view->clipr[X] = cos(RAD(obj->angles[Z] + view->hangle + 89 - angle));
		view->clipr[Y] = sin(RAD(obj->angles[Z] + view->hangle + 89 - angle));
		view->clipr[Z] = sin(RAD(pitch));
		VectorNormalize(view->clipr, view->clipr);

		/* the bottom view clipping plane */
		view->clipb[X] = cos(RAD(obj->angles[Z] + view->hangle));
		view->clipb[Y] = sin(RAD(obj->angles[Z] + view->hangle));
		view->clipb[Z] = sin(RAD(pitch + 89 - angle));
		VectorNormalize(view->clipb, view->clipb);

		/* the top view clipping plane */
		view->clipt[X] = cos(RAD(obj->angles[Z] + view->hangle));
		view->clipt[Y] = sin(RAD(obj->angles[Z] + view->hangle));
		view->clipt[Z] = sin(RAD(pitch - 89 + angle));
		VectorNormalize(view->clipt, view->clipt);

		/* set the view blend effect */
		/* clear the blend */
		view->blendcolor[0] = 0.0;
		view->blendcolor[1] = 0.0;
		view->blendcolor[2] = 0.0;
		view->blendcolor[3] = 0.0;
		view->needblend = FALSE;
	}
	else/* normal view */
	{
		view->cam[X] = obj->origin[X];
		view->cam[Y] = obj->origin[Y];
		view->cam[Z] = obj->origin[Z] + obj->maxs[Z] - 10;
		view->look[X] = cos(RAD(obj->angles[Z] + view->hangle));
		view->look[Y] = sin(RAD(obj->angles[Z] + view->hangle));
		temp = cos(RAD(pitch));
		view->look[X] *= temp;
		view->look[Y] *= temp;
		view->look[Z] = sin(RAD(pitch));
		VectorNormalize(view->look, view->look);

		/* the left view clipping plane */
		view->clipl[X] = cos(RAD(obj->angles[Z] + view->hangle - 89 + angle));
		view->clipl[Y] = sin(RAD(obj->angles[Z] + view->hangle - 89 + angle));
		view->clipl[Z] = sin(RAD(pitch));
		VectorNormalize(view->clipl, view->clipl);

		/* the right view clipping plane */
		view->clipr[X] = cos(RAD(obj->angles[Z] + view->hangle + 89 - angle));
		view->clipr[Y] = sin(RAD(obj->angles[Z] + view->hangle + 89 - angle));
		view->clipr[Z] = sin(RAD(pitch));
		VectorNormalize(view->clipr, view->clipr);

		/* the bottom view clipping plane */
		view->clipb[X] = cos(RAD(obj->angles[Z] + view->hangle));
		view->clipb[Y] = sin(RAD(obj->angles[Z] + view->hangle));
		view->clipb[Z] = sin(RAD(pitch + 89 - angle));
		VectorNormalize(view->clipb, view->clipb);

		/* the top view clipping plane */
		view->clipt[X] = cos(RAD(obj->angles[Z] + view->hangle));
		view->clipt[Y] = sin(RAD(obj->angles[Z] + view->hangle));
		view->clipt[Z] = sin(RAD(pitch - 89 + angle));
		VectorNormalize(view->clipt, view->clipt);

		if(view->type&V_REAR)
			return;

		/* set the view blend effect */
		/* clear the blend */
		view->blendcolor[0] = 0.0;
		view->blendcolor[1] = 0.0;
		view->blendcolor[2] = 0.0;
		view->blendcolor[3] = 0.0;
		view->needblend = FALSE;

		contents = gi.Pointcontents(view->cam);

		if(contents&CONTENTS_WATER)
		{
			viewAddBlend(0.5, 0.3, 0.2, 0.5, view->blendcolor);
			view->needblend = TRUE;
		}
		else if(contents&CONTENTS_SLIME)
		{
			viewAddBlend(0.0, 0.1, 0.05, 0.6, view->blendcolor);
			view->needblend = TRUE;
		}
		else if(contents&(CONTENTS_SOLID|CONTENTS_LAVA))
		{
			viewAddBlend(1.0, 0.3, 0.0, 0.6, view->blendcolor);
			view->needblend = TRUE;
		}
	}
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?