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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? brush.cpp

?? 3D游戲場景編輯器
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
	if((sides&0x0c)==0)	//center y
	{
		VectorToSUB(ShearAxis, axidx[inidx][1])	=
			1.0f / VectorToSUB(b->BoundingBox.Max, axidx[inidx][1]);
	}

	Brush_Shear(b, fnscale, &ShearAxis);

	//translate back
	geVec3d_Inverse(&FixOrg);
	Brush_Move(b, &FixOrg);

	Brush_Bound(b);
}

// moves the passed in brush by the vector specified in trans
void	Brush_Move(Brush *b,  const geVec3d *trans)
{
	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_Move", MB_OK);	//	post 0.55

	assert(b && trans);

	if(b->Type==BRUSH_MULTI)
	{
		BrushList_Move(b->BList, trans);
	}
	else
	{
		FaceList_Move(b->Faces, trans);
	}

	Brush_Bound(b);
}

void	Brush_Rotate
	(
	  Brush *b,
	  const geXForm3d *pXfmRotate,
	  const geVec3d *pCenter
	)
{
	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_Rotate", MB_OK);	//	post 0.55

	assert (b != NULL);
	assert (pXfmRotate != NULL);
	assert (pCenter != NULL);

	if(b->Type==BRUSH_MULTI)
	{
		BrushList_Rotate(b->BList, pXfmRotate, pCenter);
	}
	else
	{
		FaceList_Rotate(b->Faces, pXfmRotate, pCenter);
	}

	Brush_Bound (b);
}

void	Brush_Transform 
	(
	  Brush *b, 
	  const geXForm3d *pXfm
	)
// Apply the transform to all points in all brush faces
{
	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_Transform", MB_OK);	//	post 0.55

	assert (b != NULL);
	assert (pXfm != NULL);

	if(b->Type==BRUSH_MULTI)
	{
		BrushList_Transform(b->BList, pXfm);
	}
	else
	{
		FaceList_Transform(b->Faces, pXfm);
	}

	Brush_Bound(b);
}

// calculates relative "center" of brush by finding midpoint between min and max
void	Brush_Center(const Brush *b, geVec3d *center)
{
	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_Center", MB_OK);	//	post 0.55

	assert(b && center);

	Box3d_GetCenter (&b->BoundingBox, center);
}

void	Brush_Scale (Brush *b, float ScaleFactor)
{

	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_Scale", MB_OK);	//	post 0.55

	assert (b != NULL);

	b->HullSize	*= ScaleFactor;
	if (b->Type == BRUSH_MULTI)
	{
		BrushList_Scale (b->BList, ScaleFactor);
	}
	else
	{
		geVec3d vecScale;

		geVec3d_Set (&vecScale, ScaleFactor, ScaleFactor, ScaleFactor);
		FaceList_Scale (b->Faces, &vecScale);
	}
	Brush_Bound (b);
}

void	Brush_Scale3d(Brush *b, const geVec3d *mag)
{
	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_Scale3d", MB_OK);	//	post 0.55

	assert(b);
	assert(mag);

	if(b->Type==BRUSH_MULTI)
	{
		BrushList_Scale3d(b->BList, mag);
	}
	else
	{
		FaceList_Scale(b->Faces, mag);
	}

	Brush_Bound(b);
}

void	Brush_Shear(Brush *b, const geVec3d *ShearVec, const geVec3d *ShearAxis)
{
	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_Shear", MB_OK);	//	post 0.55

	if (ShearVec == NULL)
		MessageBox(NULL, "ShearVec == NULL", "Brush_Shear", MB_OK);	//	post 0.55

	if (ShearAxis == NULL)
		MessageBox(NULL, "ShearAxis == NULL", "Brush_Shear", MB_OK);	//	post 0.55


	assert(b);
	assert(ShearVec);
	assert(ShearAxis);

	if(b->Type==BRUSH_MULTI)
	{
		BrushList_Shear(b->BList, ShearVec, ShearAxis);
	}
	else
	{
		FaceList_Shear(b->Faces, ShearVec, ShearAxis);
	}
	Brush_Bound(b);
}

