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

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

?? brush.cpp

?? 3D游戲場景編輯器
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
/****************************************************************************************/
/*  brush.c                                                                             */
/*                                                                                      */
/*  Author:       Jim Mischel, Ken Baird, Jeff Lomax, John Pollard                      */
/*  Description:  Brush management, io, csg, list management, and transform operations  */
/*                                                                                      */
/*  The contents of this file are subject to the Genesis3D Public License               */
/*  Version 1.01 (the "License"); you may not use this file except in                   */
/*  compliance with the License. You may obtain a copy of the License at                */
/*  http://www.genesis3d.com                                                            */
/*                                                                                      */
/*  Software distributed under the License is distributed on an "AS IS"                 */
/*  basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See                */
/*  the License for the specific language governing rights and limitations              */
/*  under the License.                                                                  */
/*                                                                                      */
/*  The Original Code is Genesis3D, released March 25, 1999.                            */
/*Genesis3D Version 1.1 released November 15, 1999                            */
/*  Copyright (C) 1999 WildTangent, Inc. All Rights Reserved           */
/*                                                                                      */
/*  Modified by Tom Morris for GenEdit-Classic ver. 0.57, Feb. 3, 2001					*/
/****************************************************************************************/
#include "StdAfx.h"
#include "Globals.h"
#include "brush.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <assert.h>
#include "Vec3d.h"
#include "basetype.h"
#include "typeio.h"
#include "facelist.h"
#include "units.h"
#include "ram.h"
#include "util.h"
//#include "ConsoleTab.h"	//for conprintf
#include "Globals.h"

/*
	Our brushes work as three different objects.  The basic square box is a leaf brush
	that contains the original verts and info from the template dialog.  Leaf brushes
	will have a facelist, and possibly a brushlist containing pieces of the original
	brush that have been cut up by others.  Leaf is a bit confusing, since these
	brushes aren't actually leaf regions in a tree or anything.
	
	Multi brushes such as hollows and arches and other nonconvex brushes will contain
	a series of leaf brushes.  Multi brushes should contain no faces themselves.

	CSG brushes are the end result of cuts.  They are stored beneath the parent leaf.

	Brushes are not exclusive to volume in our system.  We don't csg multiple solid
	areas away.  Only drastic content changes will cause this. (cuts)

	There's alot of work done to keep the data structures hidden to other files.  This
	is a standard practice here at WildTangent and brush, face, facelist are all good
	examples of how "opaque" objects work.
*/


static const int		axidx[3][2]	={ 2, 1, 0, 2, 0, 1 };
static const geVec3d	VecOrigin	={ 0.0f, 0.0f, 0.0f };


struct tag_BrushList
{
	Brush *First;
	Brush *Last;
};

#define	VectorToSUB(a, b)			(*((((geFloat *)(&a))) + (b)))
#define	VCOMPARE_EPSILON			0.001f
#define BOGUS_RANGE					32000.0f

enum BrushFlags
{
	BRUSH_SOLID			=0x0001,
	BRUSH_WINDOW		=0x0002, 
	BRUSH_WAVY			=0x0004,
	BRUSH_DETAIL		=0x0008,	//not included in vis calculations		
	BRUSH_HOLLOWCUT		=0x0010,
	BRUSH_TRANSLUCENT	=0x0020,
	BRUSH_EMPTY			=0x0040,
	BRUSH_SUBTRACT		=0x0080,
	BRUSH_CLIP			=0x0100,
	BRUSH_FLOCKING		=0x0200,	
	BRUSH_HOLLOW		=0x0400,
	BRUSH_SHEET			=0x0800,
	BRUSH_HIDDEN		=0x1000,
	BRUSH_LOCKED		=0x2000,
	BRUSH_HINT			=0x4000,
	BRUSH_AREA			=0x8000
	// All flags larger than 0x8000 (i.e. 0x00010000 through 0x80000000)
	// are reserved for user contents.
};

