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

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

?? brush.cpp

?? 3D游戲場景編輯器
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
	while (pBrush != NULL)
	{
		BrushList_Remove (pList, pBrush);
		Brush_Destroy(&pBrush);
		pBrush = BrushList_GetNext (&bi);
	}
}

Brush *BrushList_GetFirst 
	(
	  BrushList *pList, 
	  BrushIterator *bi
	 )
{
	if (pList == NULL)		//	post 0.55
	{
		MessageBox(NULL, "pList == NULL", "BrushList_GetFirst", MB_OK);
		return NULL;
	}

	assert (pList != NULL);
	assert (bi != NULL);


	
	if (pList->First == NULL)
	{
	
		*bi = NULL;
	}
	else
	{
		*bi = pList->First->Next;
	}
	return pList->First;
}

Brush *BrushList_GetNext 
	(
	  BrushIterator *bi
	)
{
	assert (bi != NULL);

	if (*bi == NULL)
	{
		return NULL;
	}
	else
	{
		Brush *b;

		b = *bi;
		*bi = (*bi)->Next;

		return b;
	}
}

Brush *BrushList_GetLast
	(
	  BrushList *pList, 
	  BrushIterator *bi
	 )
{
	if (pList == NULL)		//	post 0.55
	{
		MessageBox(NULL, "pList == NULL", "BrushList_GetLast", MB_OK);
		return NULL;
	}

	assert (pList != NULL);
	assert (bi != NULL);

	if (pList->Last == NULL)
	{
		*bi = NULL;
	}
	else
	{
		*bi = pList->Last->Prev;
	}
	return pList->Last;
}

Brush *BrushList_GetPrev
	(
	  BrushIterator *bi
	)
{
	assert (bi != NULL);

	if (*bi == NULL)
	{
		return NULL;
	}
	else
	{
		Brush *b;

		b = *bi;
		*bi = (*bi)->Prev;
		return b;
	}
}

int BrushList_Count
	(
	  BrushList const *pList,
	  int CountFlags
	)
{
	int Count;
	Brush *b;
//	geBoolean bResult = GE_TRUE;

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

	Count = 0;

	b = pList->First;
	while (b != NULL)
	{
		geBoolean CountIt;
		switch (b->Type)
		{
			case BRUSH_MULTI :
				CountIt = (CountFlags & BRUSH_COUNT_MULTI);
				break;

			case BRUSH_LEAF :
				CountIt = (CountFlags & BRUSH_COUNT_LEAF);
				break;

			case BRUSH_CSG :
				CountIt = (CountFlags & BRUSH_COUNT_CSG);
				break;

			default :
				assert (0);
				CountIt = GE_FALSE;
				break;
		}
		if (CountIt)
		{
			++Count;
		}

		if ((b->Type == BRUSH_MULTI) && (!(CountFlags & BRUSH_COUNT_NORECURSE)))
		{
			Count += BrushList_Count (b->BList, CountFlags);
		}
		b = b->Next;
	}

	return Count;
}

// call CallBack for top level brushes in the list...
geBoolean BrushList_Enum
	(
		BrushList const *pList,
		void *			lParam,
		BrushList_CB	CallBack
	)
{
	geBoolean bResult = GE_TRUE ;	// TRUE means entire list was processed
	Brush * b;

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

	assert (pList != NULL);

	b = pList->First;
	while (b != NULL)
	{
		if( (bResult = CallBack( b, lParam )) == GE_FALSE )
			break ;		
		b = b->Next;
	}
	return bResult ;
}

// call CallBack for all brushes in the list...
geBoolean BrushList_EnumAll
	(
		BrushList const *pList,
		void *			lParam,
		BrushList_CB	CallBack
	)
{
	geBoolean bResult = GE_TRUE ;	// TRUE means entire list was processed
	Brush * b;

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

	assert (pList != NULL);

	b = pList->First;
	while (b != NULL)
	{
		if( (bResult = CallBack( b, lParam )) == GE_FALSE )
			break ;		
		if (b->Type == BRUSH_MULTI)
		{
			bResult = BrushList_EnumAll (b->BList, lParam, CallBack);
			if (!bResult)
			{
				break;
			}
		}
		b = b->Next;
	}
	return bResult ;
}

