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

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

?? bspline.cpp

?? this keik game source
?? CPP
字號:
//-----------------------------------------------------------------------------
//
//  $Logfile:: /Quake 2 Engine/Sin/code/game/bspline.cpp                      $
// $Revision:: 12                                                             $
//   $Author:: Jimdose                                                        $
//     $Date:: 10/19/98 9:51p                                                 $
//
// Copyright (C) 1998 by Ritual Entertainment, Inc.
// All rights reserved.
//
// This source is may not be distributed and/or modified without
// expressly written permission by Ritual Entertainment, Inc.
//
// $Log:: /Quake 2 Engine/Sin/code/game/bspline.cpp                           $
// 
// 12    10/19/98 9:51p Jimdose
// fixed savegame bugs with bspline
// 
// 11    10/10/98 9:12p Markd
// Fixed angle errors with bsplines
// 
// 10    8/15/98 2:39p Markd
// fixed up some bspline stuff
// 
// 9     7/11/98 6:31p Markd
// removed valid orientation, simplified code
// 
// 8     7/10/98 1:11p Markd
// Added additional two paramter append control point
// 
// 7     7/08/98 12:41p Markd
// Added speed and quaternion support
// 
// 6     7/02/98 9:48p Markd
// added orientation
// 
// 5     5/26/98 7:55p Jimdose
// Added Drawcurve with offset
// 
// 4     5/07/98 10:40p Jimdose
// Added spline type for selecting between looping and non-looping curves
// 
// 3     5/05/98 2:37p Jimdose
// Added code to allow spline loop and clamping the spline start and end
// 
// 2     5/03/98 4:42p Jimdose
// Added file to Sin
//
// DESCRIPTION:
// Uniform non-rational bspline class.
// 

#include "g_local.h"
#include "BSpline.h"

void BSpline::Set
	(
	Vector *control_points_,
	int num_control_points_,
	splinetype_t type
	)

	{
	int i;

	SetType( type );

   has_orientation = false;

	if ( control_points )
		{
		delete [] control_points;
		control_points = NULL;
		}

	num_control_points = num_control_points_;
	if ( num_control_points )
		{
		control_points = new BSplineControlPoint[ num_control_points ];
		assert( control_points );

		for( i = 0; i < num_control_points; i++ )
			{
			control_points[ i ].Set( control_points_[ i ] );
			}
		}
	}

void BSpline::Set
	(
	Vector *control_points_,
	Vector *control_orients_,
   float  *control_speeds_,
	int num_control_points_,
	splinetype_t type
	)

	{
	int i;

	SetType( type );

   has_orientation = true;

	if ( control_points )
		{
		delete [] control_points;
		control_points = NULL;
		}

	num_control_points = num_control_points_;
	if ( num_control_points )
		{
		control_points = new BSplineControlPoint[ num_control_points ];
		assert( control_points );

		for( i = 0; i < num_control_points; i++ )
			{
			control_points[ i ].Set( control_points_[ i ], control_orients_[ i ], control_speeds_[ i ] );
			}
		}
	}

void BSpline::Clear
	(
	void
	)

	{
	if( control_points )
		{
		delete [] control_points;
		control_points = NULL;
		}
	num_control_points = 0;
   has_orientation = false;
	}

inline float BSpline::EvalNormal
	(
	float u,
   Vector& pos,
   Vector& orient
	)

	{
	int		segment_id;
	float		B[ 4 ];
	float		tmp;
	float		u_2;
	float		u_3;
   Vector   ang;
   float    roll;
   float    speed;

	segment_id = ( int )u;
	if ( segment_id < 0 )
		{
		segment_id = 0;
		}
	if ( segment_id > num_control_points - 4 )
		{
		segment_id = num_control_points - 4;
		}
	u -= ( float )segment_id;

	u_2 = u * u;
	u_3 = u * u_2;

	tmp = 1 - u;
	B[ 0 ] = ( tmp * tmp * tmp ) * ( 1.0f / 6.0f );
	B[ 1 ] = ( 3.0f * u_3 - 6.0f * u_2 + 4.0f ) * ( 1.0f / 6.0f );
	B[ 2 ] = ( -3.0f * u_3 + 3.0f * u_2 + 3.0f * u + 1 ) * ( 1.0f / 6.0f );
	B[ 3 ] = u_3 * ( 1.0f / 6.0f );

	pos = 
		*control_points[ 0 + segment_id ].GetPosition() * B[ 0 ] +
		*control_points[ 1 + segment_id ].GetPosition() * B[ 1 ] +
		*control_points[ 2 + segment_id ].GetPosition() * B[ 2 ] +
		*control_points[ 3 + segment_id ].GetPosition() * B[ 3 ];

	ang = 
		*control_points[ 0 + segment_id ].GetOrientation() * B[ 0 ] +
		*control_points[ 1 + segment_id ].GetOrientation() * B[ 1 ] +
		*control_points[ 2 + segment_id ].GetOrientation() * B[ 2 ] +
		*control_points[ 3 + segment_id ].GetOrientation() * B[ 3 ];

	roll = 
		*control_points[ 0 + segment_id ].GetRoll() * B[ 0 ] +
		*control_points[ 1 + segment_id ].GetRoll() * B[ 1 ] +
		*control_points[ 2 + segment_id ].GetRoll() * B[ 2 ] +
		*control_points[ 3 + segment_id ].GetRoll() * B[ 3 ];

	speed = 
		*control_points[ 0 + segment_id ].GetSpeed() * B[ 0 ] +
		*control_points[ 1 + segment_id ].GetSpeed() * B[ 1 ] +
		*control_points[ 2 + segment_id ].GetSpeed() * B[ 2 ] +
		*control_points[ 3 + segment_id ].GetSpeed() * B[ 3 ];

   orient = ang.toAngles();
   orient[ ROLL ] = roll;

   return speed;
	}