// Brush flags output to GBSPLIB
enum
{
	bfSolid			= (1<<0),
	bfWindow		= (1<<1),
	bfEmpty			= (1<<2),
	bfTranslucent	= (1<<3),
	bfWavy			= (1<<4),
	bfDetail		= (1<<5),
	bfClip			= (1<<6),
	bfHint			= (1<<7),
	bfArea			= (1<<8),
	bfFlocking		= (1<<9),
	bfSheet			= (1<<10)
	// flags 11 through 15 are reserved for future expansion.
	// flags 16 through 31 are user flags.
};

#define USER_FLAGS_MASK		(0xffff0000ul)
#define SYSTEM_FLAGS_MASK	(0x0000fffful)

// brush edit flags (not currently used, but please don't remove)
enum
{
	befHidden		= (1<<0),
	befLocked		= (1<<1),
	befSelected		= (1<<2),
	befEntity		= (1<<3),
//	befTexInvalid	= (1<<4),
	befHollow		= (1<<5),
	befRing			= (1<<6)
};
/*
typedef struct BrushTag		//	moved to brush.h for g3dc
{
	struct BrushTag	*Prev, *Next;
	FaceList		*Faces;			//null if multibrush
	BrushList		*BList;			//null if csgbrush
	unsigned long	Flags;
	int				Type;
	int				ModelId;
	int				GroupId;
	geFloat			HullSize;		//for hollows
	uint32			Color;
	char			*Name;
	Box3d			BoundingBox;
} Brush;
*/

typedef void (*BrushList_FlagCB)(Brush *pBrush, const geBoolean bState);
typedef void (*BrushList_IntCB)(Brush *pBrush, const int iVal);
typedef void (*BrushList_FloatCB)(Brush *pBrush, const float fVal);
typedef void (*BrushList_Uint32CB)(Brush *pBrush, const uint32 uVal);

static void	BrushList_SetFlag(BrushList *bl, const geBoolean bState, BrushList_FlagCB cbSetFlag)
{
	Brush	*b;

	if (bl == NULL)
		MessageBox(NULL, "Brush1 == NULL", "BrushList_SetFlag", MB_OK);	//	post 0.55

	assert(bl != NULL);

	for(b=bl->First;b;b=b->Next)
	{
		cbSetFlag(b, bState);
	}
}

static void	BrushList_SetInt(BrushList *bl, const int iVal, BrushList_IntCB cbSetInt)
{
	Brush	*b;

	if (bl == NULL)
		MessageBox(NULL, "Brush1 == NULL", "BrushList_SetInt", MB_OK);	//	post 0.55

	assert(bl != NULL);

	for(b=bl->First;b;b=b->Next)
	{
		cbSetInt(b, iVal);
	}
}

static void	BrushList_SetUint32(BrushList *bl, const uint32 uVal, BrushList_Uint32CB cbSetUint)
{
	Brush	*b;

	if (bl == NULL)
		MessageBox(NULL, "Brush1 == NULL", "BrushList_SetUINT32", MB_OK);	//	post 0.55

	assert(bl != NULL);

	for(b=bl->First;b;b=b->Next)
	{
		cbSetUint(b, uVal);
	}
}

static void	BrushList_SetFloat(BrushList *bl, const geFloat fVal, BrushList_FloatCB cbSetFloat)
{
	Brush	*b;

	if (bl == NULL)
		MessageBox(NULL, "Brush1 == NULL", "BrushList_SetFloat", MB_OK);	//	post 0.55

	assert(bl != NULL);

	for(b=bl->First;b;b=b->Next)
	{
		cbSetFloat(b, fVal);
	}
}