//traverses inorder 
int	BrushList_EnumLeafBrushes(const BrushList	*pList,
							  void *			pVoid,
							  BrushList_CB		CallBack)
{
	geBoolean	bResult	=GE_TRUE;	// TRUE means entire list was processed
	Brush		*b;

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

	
	assert(pList != NULL);

	for(b=pList->First;b;b=b->Next)
	{
		assert(b->Type!=BRUSH_CSG);

		if(b->Type==BRUSH_MULTI)
		{
			if(!BrushList_EnumLeafBrushes(b->BList, pVoid, CallBack))
			{
				break;
			}
		}
		else if( (bResult = CallBack( b, pVoid )) == GE_FALSE )
		{
			break;
		}
	}
	return bResult ;
}

//grabs csg brushes and leafs with no children
//the exception being hollows which are all based
//on a parent multi and might contain a hollowcut
int	BrushList_EnumCSGBrushes(const BrushList	*pList,
							  void *			pVoid,
							  BrushList_CB		CallBack)
{
	geBoolean	bResult	=GE_TRUE;	// TRUE means entire list was processed
	Brush		*b;

	assert(pList != NULL);

	for(b=pList->First;b && bResult;b=b->Next)
	{
		switch (b->Type)
		{
			case BRUSH_MULTI :
				bResult = BrushList_EnumCSGBrushes (b->BList, pVoid, CallBack);
				break;
			case BRUSH_LEAF :
				if (b->BList)
				{
					bResult = BrushList_EnumCSGBrushes (b->BList, pVoid, CallBack);
				}
				else
				{
					if(!(b->Flags & (BRUSH_HOLLOW | BRUSH_HOLLOWCUT)))
					{
						bResult = CallBack (b, pVoid);
					}
				}
				break;
			case BRUSH_CSG :
				bResult = CallBack (b, pVoid);
				break;
			default :
				assert (0);		// bad brush type
				bResult = GE_FALSE;
				break;
		}
	}
	return bResult ;
}

geBoolean	Brush_GetParent(const BrushList	*pList,		//list to search
							const Brush		*b,			//brush to find
							Brush			**bParent)	//parent returned
{
	Brush	*b2;

	assert(b);
	assert(pList);
	assert(bParent);

	for(b2=pList->First;b2;b2=b2->Next)

	{
		if(b2==b)
		{
			*bParent	=(Brush *)b;	//const override!
			return		GE_TRUE;
		}

		if(b2->Type==BRUSH_LEAF)
		{
			if(b2->BList)
			{
				if(Brush_GetParent(b2->BList, b, bParent))
				{
					*bParent	=b2;
					return		GE_TRUE;
				}
			}
		}
		else if(b2->Type==BRUSH_MULTI)
		{
			if(Brush_GetParent(b2->BList, b, bParent))
			{
				*bParent	=b2;
				return		GE_TRUE;
			}
		}
	}
	return	GE_FALSE;

}


Brush *	Brush_GetTopLevelParent 
	(
	  const BrushList	*pList,		//list to search
	  const Brush		*b			//brush to find
	)
{
	Brush const *bWork;
	Brush *pImmediateParent;

	bWork = b;

	while (Brush_GetParent (pList, bWork, &pImmediateParent) == GE_TRUE)
	{
		if (bWork == pImmediateParent)
		{
			break;
		}
		bWork = pImmediateParent;
	}
	return (Brush *)bWork;
}