Face	*Brush_RayCast(const Brush *b, geVec3d *CamOrg, geVec3d *dir, geFloat *dist)
{
	Face		*f, *firstface;
	geVec3d		p1, p2;
	geFloat		mid, d1, d2;
	int32		i;
	const Plane	*p;
	geFloat		minBDist;
	Face		*curFace	=NULL;
	const Brush	*b2;

	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_RayCast", MB_OK);	//	post 0.55

	minBDist	=999999.0f;

	//this multi section isn't used currently
	//but might be needed later
	if(b->Type & BRUSH_MULTI)
	{
		for(b2=b->BList->First;b2;b2=b2->Next)
		{
			if(!(b2->Flags & BRUSH_SUBTRACT))
			{
				f	=Brush_RayCast(b2, CamOrg, dir, dist);
				if(f)
				{
					if((*dist >= 8.0f) && (*dist < minBDist))
					{ 
						minBDist	=*dist;
						curFace		=f;
					}
				}
			}
		}
		if(curFace)
		{
			*dist	=minBDist;
			return	curFace;
		}
		else
		{
			*dist	=0;
			return	NULL;
		}
	}

	geVec3d_Copy(CamOrg, &p1);
	geVec3d_AddScaled (&p1, dir, 2*BOGUS_RANGE, &p2);

	firstface	=NULL;

	assert(!(b->Flags & BRUSH_SUBTRACT));

	for(i=0;i < FaceList_GetNumFaces(b->Faces);i++)
	{
		geVec3d tempVec;

		f	=FaceList_GetFace(b->Faces, i);
		p	=Face_GetPlane(f);

		d1	=geVec3d_DotProduct(&p1, &p->Normal)	-p->Dist;
		d2	=geVec3d_DotProduct(&p2, &p->Normal)	-p->Dist;
		if(d1 >= 0 && d2 >= 0)
		{
			*dist	=0;
			return	NULL;
		}
		if(d1 <=0 && d2 <= 0)
			continue;

		mid	=d1 / (d1 - d2);

		geVec3d_Subtract (&p2, &p1, &tempVec);
		geVec3d_AddScaled (&p1, &tempVec, mid, &tempVec);
		if (d1 > 0)
		{
			firstface = f;
			p1 = tempVec;
		}
		else
		{
			p2 = tempVec;
		}
	}
	geVec3d_Subtract(&p1, CamOrg, &p1);

	d1		=geVec3d_DotProduct(&p1, dir);
	*dist	=d1;

	return	firstface;
}



/*******************************************************************/
/**************  BRUSH LIST HANDLERS *******************************/
/*******************************************************************/

BrushList *BrushList_Create 
	(
	  void
	)
{
	BrushList *pList;

	pList = (BrushList*)geRam_Allocate (sizeof (BrushList));
	if (pList != NULL)
	{
		pList->First = NULL;
		pList->Last = NULL;
	}
	return pList;
}

BrushList *BrushList_CreateFromFile 
	(
	  Parse3dt *Parser, 
	  int VersionMajor, 
	  int VersionMinor, 
	  const char **Expected
	)
{
	int NumBrushes;
	BrushList *blist;

	if (!Parse3dt_GetInt (Parser, (*Expected = "Brushlist"), &NumBrushes)) return NULL;
	blist = BrushList_Create ();
	if (blist != NULL)
	{
		int i;

		for (i = 0; i < NumBrushes; ++i)
		{
			Brush *pBrush;

			pBrush = Brush_CreateFromFile (Parser, VersionMajor, VersionMinor, Expected);
			if (pBrush == NULL)
			{
				BrushList_Destroy (&blist);
				break;
			}
			else
			{
				BrushList_Append (blist, pBrush);
			}
		}
	}
	return blist;
}

void BrushList_Destroy 
	(
	  BrushList **ppList
	)
{
	BrushList *pList;

	if (ppList == NULL)		//	post 0.55
	{
		MessageBox(NULL, "ppList == NULL", "BrushList_Destroy", MB_OK);
		return;
	}

	if (*ppList == NULL)		//	post 0.55
	{
		MessageBox(NULL, "*ppList == NULL", "BrushList_Destroy", MB_OK);
		return;
	}

	assert (ppList != NULL);
	assert (*ppList != NULL);

	pList = *ppList;
	BrushList_DeleteAll (pList);

	geRam_Free (*ppList);
	*ppList = NULL;
}