inline float BSpline::EvalLoop
	(
	float t,
   Vector& pos,
   Vector& orient
	)

	{
	Vector	retval;
   Vector   ang;
   float    speed;
   float    roll;
	int		segment_id;
   int      next_id;
	float		B[ 4 ];
	float		tmp;
	float		u;
	float		u_2;
	float		u_3;
	int		i;
	int		j;

	segment_id = ( int )floor( t );
	u = t - floor( t );

	segment_id %= num_control_points;
	if ( segment_id < 0 )
		{
		segment_id += num_control_points;
		}

	u_2 = u * u;
	u_3 = u * u_2;

	tmp = 1 - u;
	B[ 0 ] = ( tmp * tmp * tmp ) * ( 1.0f / 6.0f );
	B[ 1 ] = ( 3.0f * u_3 - 6.0f * u_2 + 4.0f ) * ( 1.0f / 6.0f );
	B[ 2 ] = ( -3.0f * u_3 + 3.0f * u_2 + 3.0f * u + 1 ) * ( 1.0f / 6.0f );
	B[ 3 ] = u_3 * ( 1.0f / 6.0f );

   speed = 0;
   roll = 0;

	for( i = 0, j = segment_id; i < 4; i++, j++ )
		{
		if ( j >= num_control_points )
			{
			j -= ( num_control_points - loop_control_point );
			}

		retval += *control_points[ j ].GetPosition() * B[ i ];
		ang += *control_points[ j ].GetOrientation() * B[ i ];
	   speed += *control_points[ j ].GetSpeed() * B[ i ];
	   roll += *control_points[ j ].GetRoll() * B[ i ];
		}

   pos = retval;

   next_id = segment_id + 1;
	if ( next_id >= num_control_points )
		{
		next_id -= ( num_control_points - loop_control_point );
		}
   orient = ang.toAngles();
   orient[ ROLL ] = roll;

   return speed;
	}

inline float BSpline::EvalClamp
	(
	float t,
   Vector& pos,
   Vector& orient
	)

	{
	Vector	retval;
   Vector   ang;
	int		segment_id;
	int		next_id;
	float		B[ 4 ];
	float		tmp;
	float		u;
	float		u_2;
	float		u_3;
	int		i;
	int		j;
   float    speed;
   float    roll;

	segment_id = ( int )floor( t );
	u = t - floor( t );

	u_2 = u * u;
	u_3 = u * u_2;

	tmp = 1 - u;
	B[ 0 ] = ( tmp * tmp * tmp ) * ( 1.0f / 6.0f );
	B[ 1 ] = ( 3.0f * u_3 - 6.0f * u_2 + 4.0f ) * ( 1.0f / 6.0f );
	B[ 2 ] = ( -3.0f * u_3 + 3.0f * u_2 + 3.0f * u + 1 ) * ( 1.0f / 6.0f );
	B[ 3 ] = u_3 * ( 1.0f / 6.0f );

   speed = 0;
   roll = 0;
	for( i = 0; i < 4; i++, segment_id++ )
		{
		j = segment_id;
		if ( j < 0 )
			{
			j = 0;
			}
		else if ( j >= num_control_points )
			{
			j = num_control_points - 1;
			}

		retval += *control_points[ j ].GetPosition() * B[ i ];
		ang += *control_points[ j ].GetOrientation() * B[ i ];
	   speed += *control_points[ j ].GetSpeed() * B[ i ];
	   roll += *control_points[ j ].GetRoll() * B[ i ];
		}

   pos = retval;

   next_id = segment_id + 1;
   if ( segment_id < 0 )
      {
      segment_id = 0;
      }
	if ( segment_id >= num_control_points )
		{
	   segment_id = num_control_points - 1;
		}
   if ( next_id < 0 )
      {
      next_id = 0;
      }
	if ( next_id >= num_control_points )
		{
	   next_id = num_control_points - 1;
		}
   orient = ang.toAngles();
   orient[ ROLL ] = roll;

   return speed;
	}


