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

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

?? cpolygonobject.cpp

?? JAVA3D游戲
?? CPP
字號:
    /*
    *
============================================================================
    *  Name     : CPolygonObject.cpp
    *  Part of  : Example3D
    *  Created  : 12/14/2003 by Forum Nokia
    *  Description:
    *     This is the project specification file for Example3D.
    *     Initial content was generated by Series 60 AppWizard.
    *
    *  Version  : 1.0.0
    *  Copyright: Forum Nokia
    *
============================================================================
    */

// INCLUDES
#include "CPolygonObject.h"
#include <e32math.h>
#include <e32svr.h>		// for debug prints

// CONSTANTS

const TInt KZShift = 23;
const TInt KZMul = ( 1 << KZShift );

// MEMBER FUNCTIONS

CPolygonObject* CPolygonObject::NewL( C3DBase* a3DBase, TInt aNumVertices, TInt aNumFaces )
	{
	CPolygonObject* self = new( ELeave )CPolygonObject( a3DBase, aNumVertices, aNumFaces );
	CleanupStack::PushL( self );
	self->ConstructL();
	CleanupStack::Pop( self );
	return self;
	}

CPolygonObject::~CPolygonObject()
	{
	delete iFace;
	delete iVertex;
	delete iRVertex;

	delete iDrawList;
	delete iFaceZ;
	delete iFaceN;
	}

CPolygonObject::CPolygonObject( C3DBase* a3DBase, TInt aNumVertices, TInt aNumFaces )
	: i3DBase( a3DBase )
	, iMaxNumVertices( aNumVertices )
	, iMaxNumFaces( aNumFaces )
	{
	}

void CPolygonObject::ConstructL()
	{
	iFace = new( ELeave )TFace[ iMaxNumFaces ];
	iVertex = new( ELeave )TVertex[ iMaxNumVertices ];
	iRVertex = new( ELeave )TVertex[ iMaxNumVertices ];

	iCos = i3DBase->CosTable();
	iSin = i3DBase->SinTable();

	iFaceN = new( ELeave )TInt[ iMaxNumFaces ];
	iFaceZ = new( ELeave )TInt[ iMaxNumFaces ];
	iDrawList = new( ELeave )TDrawFace[ iMaxNumFaces ];

	}