void BrushList_Append 
	(
	  BrushList *pList, 
	  Brush *pBrush
	)
{
	if (pList == NULL)		//	post 0.55
	{
		MessageBox(NULL, "pList == NULL", "BrushList_Append", MB_OK);
		return;
	}

	if (pBrush == NULL)		//	post 0.55
	{
		MessageBox(NULL, "pBrush == NULL", "BrushList_Append", MB_OK);
		return;
	}
	
	
	assert (pList != NULL);
	assert (pBrush != NULL);

	if (pList->First == NULL)
	{
		// the list is empty
		assert (pList->Last == NULL);
		pList->First = pBrush;
		pList->Last = pBrush;
		pBrush->Next = NULL;
		pBrush->Prev = NULL;
	}
	else
	{
		// add it to the end of the list
		assert (pList->Last != NULL);
		assert (pList->Last->Next == NULL);

		pBrush->Next = NULL;			// it's the end of the list
		pBrush->Prev = pList->Last;		// point back to previous end
		pList->Last->Next = pBrush;		// previous end points to me
		pList->Last = pBrush;			// and we're now the list end
	}
}

//insert pbrush into the list after pBMarker
//went nuts on asserts here, but maybe they will save us someday
void BrushList_InsertAfter(BrushList *pList, Brush *pBMarker, Brush *pBrush)
{
	if (pList == NULL)		//	post 0.55
	{
		MessageBox(NULL, "pList == NULL", "BrushList_InsertAfter", MB_OK);
		return;
	}

	if (pBrush == NULL)		//	post 0.55
	{
		MessageBox(NULL, "pBrush == NULL", "BrushList_InsertAfter", MB_OK);
		return;
	}
	
	assert (pList != NULL);
	assert (pBMarker != NULL);
	assert (pBrush != NULL);
	assert (pList->First != NULL); //must be at least one
	assert (pList->Last != NULL);
	assert (pList->Last->Next == NULL);

	pBrush->Next	=pBMarker->Next;
	pBrush->Prev	=pBMarker;

	if(pBrush->Next==NULL)	//last in list?
	{
		pList->Last	=pBrush;
	}
	else
	{
		pBrush->Next->Prev	=pBrush;
	}
	pBMarker->Next	=pBrush;
}

//insert pbrush into the list before pBMarker
void BrushList_InsertBefore(BrushList *pList, Brush *pBMarker, Brush *pBrush)
{
	if (pList == NULL)		//	post 0.55
	{
		MessageBox(NULL, "pList == NULL", "BrushList_InsertBefore", MB_OK);
		return;
	}

	if (pBrush == NULL)		//	post 0.55
	{
		MessageBox(NULL, "pBrush == NULL", "BrushList_InsertBefore", MB_OK);
		return;
	}
	
	
	assert (pList != NULL);
	assert (pBMarker != NULL);
	assert (pBrush != NULL);
	assert (pList->First != NULL); //must be at least one
	assert (pList->Last != NULL);
	assert (pList->Last->Next == NULL);

	pBrush->Prev	=pBMarker->Prev;
	pBrush->Next	=pBMarker;

	if(pBrush->Prev==NULL)	//first in list?
	{
		pList->First	=pBrush;
	}
	else
	{
		pBrush->Prev->Next	=pBrush;
	}
	pBMarker->Prev	=pBrush;
}

void BrushList_Prepend 
	(
	  BrushList *pList, 
	  Brush *pBrush
	)
{
	if (pList == NULL)		//	post 0.55
	{
		MessageBox(NULL, "pList == NULL", "BrushList_Prepend", MB_OK);
		return;
	}

	if (pBrush == NULL)		//	post 0.55
	{
		MessageBox(NULL, "pBrush == NULL", "BrushList_Prepend", MB_OK);
		return;
	}
		
	assert (pList != NULL);
	assert (pBrush != NULL);

	if (pList->First == NULL)
	{
		// it's the first brush in the list
		assert (pList->Last == NULL);
		pList->First = pBrush;
		pList->Last = pBrush;
		pBrush->Next = NULL;
		pBrush->Prev = NULL;
	}
	else
	{
		// put it at the head of the list
		assert (pList->Last != NULL);
		assert (pList->First->Prev == NULL);

		pBrush->Prev = NULL;			// nothing before me
		pBrush->Next = pList->First;	// point to previous head
		pList->First->Prev = pBrush;	// previous head points to me
		pList->First = pBrush;			// and now we're the head of the list
	}
}