static geBoolean	Brush_SelectMatchingFace(Brush *b, Face *f, Face **pMatchingFace)
{
	Face		*f2;
	const Plane	*p, *p2;
	int			i;

	assert(b);

	p	=Face_GetPlane(f);
	for(i=0;i < FaceList_GetNumFaces(b->Faces);i++)
	{
		f2	=FaceList_GetFace(b->Faces, i);
		p2	=Face_GetPlane(f2);

		if(b->Flags & BRUSH_SUBTRACT)
		{
			geVec3d	InvNorm	=p2->Normal;
			geVec3d_Inverse(&InvNorm);

			if(geVec3d_Compare(&p->Normal, &InvNorm, 0.01f))
			{
				if(((p->Dist + p2->Dist) > -0.01f)&&((p->Dist + p2->Dist) < 0.01f))
				{
					Face_SetSelected(f2, GE_TRUE);
					*pMatchingFace = f2;
					return	GE_TRUE;
				}
			}
		}
		else
		{
			if(geVec3d_Compare(&p->Normal, &p2->Normal, 0.01f))
			{
				if(((p->Dist - p2->Dist) > -0.01f)&&((p->Dist - p2->Dist) < 0.01f))
				{
					Face_SetSelected(f2, GE_TRUE);
					*pMatchingFace = f2;
					return	GE_TRUE;
				}
			}
		}
	}
	return	GE_FALSE;
}


static geBoolean	BrushList_SelectMatchingCutFace
	(
		const BrushList	*pList,
		const Brush		*b,
		Face			*f,
		Brush			**CutBrush,
		Face			**pMatchingFace
	)
{
	Brush	*cb;

	assert(b);
	assert(CutBrush);
	assert(pList);
	assert(f);

	if(b->Type==BRUSH_LEAF)
	{
		for(cb=pList->Last;cb;cb=cb->Prev)
		{
			if(cb==b)
			{
				break;
			}
			if(Brush_TestBoundsIntersect(b, &cb->BoundingBox))
			{
				if(cb->Type==BRUSH_MULTI)
				{
					if(BrushList_SelectMatchingCutFace(cb->BList, b, f, CutBrush, pMatchingFace))
					{
						return	GE_TRUE;
					}
				}
				else if(cb->Flags & BRUSH_SUBTRACT)
				{
					if(Brush_SelectMatchingFace(cb, f, pMatchingFace))
					{
						*CutBrush	=cb;
						return		GE_TRUE;
					}
				}
			}
		}
	}
	return	GE_FALSE;
}

Brush * BrushList_FindFaceParent (const BrushList *pList, const Face *pFace)
{
	Brush *pBrush;

	for (pBrush = pList->First; pBrush != NULL; pBrush = pBrush->Next)
	{
		switch (pBrush->Type)

		{
			case BRUSH_MULTI :
			{
				Brush *pFound;

				pFound = BrushList_FindFaceParent (pBrush->BList, pFace);
				if (pFound != NULL)
				{
					return pFound;
				}
				break;
			}
			case BRUSH_LEAF :
			case BRUSH_CSG :




			{
				int i;
				for(i=0;i < Brush_GetNumFaces(pBrush);i++)


				{
					Face	*pCheckFace;

					pCheckFace = Brush_GetFace (pBrush, i);
					if (pFace == pCheckFace)
					{
						return pBrush;
					}
				}
				break;;
			}
			default :
				assert (0);
				break;
		}
	}
	return NULL;
}

Brush * BrushList_FindTopLevelFaceParent (const BrushList *pList, const Face *pFace)
{
	Brush *bFound;

	bFound = BrushList_FindFaceParent (pList, pFace);
	if (bFound != NULL)
	{
		bFound = Brush_GetTopLevelParent (pList, bFound);
	}
	return bFound;
}

static	geFloat		dists[256];
static	uint8		sides[256];
static	uint8		fsides[256];

enum SideFlags
{
	SIDE_FRONT	=0,
	SIDE_BACK	=1,
	SIDE_ON		=2,
	SIDE_SPLIT	=3
};