void CPolygonObject::Draw( const TBitmap& aScreen, TMatrix* aRotateMatrix )
	{
	// rotate matrix from C3DRenderer
	iRotateMatrix = aRotateMatrix;

	iScreen = aScreen;

	TFrustum& frustum = i3DBase->ViewFrustum();

	// rotate vertices to iRVertex list
	Rotate();
	
	// clipped triangle has more than 3 vertices:
	TDrawVertex polygon1[ 10 ];
	TDrawVertex polygon2[ 10 ];

	TBool clipped;
	TInt  inCount = 0;

	// polygon's vertex distance from clipping plane
	TInt d[ 10 ];

	TInt numDrawn = 0;

	TInt i;
	for( i=0; i<iNumFaces; i++ )
		{
		TBool visible = ETrue;
		clipped = EFalse;

		TFace& f = iFace[ i ];

		TVertex& v1 = iRVertex[ f.iV1 ];
		TVertex& v2 = iRVertex[ f.iV2 ];
		TVertex& v3 = iRVertex[ f.iV3 ];


		polygon1[ 0 ] = TDrawVertex( v1, f.iTx1, f.iTy1 );
		polygon1[ 1 ] = TDrawVertex( v2, f.iTx2, f.iTy2 );
		polygon1[ 2 ] = TDrawVertex( v3, f.iTx3, f.iTy3 );

		TDrawVertex* poly1 = polygon1;
		TDrawVertex* poly2 = polygon2;

		TInt numPoints = 3;


		for( TInt n=0; n<frustum.iNumPlanes; n++ )
			{
			TInt vn = numPoints;
			TInt p;

			for( p=0; p<numPoints; p++ )
				{
				TVertex& mv1 = frustum.iPlane[ n ].iNormal;
				TDrawVertex& mv2 = poly1[ p ];
				
				// calculate dot product to get point distance to plane:
				TInt l = mv1.iX * mv2.iX + mv1.iY * mv2.iY + mv1.iZ * mv2.iZ;
				l += frustum.iPlane[ n ].iDistance;
				if( l <= 0 ) vn--;
				d[ p ] = l;
				inCount++;
				}

			if( vn == numPoints )
				{
				// all visible, do not clip
				continue;
				}

			if( vn == 0 )
				{
				// none visible, do not draw, do not continue clipping
				visible = EFalse;
				break;
				}
			
			clipped = ETrue;

			TInt np = 0;

			for( TInt p1=0; p1<numPoints; p1++ )
				{
				
				TInt p0 = p1-1;
				TInt p2 = p1+1;
				if( p0<0 ) p0 += numPoints;
				if( p2>=numPoints ) p2 -= numPoints;

				TDrawVertex& dv0 = poly1[ p0 ];
				TDrawVertex& dv1 = poly1[ p1 ];
				TDrawVertex& dv2 = poly1[ p2 ];

				// if point is out of plane, check if one or more points can be
				// added to drawarea's edge in straight line to other points
				// ( actual clipping )
				if( d[ p1 ] < 0 )
					{
					
					if( d[ p0 ] > 0 )
						{
						TInt s = ( d[ p0 ] << KShift ) / ( d[ p0 ]-d[ p1 ] );
						poly2[ np ].iX = dv0.iX + ( ( s*( dv1.iX - dv0.iX ) ) >> KShift );
						poly2[ np ].iY = dv0.iY + ( ( s*( dv1.iY - dv0.iY ) ) >> KShift );
						poly2[ np ].iZ = dv0.iZ + ( ( s*( dv1.iZ - dv0.iZ ) ) >> KShift );
						poly2[ np ].iTx = dv0.iTx + ( ( s*( dv1.iTx - dv0.iTx ) ) >> KShift );
						poly2[ np ].iTy = dv0.iTy + ( ( s*( dv1.iTy - dv0.iTy ) ) >> KShift );
						np++;
						}
					if( d[ p2 ] > 0 )
						{
						TInt s = ( d[ p2 ] << KShift ) / ( d[ p2 ]-d[ p1 ] );
						poly2[ np ].iX = dv2.iX + ( ( s*( dv1.iX - dv2.iX ) ) >> KShift );
						poly2[ np ].iY = dv2.iY + ( ( s*( dv1.iY - dv2.iY ) ) >> KShift );
						poly2[ np ].iZ = dv2.iZ + ( ( s*( dv1.iZ - dv2.iZ ) ) >> KShift );
						poly2[ np ].iTx = dv2.iTx + ( ( s*( dv1.iTx - dv2.iTx ) ) >> KShift );
						poly2[ np ].iTy = dv2.iTy + ( ( s*( dv1.iTy - dv2.iTy ) ) >> KShift );
						np++;
						}
					

					}
				else
					{
					poly2[ np++ ] = poly1[ p1 ];
					}
				}

			numPoints = np;

			TDrawVertex* temp = poly1; 
			poly1 = poly2; 
			poly2 = temp;
			}
				
		TInt t;
		if( visible )
			{
			if( numDrawn < iMaxNumFaces )
				{
				// split polygon to triangles:
				// ( polygon draw other but triangles are not supported )
				for( t=0; t<numPoints-2; t++ )
					{
					iDrawList[ numDrawn++ ] = TDrawFace( poly1[ 0 ], poly1[ 1 + t ], poly1[ 2 + t ] );
					}
				}
			}
		}

	// draw if there's something to draw
	if( numDrawn > 0 )
		{
		// project vertices in iRVertex list to screen coordinates
		Project( iDrawList, numDrawn );

		// sort faces by their Z-values

		for( i=0; i<numDrawn; i++ )
			{
			TDrawFace& f = iDrawList[ i ];
			iFaceZ[ i ] = f.iV1.iZ + f.iV2.iZ + f.iV3.iZ;
			iFaceN[ i ] = i;
			}

		i3DBase->QSort( iFaceZ, iFaceN, 0, numDrawn-1 );


		// and draw faces from back to front
		for( i=numDrawn-1; i>=0; i-- )
			{
			TDrawFace& f = iDrawList[ iFaceN[ i ] ];
			// textured
			DrawTexTri( &f.iV1, &f.iV2, &f.iV3 );
			
			// textured, perspective correct
			//DrawTexTriZ( &f.iV1, &f.iV2, &f.iV3 );

			}

		}


	}