void BrushList_Remove 
	(
	  BrushList *pList, 
	  Brush *pBrush
	)
{
	Brush *pPrev;
	Brush *pNext;

	if (pList == NULL)		//	post 0.55
	{
		MessageBox(NULL, "pList == NULL", "BrushList_Remove", MB_OK);
		return;
	}

	if (pBrush == NULL)		//	post 0.55
	{
		MessageBox(NULL, "pBrush == NULL", "BrushList_Remove", MB_OK);
		return;
	}
	
	assert (pList != NULL);
	assert (pBrush != NULL);
	assert (pBrush->Prev != pBrush);

	pPrev = pBrush->Prev;
	pNext = pBrush->Next;

	// unlink the brush from the list
	pBrush->Prev = NULL;
	pBrush->Next = NULL;

	// update neighbors' previous/next links
	if (pPrev != NULL)
	{
		pPrev->Next = pNext;
	}
	if (pNext != NULL)
	{
		pNext->Prev = pPrev;
	}

	// if this is the first brush in the list,
	// then update the First pointer
	if (pList->First == pBrush)
	{
		assert (pPrev == NULL);
		pList->First = pNext;
	}
	// if it's the last brush in the list,
	// then update the Last pointer
	if (pList->Last == pBrush)
	{
		assert (pNext == NULL);
		pList->Last = pPrev;
	}
}