Brush	*Brush_Create(int Type, const FaceList *fl, const BrushList *BList)
{
	Brush	*pBrush;

	pBrush	=(Brush*)geRam_Allocate(sizeof (Brush));
	if(pBrush != NULL)
	{
		pBrush->Prev	=NULL;
		pBrush->Next	=NULL;
		pBrush->ModelId	=0;
		pBrush->GroupId	=0;
		pBrush->HullSize=1.0f;
		pBrush->Color	=0;
		pBrush->Name	=Util_Strdup("NoName");
		pBrush->Type	=Type;
		switch(Type)
		{
		case	BRUSH_MULTI:
			assert(fl==NULL);
			assert(BList);

			pBrush->Faces	=NULL;
			pBrush->BList	=(BrushList *)BList;
			pBrush->Flags	=BRUSH_SOLID;
			BrushList_GetBounds(BList, &pBrush->BoundingBox);
			break;

		case	BRUSH_LEAF:
		case	BRUSH_CSG:
			assert(fl);
			assert(BList==NULL);	//shouldn't create leaf from multiple

			pBrush->Faces	=(FaceList *)fl;
			pBrush->BList	=NULL;
			pBrush->Flags	=BRUSH_SOLID;
			FaceList_GetBounds(fl, &pBrush->BoundingBox);
			break;

		default:
			assert(0);
		}
	}
	return pBrush;
}

//creates a csg brush from a leaf or csg brush
static Brush	*Brush_CreateFromParent(const Brush *ParentBrush, const FaceList *fl)
{
	Brush	*pBrush;

	if (ParentBrush == NULL)
		MessageBox(NULL, "ParentBrush == NULL", "Brush_CreateFromParent", MB_OK);	//	post 0.55


	assert(ParentBrush);
	assert(fl != NULL);
	assert(ParentBrush->Type!=BRUSH_MULTI);

	pBrush	= (BrushTag*)geRam_Allocate(sizeof (Brush));
	if(pBrush != NULL)
	{
		pBrush->Prev	=NULL;
		pBrush->Next	=NULL;
		pBrush->Faces	=(FaceList *)fl;
		pBrush->BList	=NULL;
		pBrush->Flags	=ParentBrush->Flags;
		pBrush->ModelId	=ParentBrush->ModelId;
		pBrush->GroupId	=ParentBrush->GroupId;
		pBrush->HullSize=ParentBrush->HullSize;
		pBrush->Color	=ParentBrush->Color;
		pBrush->Name	=Util_Strdup(ParentBrush->Name);
		pBrush->Type	=BRUSH_CSG;
		FaceList_GetBounds(fl, &pBrush->BoundingBox);
	}
	return pBrush;
}

void	Brush_Destroy(Brush **b)
{
	if (b == NULL)
	{
		MessageBox(NULL, "Brush == NULL", "Brush_Destroy", MB_OK);	//	post 0.55
		return;
	}

	if (*b == NULL)
	{
		MessageBox(NULL, "Brush == NULL", "Brush_Destroy", MB_OK);	//	post 0.55
		return;
	}

	if ((*b)->Prev != NULL)
	{
		MessageBox(NULL, "Brush->Prev == NULL", "Brush_Destroy", MB_OK);	//	post 0.55
		return;
	}

	if ((*b)->Next != NULL)
	{
		MessageBox(NULL, "Brush->Next == NULL", "Brush_Destroy", MB_OK);	//	post 0.55
		return;
	}

	
	assert(b != NULL);
	assert(*b != NULL);
	assert((*b)->Prev == NULL);
	assert((*b)->Next == NULL);

	if((*b)->Type!=BRUSH_CSG)
	{
		if((*b)->BList)
		{
			BrushList_Destroy(&((*b)->BList));
		}
	}
	if((*b)->Type!=BRUSH_MULTI)
	{
		if((*b)->Faces)
		{
			FaceList_Destroy(&((*b)->Faces));
		}
	}

	if((*b)->Name)
	{
		geRam_Free ((*b)->Name);
	}
	geRam_Free (*b);
	*b	=NULL;
}