void CPolygonObject::SetTexture( TUint16* aTexture )
	{
	iTexture = aTexture;
	}


TInt CPolygonObject::AddVertex( const TVertex& aVertex )
	{
	__ASSERT_DEBUG( iNumVertices < iMaxNumVertices, User::Panic( _L("Too many vertices"), iNumVertices ) );

	iVertex[ iNumVertices++ ] = aVertex;

	return iNumVertices-1;
	}

void CPolygonObject::SetVertex( TInt aIndex, const TVertex& aVertex )
	{
	__ASSERT_DEBUG( aIndex < iNumVertices, User::Panic( _L("Illegal vertex index"), aIndex ) );

	iVertex[ aIndex ] = aVertex;
	}

TInt CPolygonObject::AddFace( const TFace& aFace )
	{
	__ASSERT_DEBUG( iNumFaces < iMaxNumFaces, User::Panic( _L("Too many faces"), iNumFaces ) );

	iFace[ iNumFaces++ ] = aFace;

	return iNumFaces;
	}

void CPolygonObject::Init()
	{
	//
	// Calculate bounding radius for object clipping
	//
	TInt r = 0;

	TInt i;
	for( i=0; i<iNumVertices; i++ )
		{
		TVertex& v = iVertex[ i ];
		TInt r2 = v.iX * v.iX + v.iY * v.iY + v.iZ * v.iZ;
		if( r2 > r ) r = r2;
		}
	TReal ra;
	Math::Sqrt( ra, r );
	iBoundingRadius = ( TInt )ra;
	

	}


void CPolygonObject::Rotate()
	{
	// multiply all vertices by rotate matrix
	// rotate matrix is calculated by C3DRenderer

	for( TInt i=0; i<iNumVertices; i++ )
		{
		iRVertex[ i ] = iVertex[ i ];
		iRVertex[ i ].MulMatrix( iRotateMatrix );
		}
	}


void CPolygonObject::Project( TDrawFace* aFaceList, TInt aNumFaces )
	{
	
	TInt i;
	TInt mx = iScreen.iSize.iWidth / 2;
	TInt my = iScreen.iSize.iHeight / 2;


	for( i=0; i<aNumFaces; i++ )
		{

		TDrawFace& f = aFaceList[ i ];


		f.iV1.iX <<= 9;
		f.iV1.iX /= f.iV1.iZ ;
		f.iV1.iX += mx;

		f.iV1.iY <<= 9;
		f.iV1.iY /= f.iV1.iZ ;
		f.iV1.iY += my;

		f.iV2.iX <<= 9;
		f.iV2.iX /= f.iV2.iZ ;
		f.iV2.iX += mx;

		f.iV2.iY <<= 9;
		f.iV2.iY /= f.iV2.iZ ;
		f.iV2.iY += my;

		f.iV3.iX <<= 9;
		f.iV3.iX /= f.iV3.iZ ;
		f.iV3.iX += mx;

		f.iV3.iY <<= 9;
		f.iV3.iY /= f.iV3.iZ ;
		f.iV3.iY += my;
		
		}

	}




	// disable warning of local variable may be used without initialized
	// these variables are always initialized but compiler doesn't know it.
#pragma warning( disable : 4701 )