void BrushList_DeleteAll
	(
	  BrushList *pList
	)
{
	Brush *pBrush;
	BrushIterator bi;

	if (pList == NULL)		//	post 0.55
	{
		MessageBox(NULL, "pList == NULL", "BrushList_DeleteAll", MB_OK);
		return;
	}

	assert (pList != NULL);

	pBrush = BrushList_GetFirst (pList, &bi);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久成人久久爱| 丝袜国产日韩另类美女| 国产v综合v亚洲欧| 久久久一区二区三区捆绑**| 国产一区二区免费视频| 欧美国产日韩在线观看| 暴力调教一区二区三区| 国产精品二区一区二区aⅴ污介绍| 成人黄色777网| 亚洲美女精品一区| 欧美影片第一页| 免费在线观看日韩欧美| 久久久久成人黄色影片| 成人av在线播放网站| 亚洲在线免费播放| 欧美一区二区免费| 国产福利一区二区三区视频在线 | 国产日产欧美一区二区视频| 国产一区二区网址| 国产精品国产三级国产普通话99| 国产99久久久国产精品潘金网站| 精品国产伦一区二区三区免费| 国产成人精品午夜视频免费| 亚洲少妇最新在线视频| 678五月天丁香亚洲综合网| 精品一区二区三区影院在线午夜 | 91美女福利视频| 午夜av区久久| 国产三级一区二区三区| 在线区一区二视频| 久久精品国产精品亚洲红杏| 国产精品传媒在线| 91麻豆精品国产91久久久久久| 国产精一区二区三区| 亚洲精品国产品国语在线app| 日韩亚洲欧美在线观看| 不卡区在线中文字幕| 日本中文字幕一区二区视频| 欧美经典一区二区| 欧美日本在线播放| 国产精品一品二品| 天天av天天翘天天综合网| 久久久国产精品麻豆| 欧美网站大全在线观看| 风间由美性色一区二区三区| 亚洲国产精品久久久久婷婷884| 精品国产一区久久| 精品视频999| 高清国产一区二区| 老司机午夜精品| 亚洲国产精品一区二区www在线| 久久久精品影视| 欧美日韩国产精品成人| 成人18精品视频| 久久国产夜色精品鲁鲁99| 一区二区欧美国产| 国产欧美一区二区三区网站 | www.av亚洲| 狠狠色丁香久久婷婷综| 亚洲成av人在线观看| 成人免费一区二区三区视频| 欧美va日韩va| 欧美久久一区二区| 色婷婷综合五月| voyeur盗摄精品| 处破女av一区二区| 国产乱人伦偷精品视频不卡| 秋霞午夜av一区二区三区| 亚洲午夜影视影院在线观看| 中文字幕一区二区三区在线不卡| 国产人久久人人人人爽| 欧美videos中文字幕| 欧美一级午夜免费电影| 欧美精品久久久久久久久老牛影院 | 欧美一区二区三区播放老司机| 欧洲精品在线观看| 色8久久人人97超碰香蕉987| www.久久久久久久久| 成人激情免费电影网址| 丰满少妇久久久久久久| 国产成人福利片| 国产毛片一区二区| 国产在线一区二区| 国产伦精品一区二区三区免费迷| 秋霞午夜av一区二区三区| 日本不卡一二三| 蜜桃一区二区三区在线观看| 奇米888四色在线精品| 日韩主播视频在线| 麻豆视频一区二区| 久久成人麻豆午夜电影| 国模少妇一区二区三区| 国模娜娜一区二区三区| 国产夫妻精品视频| 粉嫩久久99精品久久久久久夜| 岛国av在线一区| 99r国产精品| 色综合天天综合给合国产| 972aa.com艺术欧美| 色狠狠一区二区| 欧美日免费三级在线| 欧美一区二区大片| 2023国产一二三区日本精品2022| 久久精品一区二区| **欧美大码日韩| 亚洲第一成年网| 日本伊人色综合网| 国产在线播放一区| av在线不卡观看免费观看| 91黄视频在线| 91精品在线一区二区| 久久久精品免费网站| 亚洲视频综合在线| 日韩中文字幕一区二区三区| 黑人精品欧美一区二区蜜桃 | 美女www一区二区| 国产精品一区二区久久精品爱涩| 成人综合激情网| 欧美日韩一二三区| 精品福利二区三区| 中文字幕一区二区三| 亚洲va欧美va人人爽午夜| 九九久久精品视频| 成人av中文字幕| 欧美精品三级在线观看| 久久中文字幕电影| 一区二区三区小说| 国产在线不卡一区| 欧美性感一类影片在线播放| 精品福利在线导航| 亚洲国产日韩a在线播放性色| 精品亚洲porn| 色婷婷一区二区三区四区| 欧美www视频| 亚洲精品中文字幕乱码三区| 久久99精品一区二区三区三区| 99久久国产综合精品色伊| 日韩一区二区三| 亚洲欧美日韩国产另类专区| 九一九一国产精品| 欧美日韩美少妇| 中文字幕五月欧美| 另类小说图片综合网| 欧美在线制服丝袜| 中文字幕不卡三区| 免费成人在线观看| 91美女福利视频| 国产日韩欧美精品在线| 日本中文字幕一区二区有限公司| av不卡在线播放| 久久蜜桃av一区精品变态类天堂 | 国产乱码精品一品二品| 欧美中文字幕久久| 国产精品天干天干在观线| 美女mm1313爽爽久久久蜜臀| 色综合天天综合色综合av| 国产亚洲制服色| 理论电影国产精品| 欧美丰满一区二区免费视频| 成人免费在线观看入口| 国产成人在线电影| 日韩欧美成人午夜| 日韩制服丝袜先锋影音| 欧美体内she精高潮| 国产精品久久久久久户外露出 | 91久久精品国产91性色tv| 欧美激情一二三区| 国产一区999| 久久综合一区二区| 蜜桃视频在线观看一区| 欧美久久久久免费| 亚洲国产一区二区三区 | 94色蜜桃网一区二区三区| 欧美一区二区三区小说| 首页国产欧美日韩丝袜| 欧美色男人天堂| 亚洲一区二区三区四区在线| 色又黄又爽网站www久久| 1000部国产精品成人观看| 国产精品18久久久| 国产偷国产偷精品高清尤物| 国产一区二区91| 久久久久国产成人精品亚洲午夜| 毛片av一区二区| 日韩免费视频一区二区| 琪琪久久久久日韩精品| 91精品欧美福利在线观看| 日韩中文字幕一区二区三区| 欧美日韩国产成人在线免费| 亚洲成人福利片| 4438x成人网最大色成网站| 日韩成人一区二区| 欧美一区二区三区系列电影| 免费一区二区视频| 日韩欧美一区二区不卡| 精品一区二区在线看| 精品福利一区二区三区免费视频| 精品一区二区影视| 国产欧美一区二区精品仙草咪 | 国产盗摄女厕一区二区三区|