Vector BSpline::Eval
	(
	float u
	)

	{
   Vector pos;
   Vector orient;

	switch( curvetype )
		{
		default:
		case SPLINE_NORMAL :
         EvalNormal( u, pos, orient );
			break;

		case SPLINE_CLAMP:
         EvalClamp( u, pos, orient );
			break;

		case SPLINE_LOOP:
         EvalLoop( u, pos, orient );
			break;
		}
   return pos;
	}

float BSpline::Eval
	(
	float u,
   Vector &pos,
   Vector &orient
	)

	{
	switch( curvetype )
		{
		default:
		case SPLINE_NORMAL :
         return EvalNormal( u, pos, orient );
			break;

		case SPLINE_CLAMP:
         return EvalClamp( u, pos, orient );
			break;

		case SPLINE_LOOP:
         return EvalLoop( u, pos, orient );
			break;
		}
	}

void BSpline::DrawControlSegments
	(
	void
	)

	{
	int i;

	G_BeginLine();
	for( i = 0; i < num_control_points; i++ )
		{
		G_Vertex( *control_points[ i ].GetPosition() );
		}
	G_EndLine();
	}

void BSpline::DrawCurve
	(
	int num_subdivisions
	)

	{
	float u;
	float du;

	du = 1.0f / ( float )num_subdivisions; 

	G_BeginLine();
	for( u = 0.0f; u <= ( float )num_control_points; u += du )
		{
		G_Vertex( ( Vector )Eval( u ) );
		}
	G_EndLine();
	}

void BSpline::DrawCurve
	(
	Vector offset,
	int num_subdivisions
	)

	{
	float u;
	float du;

	du = 1.0f / ( float )num_subdivisions; 

	G_BeginLine();
	for( u = 0.0f; u <= ( float )num_control_points; u += du )
		{
		G_Vertex( offset + ( Vector )Eval( u ) );
		}
	G_EndLine();
	}

void BSpline::AppendControlPoint
	(
	const Vector& new_control_point
	)

	{
	BSplineControlPoint *old_control_points;
	int i;

	old_control_points = control_points;
	num_control_points++;

	control_points = new BSplineControlPoint[num_control_points];
	assert( control_points );

	if ( old_control_points )
		{
		for( i = 0; i < num_control_points - 1; i++ )
			{
			control_points[ i ] = old_control_points[ i ];
			}
		delete [] old_control_points;
		}

	control_points[ num_control_points - 1 ].Set( new_control_point );
	}

void BSpline::AppendControlPoint
	(
	const Vector& new_control_point,
   const float& speed
	)

	{
	BSplineControlPoint *old_control_points;
	int i;

	old_control_points = control_points;
	num_control_points++;

	control_points = new BSplineControlPoint[num_control_points];
	assert( control_points );

	if ( old_control_points )
		{
		for( i = 0; i < num_control_points - 1; i++ )
			{
			control_points[ i ] = old_control_points[ i ];
			}
		delete [] old_control_points;
		}

	control_points[ num_control_points - 1 ].Set( new_control_point, speed );
	}

void BSpline::AppendControlPoint
	(
	const Vector& new_control_point,
   const Vector& new_control_orient,
   const float& new_control_speed
	)

	{
	BSplineControlPoint *old_control_points;
	int i;

   has_orientation = true;

	old_control_points = control_points;
	num_control_points++;

	control_points = new BSplineControlPoint[num_control_points];
	assert( control_points );

	if ( old_control_points )
		{
		for( i = 0; i < num_control_points - 1; i++ )
			{
			control_points[ i ] = old_control_points[ i ];
			}
		delete [] old_control_points;
		}

	control_points[ num_control_points - 1 ].Set( new_control_point, new_control_orient, new_control_speed );
	}

void BSpline::SetLoopPoint
	(
   const Vector& pos
   )
   {
   int i;

	for( i = 0; i < num_control_points; i++ )
		{
		if ( pos == *control_points[ i ].GetPosition() )
         {
         loop_control_point = i;
         break;
         }
      }
   }