void CPolygonObject::DrawTexTri( TDrawVertex* aV1, TDrawVertex* aV2, TDrawVertex* aV3 )
	{

	// backface culling ( only one side of triangle is visible )
	TInt z = ( aV3->iX - aV1->iX ) * ( aV3->iY - aV2->iY ) - ( aV3->iY - aV1->iY ) * ( aV3->iX - aV2->iX );
	if( z <= 0 )
		{
		return;
		}


	// calculate starting points and adders for triangle sides 
	// and texture coordinates

	if( aV1->iY > aV2->iY )
		{
		TDrawVertex* temp = aV1; aV1 = aV2; aV2 = temp;
		}

	if( aV2->iY > aV3->iY )
		{
		TDrawVertex* temp = aV2; aV2 = aV3; aV3 = temp;
		}

	if( aV1->iY > aV2->iY )
		{
		TDrawVertex* temp = aV1; aV1 = aV2; aV2 = temp;
		}

	TInt h1 = ( aV2->iY - aV1->iY );
	TInt h2 = ( aV3->iY - aV2->iY );
	TInt h3 = ( aV3->iY - aV1->iY );

	if( h3 == 0 ) return;

	TInt xAdd1;
	TInt xAdd2;
	TInt xAdd3;

	TInt txAdd1;
	TInt txAdd2;
	TInt txAdd3;

	TInt tyAdd1;
	TInt tyAdd2;
	TInt tyAdd3;

	if( h1 )
		{
		xAdd1 =  ( ( aV2->iX - aV1->iX ) << KShift ) / h1;
		txAdd1 = ( ( aV2->iTx - aV1->iTx ) << 8 ) / h1;
		tyAdd1 = ( ( aV2->iTy - aV1->iTy ) << 8 ) / h1;
		}
	if( h2 )
		{
		xAdd2 =  ( ( aV3->iX - aV2->iX ) << KShift ) / h2;
		txAdd2 = ( ( aV3->iTx - aV2->iTx ) << 8 ) / h2;
		tyAdd2 = ( ( aV3->iTy - aV2->iTy ) << 8 ) / h2;
		}
	if( h3 )
		{
		xAdd3 =  ( ( aV3->iX - aV1->iX ) << KShift ) / h3;
		txAdd3 = ( ( aV3->iTx - aV1->iTx ) << 8 ) / h3;
		tyAdd3 = ( ( aV3->iTy - aV1->iTy ) << 8 ) / h3;
		}

	TInt mul = ( aV2->iY - aV1->iY );

	TInt midX =  ( aV1->iX << 0 )  + ( ( xAdd3 * mul )  >> KShift  );
	TInt midTx = ( aV1->iTx << 8 )  + ( ( txAdd3 * mul ) >> 0  );
	TInt midTy = ( aV1->iTy << 8 )  + ( ( tyAdd3 * mul ) >> 0 );

	TInt w = ( aV2->iX << 0 ) - midX;

	TInt txa = ( aV2->iTx << 8 ) - midTx;
	TInt tya = ( aV2->iTy << 8 )  - midTy;
	
	if( w )
		{
		txa /= w;
		tya /= w;
		}

	// Draw triangle in two parts
	// first upper half and then lower
	// split by mid point
	// Also choose parameters depending which side of triangle
	// has the midpoint


	if( midX < aV2->iX ) // if long side left
		{
		if( h1 ) DrawTexSlice(	aV1->iX, aV1->iX, 
								xAdd3, xAdd1, 
								aV1->iY, aV2->iY,
								aV1->iTx << 8, aV1->iTy << 8,
								txa, tya,
								txAdd3, tyAdd3 );

		if( h2 ) DrawTexSlice(  midX, aV2->iX,
								xAdd3, xAdd2, 
								aV2->iY, aV3->iY, 
								midTx, midTy, 
								txa, tya, 
								txAdd3, tyAdd3 );
		}
	else			 // if long side right
		{
		if( h1 ) DrawTexSlice(  aV1->iX, aV1->iX, 
								xAdd1, xAdd3, 
								aV1->iY, aV2->iY, 
								aV1->iTx << 8, aV1->iTy << 8, 
								txa, tya, 
								txAdd1, tyAdd1 );

		if( h2 ) DrawTexSlice(	aV2->iX, midX, 
								xAdd2, xAdd3, 
								aV2->iY, aV3->iY, 
								aV2->iTx << 8, aV2->iTy << 8, 
								txa, tya, 
								txAdd2, tyAdd2 );		
		}

		
	}
	// enable warning of local variable may be used without initialized
#pragma warning( default : 4701 )