//handle cases where two brushes share a coplanar face
static int	Brush_MostlyOnSide(const Brush *b, const Plane *p)
{
	int		i, side;
	geFloat	max;

	max		=0;
	side	=SIDE_FRONT;
	for(i=0;i < FaceList_GetNumFaces(b->Faces);i++)
	{
		Face_MostlyOnSide(FaceList_GetFace(b->Faces, i), p, &max, &side);
	}
	return	side;
}

//Split the original brush by the face passed in returning
//the brush in front of and the brush behind the 
//face passed in.  
//front and back brush pointers should be null on entry
void	Brush_SplitByFace(Brush	*ogb,	//original brush
						  Face	*sf,	//split face
						  Brush	**fb,	//front brush
						  Brush	**bb)	//back brush
{
	const Plane	*p;
	int			i;
	uint8		cnt[3], fcnt[4];
	FaceList	*fl, *bl;
	const Face	*f;
	Face		*cpf, *ff, *bf, *midf;
	geBoolean	WasSplit	=GE_FALSE;

	assert(ogb);
	assert

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区在线不卡| 欧美日韩亚洲综合在线| 日本在线不卡一区| 亚洲第一成年网| 午夜精品免费在线| 日本欧美韩国一区三区| 麻豆久久久久久| 国产麻豆成人精品| 99精品视频一区| 精品视频999| 日韩午夜电影av| 国产日产欧美精品一区二区三区| 精品99久久久久久| 国产日韩欧美综合一区| 亚洲欧洲av一区二区三区久久| 亚洲色图欧洲色图| 日本中文一区二区三区| 黄一区二区三区| 91视频免费看| 91精品国产美女浴室洗澡无遮挡| 精品国产自在久精品国产| 国产午夜精品久久久久久免费视 | 捆绑调教美女网站视频一区| 精品综合免费视频观看| 国产成人精品三级麻豆| 91成人国产精品| xnxx国产精品| 亚洲精品乱码久久久久久黑人| 日韩精品乱码免费| 懂色av一区二区夜夜嗨| 欧美日韩一区二区在线视频| 精品国产自在久精品国产| 成人免费在线视频观看| 日本一不卡视频| 丁香网亚洲国际| 欧美肥大bbwbbw高潮| 国产精品水嫩水嫩| 喷水一区二区三区| 色偷偷一区二区三区| 精品国产乱码久久久久久久 | 日韩一区二区三区电影| 国产精品丝袜91| 久久国产视频网| 欧美在线一二三| 国产精品美女久久久久久2018 | 成人在线视频首页| 欧美一级爆毛片| 亚洲欧美福利一区二区| 国内精品久久久久影院色| 欧美区在线观看| 亚洲另类一区二区| 成人小视频在线观看| 欧美大胆人体bbbb| 日韩国产欧美三级| 欧美无乱码久久久免费午夜一区 | 欧美福利视频导航| 国产精品不卡一区| 国产成人免费视| 久久综合中文字幕| 免费高清视频精品| 欧美精品一二三| 图片区小说区国产精品视频| 91一区二区在线| 亚洲精选视频在线| 99视频国产精品| 亚洲私人黄色宅男| 99国产精品久久久久久久久久久| 中文字幕乱码久久午夜不卡| 国产91丝袜在线观看| 久久人人爽人人爽| 国产一区二区三区久久久| 精品久久人人做人人爽| 久久精品久久99精品久久| 欧美一级精品在线| 精品一区二区三区久久| 久久综合资源网| 国产成人在线视频网址| 国产精品欧美一级免费| 91一区二区在线观看| 亚洲已满18点击进入久久| 欧美人伦禁忌dvd放荡欲情| 丝袜国产日韩另类美女| 日韩一区二区在线播放| 久久激情综合网| 久久久综合精品| 99久久精品免费| 又紧又大又爽精品一区二区| 欧美色图天堂网| 久久电影网站中文字幕| 久久精品男人的天堂| 99久久久国产精品免费蜜臀| 一区二区三区在线观看动漫| 欧美军同video69gay| 久草精品在线观看| 国产精品成人一区二区艾草| 欧美三级中文字| 久久成人免费日本黄色| 中文字幕中文字幕一区| 欧美精品高清视频| 国产激情视频一区二区三区欧美| 亚洲欧美一区二区久久| 欧美高清视频不卡网| 国产精品2024| 亚洲国产一区二区视频| 精品日韩成人av| 色婷婷综合五月| 国产在线精品一区二区| 亚洲蜜臀av乱码久久精品蜜桃| 日韩一区二区三区视频| av不卡免费电影| 日韩avvvv在线播放| 中文字幕一区二区在线播放| 91精品国产乱码| 91在线观看美女| 蜜桃在线一区二区三区| 一区二区三区中文字幕电影 | 亚洲人成精品久久久久| 日韩视频一区二区| 色综合久久久久久久久久久| 日本在线观看不卡视频| 一区二区三区中文字幕精品精品 | 亚洲精品午夜久久久| 精品国产成人在线影院| 欧美日韩一本到| 99在线精品一区二区三区| 国产九色sp调教91| 日本不卡在线视频| 亚洲永久精品国产| 中文字幕一区二区三区四区| 久久伊人中文字幕| 日韩欧美精品在线视频| 欧美日韩久久久| 日本韩国欧美国产| 成人久久18免费网站麻豆| 狠狠色丁香婷婷综合久久片| 亚洲第一在线综合网站| 亚洲自拍欧美精品| 亚洲综合色噜噜狠狠| 亚洲欧洲日产国码二区| 国产欧美精品区一区二区三区 | 97精品久久久久中文字幕| 国产在线不卡一卡二卡三卡四卡| 日韩**一区毛片| 亚洲va国产va欧美va观看| 亚洲乱码一区二区三区在线观看| 国产精品不卡视频| 亚洲视频狠狠干| 最新热久久免费视频| 中文字幕一区二区视频| 成人免费在线观看入口| 亚洲欧美日韩国产手机在线| 国产精品久久777777| 亚洲三级在线免费| 一区二区三区免费看视频| 亚洲精品成人悠悠色影视| 亚洲免费观看高清完整版在线观看熊 | 男男gaygay亚洲| 日本一区中文字幕| 国内成+人亚洲+欧美+综合在线| 久久激情五月婷婷| 国产suv一区二区三区88区| 粉嫩13p一区二区三区| av一区二区不卡| 在线观看视频一区二区欧美日韩| 91国偷自产一区二区三区成为亚洲经典 | 欧美色图天堂网| 91精品国模一区二区三区| 91精品国产黑色紧身裤美女| 日韩视频免费观看高清完整版在线观看 | 欧美男女性生活在线直播观看| 9191久久久久久久久久久| 日韩欧美一二区| 久久人人超碰精品| 亚洲精品视频免费观看| 石原莉奈一区二区三区在线观看 | 亚洲裸体在线观看| 亚洲国产欧美在线人成| 六月丁香综合在线视频| 国产成人免费在线视频| 欧美午夜片在线看| 亚洲精品在线免费观看视频| 国产精品欧美一级免费| 日韩电影在线免费看| 成人精品gif动图一区| 欧美视频在线一区二区三区 | 一区二区三区在线观看视频| 日本成人在线看| 成人av在线播放网站| 欧美日韩一区二区在线观看视频| 久久精品视频在线免费观看| 一区二区欧美视频| 国产aⅴ综合色| 欧美日韩国产经典色站一区二区三区 | 精品美女在线播放| 亚洲啪啪综合av一区二区三区| 六月婷婷色综合| 欧美日韩www| 亚洲人成小说网站色在线| 国内精品国产成人国产三级粉色| 日本精品视频一区二区三区|