int BSpline::PickControlPoint
	(
	const Vector& window_point, 
	float pick_size
	)

	{
	int	i;
	float closest_dist_2;
	int	closest_index;
	float dist_2;
	Vector delta;

	closest_index = -1;
	closest_dist_2 = 1000000.0f;
	for( i = 0; i < num_control_points; i++ )
		{
		delta = window_point - *control_points[ i ].GetPosition();
      dist_2 = delta * delta;
      if ( dist_2 < closest_dist_2 )
			{
			closest_dist_2 = dist_2;
			closest_index = i;
			}
		}

	if ( pick_size * pick_size >= closest_dist_2 )
		{
		return closest_index;
		}
	else
		{
		return -1;
		}
	}

CLASS_DECLARATION( Entity, SplinePath, "info_splinepath" );

Event EV_SplinePath_Create( "SplinePath_create" );

ResponseDef SplinePath::Responses[] =
	{
      { &EV_SplinePath_Create,     ( Response )SplinePath::CreatePath },
      { NULL, NULL }
   };

SplinePath::SplinePath()
	{
	owner = this;
	next = NULL;
   loop = NULL;
   loop_name = G_GetStringArg( "loop" );
   angles = G_GetVectorArg( "angles" );
   speed = G_GetFloatArg( "speed", 1 );
	setMoveType( MOVETYPE_NONE );
	setSolidType( SOLID_NOT );
	hideModel();

   if ( !LoadingSavegame )
      {
	   PostEvent( EV_SplinePath_Create, 0 );
      }
	}

void SplinePath::CreatePath
	(
	Event *ev
	)

   {
   const char  *target;
   int         num;

   // Make the path from the targetlist.
   target = Target();
   if ( target[ 0 ] )
      {
      if ( num = G_FindTarget( 0, target ) )
         {
         next = ( SplinePath * )G_GetEntity( num );
			next->owner = this;
         }
      else
         {
         gi.error( "SplinePath::CreatePath: target %s not found\n", target );
         }
      }
   if ( loop_name.length() )
      {
      if ( num = G_FindTarget( 0, loop_name.c_str() ) )
         {
         loop = ( SplinePath * )G_GetEntity( num );
         }
      }
   } 

SplinePath *SplinePath::GetNext
	(
	void
	)
	
	{
	return next;
	}