inline void CPolygonObject::DrawTexSlice( TInt aX1, TInt aX2, TInt aX1Add, TInt aX2Add, 
										  TInt aY1, TInt aY2, TInt aTx1, TInt aTy1, 
										  TInt aTxAddX, TInt aTyAddX, TInt aTxAddY, TInt aTyAddY )
	{
	// This function is a bit optimized so the reading might be hard

	TInt tp = aY1 * iScreen.iSize.iWidth;
	tp <<= 1;
	tp += (TInt)iScreen.iData;	// calculate screen address by starting
								// y-position

	TInt h = aY2 - aY1;

	TInt x1 = aX1 << KShift;	// calculate starting x-positions
	TInt x2 = aX2 << KShift;

	// here is combined adders for texture x and y coordinates 
	// to only one integer, high half has the X
	TInt otxa = ( ( aTxAddX & 0xffff ) << 16 ) + ( aTyAddX & 0xffff );
	
	// scan all lines from up to down
	// and fill area from x1 to x2 with texture
	// updates x1 and x2 positions after every line

	for( TInt y=h; y>0; y-- )
		{
		
#ifdef __WINS__

		TUint32 txa = otxa;
		TUint32 tx = ( aTx1 << 16 ) + ( aTy1 & 0xffff );
		TInt w = ( x2-x1 + ( 1 << ( KShift-1 ) ) ) >> KShift;
		TInt sp = (TInt)iTexture;
		TUint16* p = (TUint16*)( tp + ( ( x1 >> KShift ) << 1 ) );
		TInt x;
		
#else
		// compiler has difficulties to optimize right the rendering loop
		// these are helpers to keep all parameters in registers
		// which speeds up the drawing a lot
		// next phase would be writing straight assembler
		// but you can check the code this generates with "ABLD LISTING"
		// -command in "\group" -folder

		register TUint32 txa asm("r0");
		register TInt w asm("r1");
		register TUint32 tx asm("r2");
		register TInt sp asm("r3");
		register TInt x asm("r4");
		
		txa = otxa;
		w = ( x2-x1 ) >> KShift;
		tx = ( aTx1 << 16 ) + ( aTy1 & 0xffff );
		sp = (TInt)iTexture ;
		TUint16* p = (TUint16*)( tp + ( ( x1 >> KShift ) << 1 ) );
#endif
		
		for( x=w; x>=0; x-- )
			{
			TInt cp = ( tx >> 24 ) + ( tx & 0xff00 );
			*p++ = ((TUint16*)sp)[cp];
			tx += txa;
			}
		
		x1 += aX1Add;
		x2 += aX2Add;
		
		aTx1 += aTxAddY;
		aTy1 += aTyAddY;
		
		tp += iScreen.iSize.iWidth*2;
		}

	}





