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 + -
显示快捷键?