SplinePath *SplinePath::GetLoop
	(
	void
	)
	
	{
	return loop;
	}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产欧美日韩中文久久| 精品视频一区二区三区免费| 国产色婷婷亚洲99精品小说| 黄一区二区三区| 国产日韩精品一区二区三区在线| 国产一二精品视频| 亚洲国产精品成人综合色在线婷婷| 成人99免费视频| 亚洲另类春色校园小说| 欧美亚洲禁片免费| 美女爽到高潮91| 久久先锋影音av鲁色资源| av欧美精品.com| 一区二区三区久久| 欧美不卡一区二区| 99热99精品| 首页国产丝袜综合| 久久久久久免费| 色综合天天在线| 丝袜亚洲精品中文字幕一区| 久久看人人爽人人| 91久久精品一区二区二区| 青青国产91久久久久久| 久久久精品影视| 欧美亚洲高清一区| 久久福利资源站| 亚洲人成网站在线| 精品国产青草久久久久福利| 99精品国产热久久91蜜凸| 日韩国产一二三区| 中文字幕中文字幕在线一区 | 精品一区二区三区在线播放视频| 精品国产制服丝袜高跟| 色欧美88888久久久久久影院| 日本aⅴ亚洲精品中文乱码| 欧美国产乱子伦| 91精品国产综合久久精品性色| 成人午夜激情影院| 日韩av中文字幕一区二区三区| 中文字幕av在线一区二区三区| 欧美亚洲日本国产| 波多野结衣一区二区三区| 日韩av电影天堂| 国产精品每日更新| 26uuu精品一区二区在线观看| 欧美又粗又大又爽| 国产 欧美在线| 日本女优在线视频一区二区| 国产精品二区一区二区aⅴ污介绍| 日韩色在线观看| 欧美色区777第一页| 99这里只有久久精品视频| 精品一区二区在线看| 香蕉成人伊视频在线观看| 国产精品久久久久久久久久免费看| 日韩一级二级三级精品视频| 91免费看`日韩一区二区| 国产乱国产乱300精品| 美国十次了思思久久精品导航| 一区二区三区四区五区视频在线观看| 久久久久国产精品麻豆ai换脸| 91精品国产丝袜白色高跟鞋| 欧美影院一区二区| 色欧美片视频在线观看在线视频| 成人免费黄色在线| 成人高清在线视频| 国产成人在线看| 国产一区二区电影| 国产伦精品一区二区三区视频青涩| 日本三级韩国三级欧美三级| 亚洲第一二三四区| 亚洲国产精品一区二区久久| 亚洲色图制服丝袜| 亚洲三级理论片| 亚洲男人电影天堂| 亚洲免费观看高清完整版在线观看 | 国产成人av电影在线| 久久爱www久久做| 精品一区二区三区免费毛片爱| 久久久不卡网国产精品一区| 国产传媒久久文化传媒| 日本伊人午夜精品| 美女视频黄久久| 免费观看在线综合色| 久久狠狠亚洲综合| 国产一区二区h| 国产不卡在线播放| 不卡一卡二卡三乱码免费网站| 国产激情91久久精品导航| 九九视频精品免费| 国产剧情一区在线| 欧美日韩二区三区| 国产精品卡一卡二卡三| 美腿丝袜亚洲色图| 色天使色偷偷av一区二区| 精品久久久久久久久久久久久久久 | 成人动漫av在线| 3d动漫精品啪啪| 日韩毛片在线免费观看| 狠狠色综合日日| 欧美日韩视频一区二区| 国产精品美日韩| 久久精品国产第一区二区三区| 91福利精品视频| 国产精品萝li| 国产精品一线二线三线精华| 欧美日韩黄色影视| 亚洲同性同志一二三专区| 国产一区二区三区在线观看免费 | 亚洲精品ww久久久久久p站| 国产老妇另类xxxxx| 日韩一区二区免费在线电影| 有坂深雪av一区二区精品| 成av人片一区二区| 国产亚洲成aⅴ人片在线观看 | 欧美在线观看一区| 国产精品久久毛片a| 黄页网站大全一区二区| 欧美一区二区网站| 天天av天天翘天天综合网| 色哟哟一区二区在线观看| 欧美激情一区二区三区不卡| 精品亚洲成av人在线观看| 91麻豆精品国产自产在线观看一区| 国产精品国产三级国产普通话蜜臀 | 欧美中文一区二区三区| 亚洲男女毛片无遮挡| www.在线欧美| 中文字幕一区视频| 北岛玲一区二区三区四区| 国产精品天美传媒| av一区二区三区黑人| 亚洲欧洲一区二区三区| 99国产精品久| 亚洲婷婷综合色高清在线| 91丨九色丨国产丨porny| 国产精品福利一区二区| 成人av免费在线观看| 国产精品伦一区| av网站一区二区三区| 亚洲欧美激情小说另类| 在线亚洲欧美专区二区| 亚洲一区二区欧美激情| 欧美亚洲动漫制服丝袜| 日韩中文字幕一区二区三区| 欧美精品18+| 美腿丝袜一区二区三区| 精品对白一区国产伦| 国产一区91精品张津瑜| 亚洲国产精品精华液2区45| 99久久精品国产网站| 亚洲欧美成人一区二区三区| 欧美日韩免费不卡视频一区二区三区| 午夜影视日本亚洲欧洲精品| 欧美一区二区三区性视频| 久久国产尿小便嘘嘘| 久久精品亚洲一区二区三区浴池| 成人精品免费网站| 依依成人精品视频| 91精品国产综合久久精品麻豆| 日本视频在线一区| 国产拍揄自揄精品视频麻豆| 91视视频在线直接观看在线看网页在线看 | 亚洲一区二区五区| 7777精品伊人久久久大香线蕉 | av亚洲精华国产精华| 亚洲国产视频在线| 欧美精品一区二区三区高清aⅴ | 乱中年女人伦av一区二区| 国产三级一区二区| 91精品福利视频| 免费的成人av| 国产精品情趣视频| 欧美日韩视频在线观看一区二区三区| 久久国产精品99精品国产 | 精品国产一区二区三区忘忧草| 成人黄色在线网站| 午夜视频一区二区| 国产视频一区在线观看| 欧美日韩亚洲综合在线| 国产成人精品三级| 午夜伦欧美伦电影理论片| 久久精品人人做| 欧美日韩精品欧美日韩精品一 | 成人免费看片app下载| 视频一区二区三区中文字幕| 国产日韩欧美不卡| 欧美精品 国产精品| 99久久国产免费看| 麻豆精品一区二区| 艳妇臀荡乳欲伦亚洲一区| 欧美一区二区在线免费观看| www.视频一区| 国内精品久久久久影院一蜜桃| 一区二区三区四区在线| 久久精品免视看| 欧美精品乱码久久久久久按摩| www.性欧美| 国产精品亚洲一区二区三区妖精| 日韩国产欧美在线视频|