?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产又黄又大久久| 亚洲成人动漫精品| 日韩精品最新网址| 在线成人av影院| 欧美日韩免费高清一区色橹橹| 99天天综合性| 99久久久久久| 日本乱人伦一区| 色哟哟国产精品| 91福利精品视频| 一本一本久久a久久精品综合麻豆| 国产一区不卡在线| 国产凹凸在线观看一区二区| 国产一区91精品张津瑜| 久草这里只有精品视频| 国模少妇一区二区三区| 久久精品国产精品亚洲红杏| 国产精品资源在线看| 岛国精品在线观看| 91福利在线播放| 日本道免费精品一区二区三区| 色综合色狠狠综合色| 欧美丝袜第三区| 日韩视频一区二区三区在线播放| 欧美大片在线观看一区二区| 国产天堂亚洲国产碰碰| 亚洲日本中文字幕区| 一区二区日韩av| 经典一区二区三区| 色综合网色综合| 欧美大片一区二区| 亚洲日穴在线视频| 国内精品伊人久久久久av影院| 成人精品国产福利| 欧美剧情片在线观看| 久久亚洲综合av| 亚洲欧美电影院| 久久99国产精品久久99果冻传媒| caoporn国产一区二区| 欧美日韩二区三区| 国产精品视频观看| 丝袜亚洲另类欧美| 91视频一区二区三区| 精品国产第一区二区三区观看体验 | 日本 国产 欧美色综合| hitomi一区二区三区精品| 91精品在线一区二区| 综合电影一区二区三区| 精品一区二区三区日韩| 91九色02白丝porn| 国产精品拍天天在线| 久久99精品国产麻豆婷婷| 欧美日韩国产在线观看| 中文字幕亚洲电影| 国产一区二区三区久久久| 在线播放国产精品二区一二区四区| 亚洲免费伊人电影| 国产精品91一区二区| 日韩欧美精品三级| 调教+趴+乳夹+国产+精品| 色综合视频在线观看| 国产精品视频线看| 国产a久久麻豆| 久久综合给合久久狠狠狠97色69| 日韩经典一区二区| 69成人精品免费视频| 亚洲成av人在线观看| 在线精品视频免费播放| 亚洲色欲色欲www在线观看| 国产成人亚洲综合a∨婷婷图片| 精品免费日韩av| 日韩国产精品久久久久久亚洲| 欧美午夜免费电影| 亚洲影院免费观看| 欧美日韩国产中文| 亚洲国产va精品久久久不卡综合 | 亚洲欧美自拍偷拍色图| 国产a视频精品免费观看| 国产人成亚洲第一网站在线播放| 精品一区二区三区在线播放| 日韩欧美一卡二卡| 国产主播一区二区| 欧美国产一区视频在线观看| 成人动漫精品一区二区| 国产精品福利在线播放| av成人免费在线| 亚洲乱码国产乱码精品精可以看| 91在线国产福利| 午夜久久久久久| 日韩你懂的电影在线观看| 国模少妇一区二区三区| 国产精品色噜噜| 色综合天天综合在线视频| 一区二区三区电影在线播| 欧美精品色一区二区三区| 久久国产生活片100| 久久青草国产手机看片福利盒子| 国产**成人网毛片九色| 一二三四社区欧美黄| 69堂国产成人免费视频| 国产一区二区精品在线观看| 中文在线资源观看网站视频免费不卡| heyzo一本久久综合| 亚洲成人7777| 国产网站一区二区| 欧美日韩色一区| 国产毛片精品国产一区二区三区| ...xxx性欧美| 欧美一区二区免费观在线| 国产高清成人在线| 日韩国产欧美三级| 日韩毛片精品高清免费| 91精品国产综合久久久蜜臀图片| 成人永久aaa| 丝袜亚洲精品中文字幕一区| 久久久99精品久久| 欧美精品在线一区二区| 成人性生交大片免费看视频在线| 午夜欧美一区二区三区在线播放| 久久久久青草大香线综合精品| 欧美性生活久久| www.欧美亚洲| 精品亚洲porn| 亚洲精品国产精华液| 久久久久88色偷偷免费| 777色狠狠一区二区三区| 99久久久国产精品免费蜜臀| 久久99精品网久久| 亚洲图片欧美色图| 国产精品成人一区二区艾草| 精品国产第一区二区三区观看体验 | 开心九九激情九九欧美日韩精美视频电影| 亚洲精品一区二区精华| 一本大道av伊人久久综合| 香港成人在线视频| 亚洲婷婷综合色高清在线| 欧美精品一区二区久久久| 777午夜精品视频在线播放| 色欧美乱欧美15图片| 国产aⅴ综合色| 美女视频一区二区| 午夜av一区二区| 午夜天堂影视香蕉久久| 自拍偷拍亚洲欧美日韩| 久久久久青草大香线综合精品| 日韩欧美一区二区在线视频| 欧美日韩极品在线观看一区| 色婷婷激情一区二区三区| av网站免费线看精品| 国产精品一区二区三区99| 久久aⅴ国产欧美74aaa| 美腿丝袜一区二区三区| 日韩精品每日更新| 日韩福利视频导航| 久久99国产精品麻豆| 久久精品二区亚洲w码| 极品瑜伽女神91| 精品一区二区综合| 国产乱人伦偷精品视频不卡 | 国产成a人无v码亚洲福利| 免费成人av在线| 久久91精品久久久久久秒播| 久久99国产精品免费| 国产在线国偷精品产拍免费yy| 午夜激情一区二区| 免费精品99久久国产综合精品| 久久99日本精品| 国产999精品久久久久久| 91污片在线观看| 欧美亚洲综合另类| 欧美成人一区二区三区片免费| wwwwww.欧美系列| 国产精品二三区| 亚洲影院理伦片| 韩国三级中文字幕hd久久精品| 国产91色综合久久免费分享| 一本色道**综合亚洲精品蜜桃冫| 欧美日韩国产精品成人| 26uuu国产一区二区三区| 国产色91在线| 亚洲一区在线观看免费观看电影高清| 日本中文一区二区三区| 老司机精品视频一区二区三区| 国产成人av电影在线| 欧美视频在线一区二区三区 | 91老师片黄在线观看| 7777精品伊人久久久大香线蕉完整版 | 欧美日韩一区三区四区| 精品国产不卡一区二区三区| 中文无字幕一区二区三区| 午夜欧美电影在线观看| 国产一区二区不卡在线| 欧美日韩五月天| 国产亚洲一区二区三区| 亚洲国产精品人人做人人爽| 国产一区视频在线看| 欧美日韩国产首页在线观看| 久久网站最新地址| 亚洲国产wwwccc36天堂| 国产91清纯白嫩初高中在线观看|