Brush	*Brush_Clone(Brush const *from)
{
	Brush		*to = NULL;
	FaceList	*NewFaces;
	BrushList	*MBList;

	if (from == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_Clone", MB_OK);	//	post 0.55

	assert(from != NULL);

	switch(from->Type)
	{
	case	BRUSH_MULTI:
		assert(from->Faces==NULL);
		assert(from->BList);

		MBList	=BrushList_Clone(from->BList);
		if(!MBList)
		{
			break;
		}
		to		=Brush_Create(from->Type, NULL, MBList);	
		break;

	case	BRUSH_LEAF:
	case	BRUSH_CSG:
		assert(from->Faces != NULL);

		NewFaces	=FaceList_Clone(from->Faces);
		if(NewFaces != NULL)
		{
			to	=Brush_Create(from->Type, NewFaces, NULL);
		}
		if(to==NULL)
		{
			geRam_Free (NewFaces);
		}
		break;

	default:
		assert(0);
		break;
	}

	if(to != NULL)
	{
		to->Flags		=from->Flags;
		to->Type		=from->Type;
		to->ModelId		=from->ModelId;
		to->GroupId		=from->GroupId;
		to->HullSize	=from->HullSize;
		to->Color		=from->Color;
		Brush_SetName (to, from->Name);
		to->BoundingBox	=from->BoundingBox;
	}

	return	to;
}

static void	Brush_CopyFaceInfo(Brush const *src, Brush *dst)
{
	assert(src);
	assert(dst);
	assert(src->Type!=BRUSH_MULTI);
	assert(dst->Type!=BRUSH_MULTI);
	assert(src->Faces);
	assert(dst->Faces);

	FaceList_CopyFaceInfo(src->Faces, dst->Faces);
}

int	Brush_GetNumFaces(const Brush *b)
{
	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_GetNumFaces", MB_OK);	//	post 0.55

	if (b->Faces == NULL)
		MessageBox(NULL, "Brush->Faces == NULL", "Brush_GetNumFaces", MB_OK);	//	post 0.55

	assert(b != NULL);
	assert(b->Faces != NULL);

	return	FaceList_GetNumFaces(b->Faces);
}

Face *Brush_GetFace(const Brush *b, int i)
{
	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_GetFaces", MB_OK);	//	post 0.55

	if (b->Faces == NULL)
		MessageBox(NULL, "Brush->Faces == NULL", "Brush_GetFaces", MB_OK);	//	post 0.55

	assert(b != NULL);
	assert(b->Faces != NULL);

	return	FaceList_GetFace(b->Faces, i);
}

int	Brush_GetModelId(const Brush *b)
{
	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_GetModelId", MB_OK);	//	post 0.55
	
	assert(b != NULL);

	return	b->ModelId;
}

int	Brush_GetGroupId(const Brush *b)
{
	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_GetGroupId", MB_OK);	//	post 0.55

	assert(b != NULL);
	
	return	b->GroupId;
}

geFloat	Brush_GetHullSize(const Brush *b)
{
	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_GetHullSize", MB_OK);	//	post 0.55

	assert(b != NULL);

	return	b->HullSize;
}

uint32	Brush_GetColor(const Brush *b)
{
	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_GetColor", MB_OK);	//	post 0.55
	
	assert(b != NULL);
	
	return	b->Color;
}

int			Brush_GetType (const Brush *b)
{
	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_GetType", MB_OK);	//	post 0.55
	
	return b->Type;
}

const char	*Brush_GetName(const Brush *b)
{
	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_GetName", MB_OK);	//	post 0.55

	assert(b != NULL);
	
	//are empty names ok?
	return	b->Name;
}

const BrushList	*Brush_GetBrushList(const Brush *b)
{
	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_GetBrushList", MB_OK);	//	post 0.55

	assert(b != NULL);
	
	//are empty names ok?
	return	b->BList;
}


void	Brush_SetModelId(Brush *b, const int mid)
{
	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_SetModelId", MB_OK);	//	post 0.55

	assert(b != NULL);
	
	if (b->Type == BRUSH_MULTI)
	{
		BrushList_SetInt (b->BList, mid, Brush_SetModelId);
	}
	b->ModelId	=mid;
}

//should this be set in child brushes too?
void	Brush_SetGroupId(Brush *b, const int gid)
{
	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_SetGroupId", MB_OK);	//	post 0.55

	assert(b != NULL);
	
	if (b->Type == BRUSH_MULTI)
	{
		BrushList_SetInt (b->BList, gid, Brush_SetGroupId);
	}
	b->GroupId	=gid;
}

void	Brush_SetHullSize(Brush *b, const geFloat hsize)
{
	geFloat RealHullSize = hsize;

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

	assert(b != NULL);

	if (hsize < 1.0f)
	{
		RealHullSize = 1.0f;
	}
	if(b->Type==BRUSH_MULTI)
	{
		BrushList_SetFloat(b->BList, RealHullSize, Brush_SetHullSize);
	}

	b->HullSize	=RealHullSize;
}

void	Brush_SetColor(Brush *b, const uint32 newcolor)
{
	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_SetColor", MB_OK);	//	post 0.55

	assert(b != NULL);
	
	if(b->Type==BRUSH_MULTI)
	{
		BrushList_SetUint32(b->BList, newcolor, Brush_SetColor);
	}
	b->Color	=newcolor;
}

//should these go to child brushes?
void	Brush_SetName(Brush *b, const char *newname)
{
	if (b == NULL)
		MessageBox(NULL, "Brush == NULL", "Brush_SetName", MB_OK);	//	post 0.55

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩成人高清| 中文字幕国产一区| 久久这里只有精品视频网| 国产亚洲一区二区三区四区| 一区二区三区欧美日韩| 国产麻豆视频一区| 欧美系列日韩一区| 中文字幕中文字幕在线一区| 九九精品视频在线看| 91黄色小视频| 国产精品女主播av| 久久狠狠亚洲综合| 欧美日韩在线免费视频| 亚洲婷婷国产精品电影人久久| 美女一区二区三区在线观看| 欧美亚洲动漫制服丝袜| 最新热久久免费视频| 国产成人综合网| 欧美一级高清大全免费观看| 亚洲一区二区免费视频| 99国产精品久| 国产精品对白交换视频| 成人综合婷婷国产精品久久蜜臀 | 久久精品国产色蜜蜜麻豆| 色综合夜色一区| 国产精品久线观看视频| 国产 日韩 欧美大片| 精品粉嫩超白一线天av| 另类中文字幕网| 日韩欧美国产午夜精品| 麻豆精品在线看| 欧美videos中文字幕| 久久精品久久精品| 日韩一卡二卡三卡| 久草中文综合在线| 日韩欧美自拍偷拍| 久久99热99| 精品免费一区二区三区| 美女视频黄免费的久久| 精品国产91乱码一区二区三区| 久久精品国产在热久久| 久久免费看少妇高潮| 国产精品1区2区| 国产欧美日韩中文久久| 成人黄色小视频| 一区二区三区精品视频| 7777精品伊人久久久大香线蕉| 男女男精品网站| 日本一区二区三区在线观看| 国产99精品国产| 亚洲色图.com| 7777精品伊人久久久大香线蕉超级流畅| 午夜精品福利久久久| 日韩欧美国产小视频| 国产成人午夜99999| 日韩一区有码在线| 6080午夜不卡| 国产成人丝袜美腿| 一级特黄大欧美久久久| 日韩区在线观看| 丁香桃色午夜亚洲一区二区三区| 最新高清无码专区| 欧美一区二区三区视频在线 | 亚洲自拍偷拍网站| 91精品国产综合久久小美女| 狠狠色丁香久久婷婷综合_中| 中文字幕的久久| 欧美日韩你懂的| 国产91高潮流白浆在线麻豆| 一区二区三区在线高清| 精品国产乱子伦一区| 色网站国产精品| 日韩av一区二区在线影视| 国产精品无码永久免费888| 欧美亚洲动漫精品| 懂色av一区二区在线播放| 亚洲va欧美va人人爽| 国产精品剧情在线亚洲| 欧美大片日本大片免费观看| 91久久香蕉国产日韩欧美9色| 久久av中文字幕片| 亚洲电影在线免费观看| 中文字幕av一区 二区| 欧美一级高清片在线观看| 色悠悠亚洲一区二区| 国产尤物一区二区| 日韩国产欧美一区二区三区| 日韩理论片中文av| 久久只精品国产| 91麻豆精品国产91久久久更新时间| 高清av一区二区| 看国产成人h片视频| 午夜免费久久看| 最新欧美精品一区二区三区| 国产日韩视频一区二区三区| 91精品国产色综合久久ai换脸| 色哟哟一区二区三区| 成人免费观看男女羞羞视频| 韩日精品视频一区| 免费成人小视频| 肉肉av福利一精品导航| 亚洲成人在线观看视频| 亚洲乱码国产乱码精品精可以看| 国产精品嫩草影院av蜜臀| 久久蜜桃一区二区| 日韩三级高清在线| 欧美一区二区三区电影| 欧美久久久久久久久| 欧美日韩一区二区在线视频| 欧美亚洲综合久久| 一本到高清视频免费精品| 色综合一个色综合亚洲| 91亚洲大成网污www| 99国产欧美另类久久久精品| caoporn国产精品| av一区二区不卡| 97久久精品人人做人人爽50路| 国产大陆精品国产| 成人精品电影在线观看| av一本久道久久综合久久鬼色| a级高清视频欧美日韩| av亚洲产国偷v产偷v自拍| 99热在这里有精品免费| 91麻豆国产香蕉久久精品| 欧美中文字幕一区二区三区| 欧美丰满一区二区免费视频| 91精品免费观看| 久久久蜜桃精品| 亚洲国产精品二十页| 亚洲日本青草视频在线怡红院| 亚洲精品久久久蜜桃| 亚洲成人av免费| 久久精品国产免费| 国产a精品视频| 在线区一区二视频| 51精品久久久久久久蜜臀| 欧美大尺度电影在线| 国产午夜亚洲精品午夜鲁丝片| 国产精品乱码妇女bbbb| 亚洲激情欧美激情| 蜜臀av性久久久久蜜臀aⅴ| 国产精品影视在线| 91丨九色丨黑人外教| 欧美日本韩国一区二区三区视频 | 一区二区三区在线影院| 亚洲成人精品一区| 奇米在线7777在线精品| 国产麻豆精品在线观看| 91九色02白丝porn| 日韩精品一区二区三区中文不卡| 国产欧美精品日韩区二区麻豆天美| 亚洲美女视频在线观看| 蜜桃一区二区三区四区| 99久久99久久久精品齐齐| 欧美精品第1页| 欧美激情一区二区在线| 午夜精品一区二区三区三上悠亚| 久久91精品久久久久久秒播| 色综合激情久久| 久久奇米777| 天堂成人免费av电影一区| 国产激情一区二区三区桃花岛亚洲| 欧美在线观看一区二区| 日本一区二区在线不卡| 日本亚洲天堂网| 91蝌蚪国产九色| 久久久久88色偷偷免费| 午夜免费欧美电影| 91网站黄www| 久久久久国产免费免费| 秋霞电影一区二区| 91国在线观看| 中文字幕va一区二区三区| 美女一区二区视频| 91成人网在线| 中文字幕在线一区免费| 国产一区二区三区在线看麻豆| 欧美三区免费完整视频在线观看| 国产精品久久三区| 狠狠久久亚洲欧美| 日韩一区二区影院| 亚洲一级二级三级| 91啪亚洲精品| 国产精品国产三级国产aⅴ中文| 精品午夜久久福利影院| 欧美一二区视频| 天天色 色综合| 欧美偷拍一区二区| 亚洲男人的天堂在线aⅴ视频| 成人av在线观| 中文字幕第一区二区| 国产成人免费在线| 久久久蜜桃精品| 国内精品国产成人国产三级粉色 | 午夜精品久久久久影视| 色8久久精品久久久久久蜜 | 精品国产自在久精品国产| 日韩成人免费在线| 欧美日韩国产精品自在自线| 亚洲第四色夜色|