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

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

?? ch3rendr.cpp

?? Windows上的MUD客戶端程序
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
					/*
					 * create an egg frame within the scene
					 */
				    egg = CreateFrame(m_sceneFrame);

					/*
					 * add the loaded mesh into the frame
					 */
				    if(egg)
				    {	
				    	rval = egg->AddVisual(egg_mesh);
						egg->Release();
					}
					egg_mesh->Release();
				}
			}
			#endif

		}
		#endif
	}
	#endif


	SetTexture(0);

	m_ppDefaults = new QvNode* [QvState::NumStacks];
	for(int j=0; j<	QvState::NumStacks; j++) m_ppDefaults[j] = 0;

	// We don't set defaults for cameras, and lights
	m_ppDefaults[QvState::BaseColorIndex	       		] =   new QvBaseColor; 
	m_ppDefaults[QvState::Coordinate3Index       		] =   new QvCoordinate3; 
	m_ppDefaults[QvState::FontStyleIndex         		] =   new QvFontStyle;
	m_ppDefaults[QvState::InfoIndex         	 		] =   new QvInfo;
	m_ppDefaults[QvState::MaterialBindingIndex   		] =   new QvMaterialBinding; 
	m_ppDefaults[QvState::MaterialIndex          		] =   new QvMaterial;  
	m_ppDefaults[QvState::NormalBindingIndex     		] =   new QvNormalBinding;   
	m_ppDefaults[QvState::NormalIndex            		] =   new QvNormal;
	m_ppDefaults[QvState::ShapeHintsIndex        		] =   new QvShapeHints;
	m_ppDefaults[QvState::Texture2Index          		] =   new QvTexture2;  
	m_ppDefaults[QvState::Texture2TransformationIndex 	] =   new QvTexture2Transform;
	m_ppDefaults[QvState::TextureCoordinate2Index		] =   new QvTextureCoordinate2;
	//		 transforms are different, but we need one identity instance handy
	m_ppDefaults[QvState::TransformationIndex			] =   new QvScale;

	ChQvBuildState state((ChMazeWnd*)GetWnd());

	// traverse once to init; this guarantees renderdata is newed
	m_ppDefaults[QvState::BaseColorIndex	       		]->traverse(&state);
	m_ppDefaults[QvState::Coordinate3Index       		]->traverse(&state);
	m_ppDefaults[QvState::FontStyleIndex         		]->traverse(&state);
	m_ppDefaults[QvState::InfoIndex         	 		]->traverse(&state);
	m_ppDefaults[QvState::MaterialBindingIndex   		]->traverse(&state);
	m_ppDefaults[QvState::MaterialIndex          		]->traverse(&state);
	m_ppDefaults[QvState::NormalBindingIndex     		]->traverse(&state);
	m_ppDefaults[QvState::NormalIndex            		]->traverse(&state);
	m_ppDefaults[QvState::ShapeHintsIndex        		]->traverse(&state);
	m_ppDefaults[QvState::Texture2Index          		]->traverse(&state);
	m_ppDefaults[QvState::Texture2TransformationIndex 	]->traverse(&state);
	m_ppDefaults[QvState::TextureCoordinate2Index		]->traverse(&state);
	m_ppDefaults[QvState::TransformationIndex			]->traverse(&state);

}

void ChRenderContext::AbortConstruction()
{
	// Stop all construction threads currently
	// running for this instance
	#if (defined(CH_USE_RLAB)) || defined(CH_USE_D3D)
	if ( IsThreaded() )
	{
		// cancel all threads, currently running
		m_boolContinueConstruction = false;
		// Tell the reconstruction thread to abort all requests and clean up the queue

		// Abort all reconstruction requests
		::ResetEvent( GetEndConstructEvent() );
		::SetEvent( m_hReconstructEvents[abortReconstruct] );

		DWORD dwStatus;
	   	// Wait till reconstruction thread says we are OK to proceed
		dwStatus = ::WaitForSingleObject( GetEndConstructEvent(), INFINITE );
		ASSERT( dwStatus == WAIT_OBJECT_0 );
	
		TRACE1( "AbortConstruction : Threads running before abort : %d\n", NumPendingConstructionThreads() );

		while( NumPendingConstructionThreads() )
		{  // There is a thread curently running, block on the end thread event

			dwStatus = ::WaitForSingleObject( GetEndConstructEvent(), INFINITE );

			ASSERT( dwStatus == WAIT_OBJECT_0 );
		}

		// We can start construction of scenes again
		m_boolContinueConstruction = true;
		TRACE1( "AbortConstruction : Threads running after abort : %d\n", NumPendingConstructionThreads() ); 
		ASSERT( NumPendingConstructionThreads() == 0 );
	}
	#endif
}


void ChRenderContext::Term()
{

	#if defined(CH_USE_3DR)
	if(m_hGC) G3dDeleteGC(m_hGC);
	if(m_hRC) R3dDeleteRC(m_hRC);
	m_hGC = 0;
	m_hRC = 0;
	#else

	// Terminate the reconstruction thread
	if ( IsThreaded() )
	{
		// Abort all reconstruction requests
		::SetEvent( m_hReconstructEvents[endThread] );

		DWORD dwStatus;
	   	// Wait till reconstruction thread says we are OK to proceed
		dwStatus = ::WaitForSingleObject( GetEndConstructEvent(), INFINITE );
		ASSERT( dwStatus == WAIT_OBJECT_0 );
		
	}

	delete m_pDefaultCamera;

	ChNrObjectDestroy(m_hRC);
	ChNrObjectDestroy(m_sceneFrame);
	m_hRC 			= 0;
	m_sceneFrame 	= 0;
	m_cameraFrame 	= 0;
	m_viewport 		= 0;
	#endif

	// Moved from destructor to Term by VSP : This was required to
	// Plug leaks in QV.
	if(m_ppDefaults)
	{
		for(int j=0; j<	QvState::NumStacks; j++)
		{
			delete m_ppDefaults[j];
			m_ppDefaults[j] = 0;
		}
	}
	delete m_ppDefaults;
	m_ppDefaults = 0;
	if(m_pRootInstance) m_pRootInstance->Release();
	//delete m_pRootInstance;
	m_pRootInstance = 0;
	for(int j=0; j<CH_MAX_SPHERE_LEVEL+1; j++)
	{
		delete m_pSpheres[j];
		m_pSpheres[j] = 0;
	}
	#if defined(CH_USE_3DR)
	#else
	delete m_pStack;
	m_pStack = 0;
	#endif

}

#if (defined(CH_USE_RLAB) || defined(CH_USE_D3D))
void ChRenderContext::Resize( int width, int height, bool boolForceNew )
{
	if(m_hRC)
	{
		LockScene();
		if(width == 0 || width == 0)
		{
		    RECT r;
		    GetWnd()->GetClientRect(&r);
			if(!width) width = r.right;
			if(!height) height = r.bottom;
		}

	    int dev_width = ChNrDeviceGetWidth(m_hRC);
	    int dev_height = ChNrDeviceGetHeight(m_hRC);
	    ChNrValue front = ChNrViewportGetFront(m_viewport);
	    ChNrValue back = ChNrViewportGetBack(m_viewport);
	    ChNrValue field = ChNrViewportGetField(m_viewport);

	    ChNrObjectDestroy(m_viewport);

	    /*
	     * if requesting a device of zero dimensions, actually make the device
	     * slightly larger, as a device of width or height zero is no device at
	     * all, and it causes many problems
	     */

	    if (!width) {
			width = 10;
	    }
	    if (!height) {
			height = 10;
	    }

	    if (boolForceNew || (width > dev_width || height > dev_height))
	    {	
		    int old_dither = ChNrDeviceGetDither(m_hRC);
			ChNrRenderQuality old_quality = ChNrDeviceGetQuality(m_hRC);
			ChNrColorModel old_model = ChNrDeviceGetColorModel(m_hRC);
			int old_shades = ChNrDeviceGetShades(m_hRC);

			#if 0
			// We don't use any right now
			RLDestroyCallback* fns;
			void** args;
			int c, count;

			RLObjectGetDestroyCallbacks(m_hRC, &count, &fns, &args);

			for (c = 0; c < count; c++) {
			    RLObjectRemoveDestroyCallback(m_hRC, fns[c], args[c]);
			}
			#endif

			ChNrObjectDestroy(m_hRC);
			m_hRC = CreateDevice(width, height);

			#if 0
			for (c = 0; c < count; c++) {
			    ChNrObjectAddDestroyCallback(m_hRC, fns[c], args[c]);
			}

			RLFree(fns);
			RLFree(args);
			#endif

			ChNrDeviceSetDither(m_hRC, old_dither);
			ChNrDeviceSetQuality(m_hRC, old_quality);
			#if (defined(CH_USE_RLAB))
			// Just for RL, implicit in device in d3d
			ChNrDeviceSetColorModel(m_hRC, old_model);
			#endif
			ChNrDeviceSetShades(m_hRC, old_shades);
	    }
	    m_viewport = CreateViewport(m_hRC, m_cameraFrame, 0, 0, width, height);
		ChNrObjectAddDestroyCallback(m_viewport, ViewportDestroyCallback, this);
		//TRACE("Viewport Created\n");

	    ChNrViewportSetBack(m_viewport, back);
	    ChNrViewportSetFront(m_viewport, front);
	    ChNrViewportSetField(m_viewport, field);

		if(m_pBackGroundNode)
		{
			ChQvBackgroundInfoData *pData = (ChQvBackgroundInfoData *)(m_pBackGroundNode->GetRenderData());
			pData->OnResize(this);
		}

		if(GetCurrentCamera())((ChQvPCameraRenderData*)(GetCurrentCamera()->GetRenderData()))->SynchCamera();

		SetDirty();

		UnlockScene();
	}
}
#endif

void ChRenderContext::SetModulation(bool boolUseTexture /*= true*/, bool boolPureEmissive)
{
	#if defined(CH_USE_3DR)
	Fixed32_t On = 1;
	Fixed32_t Off = 0;
	if(boolUseTexture && boolPureEmissive)
	{	
		// turn off texture modulation - it paints black
		R3dSetState( m_hRC, R3D_STA_DISABLES, R3D_SE_MODULATION);	
		G3dSetState( m_hGC, G3DL_TEXTURE_MOD, &Off);
	}
	else if(boolUseTexture && (R3dGetState( m_hRC, R3D_STA_ENABLES) & R3D_SE_SHADING))
	{
		// Normal case for diffuse or specular faces - must be smooth shaded to work
		// in 3dr. 
		R3dSetState( m_hRC, R3D_STA_ENABLES, R3D_SE_MODULATION);	
		G3dSetState( m_hGC, G3DL_TEXTURE_MOD, &On);
	}
	else if(boolUseTexture)
 	{	
		// turn off texture modulation -  no smoothing 
		R3dSetState( m_hRC, R3D_STA_DISABLES, R3D_SE_MODULATION);	
		G3dSetState( m_hGC, G3DL_TEXTURE_MOD, &Off);
	}
	// else texturing is off, so don't care
	#elif (defined(CH_USE_RLAB)) || defined(CH_USE_D3D)
	// not needed
	#else
	#pragma message("ChRenderContext::SetModulation() Not done!")
	#endif
}


// Set shading according to user preferences and traversal state

ChRenderContext* ChRenderContext::SetShading( ChQvShapeInstance *pInstance )
{
	#if defined(CH_USE_3DR)
	ChShadingLevel	stateShading = defaultShading;
	ChShadingLevel	resultShading;
	int permute[5];

	permute[int(smoothShading)] = 0;
	permute[int(flatShading)] = 1;
	permute[int(noShading)] = 2;
	permute[int(defaultShading)] = 3;
	permute[int(wireFrame)] = 4;
											// Indexing is [user][state]
	static ChShadingLevel aShadingTbl[5][5] =
	{
		// user == smoothShading
		{ smoothShading, flatShading, noShading, smoothShading, noShading },
		// user == flatShading
		{ flatShading, flatShading, noShading, flatShading, noShading },
		// user == none
		{ noShading, noShading, noShading, noShading, noShading },
		// user == defaultShading
		{ smoothShading, flatShading, noShading, defaultShading, noShading },
		// user == wireframe
		{ noShading, noShading, noShading, noShading, noShading }
	};

	// Get Stack top and get the shading value, if any
	// Right now the node only pushes shading nodes, so we don't have to walk down
	QvInfo *pInfoNode = 0;
	if(pInstance) pInfoNode = pInstance->GetInfo();
	if(pInfoNode && pInfoNode->GetRenderData())
	{
		stateShading = ((ChQvInfoRenderData	*)(pInfoNode->GetRenderData()))->GetShading();
	}

	// Make sure values are in range - Help stamp out wild pointers
	int i = int(m_userShading);	if(i>sizeof(permute)/sizeof(permute[0]) || i<0) i = defaultShading;
	int j = int(stateShading);	if(j>sizeof(permute)/sizeof(permute[0]) || j<0) j = defaultShading;
	
	// Lookup in table
	resultShading = aShadingTbl[permute[i]][permute[j]];

	// Set it into the renderer's context
	Fixed32_t On = 1;
	Fixed32_t Off = 0;

    if (resultShading == flatShading)
    {
        R3dSetState( GetRC(), R3D_STA_DISABLES, R3D_SE_SHADING);
        //G3dSetState( GetGC(), G3DL_FLAT_SHADING, &On);
	}
	else if (resultShading == noShading)
	{
        R3dSetState( GetRC(), R3D_STA_DISABLES, R3D_SE_SHADING);
        //G3dSetState( GetGC(), G3DL_FLAT_SHADING, &On);
	}
	else if (resultShading == smoothShading)
	{
    	R3dSetState( GetRC(), R3D_STA_ENABLES, R3D_SE_SHADING); 
        //G3dSetState( GetGC(), G3DL_FLAT_SHADING, &Off);
	}
	else   // default to smoothShading
	{
    	R3dSetState( GetRC(), R3D_STA_ENABLES, R3D_SE_SHADING );
        //G3dSetState( GetGC(), G3DL_FLAT_SHADING, &Off);
	}
	#elif (defined(CH_USE_RLAB)) || defined(CH_USE_D3D)
	// not needed
	#else
	#pragma message("ChRenderContext::SetShading() Not done!")
	#endif
	return this;
}


#if defined(CH_USE_3DR)
// Private helper function for RebuildTransformStack
int ChRenderContext::ApplyQvTail( QvElement *elt)
{
	int tailDepth = 0;
	TransformF_t eltMat;
	G3dSetActiveStack(m_hGC, G3DT_MODEL);

	if(elt->next)
	{
		tailDepth = ApplyQvTail( elt->next );
	}
	if( tailDepth < elt->depth || elt->type == QvElement::NoOpTransform)
	{
		G3dPushTransform(m_hGC);
	}
	if(GetTransform( elt, eltMat))
	{
		G3dPostMultTransform(m_hGC, eltMat);
	}
	return elt->depth;
}

void ChRenderContext::RebuildTransformStack(ChQvState *pState)
{
	// recurse down the qv stack, applying each matrix, and pushing the geometry engine stack
	// each time the element depth changes, or a nooptransform is encountered. (Noop transforms are
	// used by TransformSeparator::traverse as markers)
	QvElement *	top = pState->getTopElement(QvState::TransformationIndex);
	
	G3dSetActiveStack(GetGC(), G3DT_MODEL);
	if(top) ApplyQvTail( top );
 
}
#else
	// not used by other renderer's implementations
#endif

Ch3DViewerMode ChRenderContext::GetViewerMode()
{
	Ch3DViewerMode	mode = ((ChMazeWnd*)GetWnd())->GetSceneViewerMode();
	Ch3DViewerMode	prefMode = ((ChMazeWnd*)GetWnd())->GetSettings()->GetViewerMode();

	#if 0
	if(mode == none || ((ChMazeWnd*)GetWnd())->GetSettings()->GetOverrideSceneMode())
	{
		mode = prefMode;
	}
	#endif
	return prefMode;
}

ChQvTransformationInstance *ChRenderContext::GetDefaultTransform()
{
	ChQvRenderBaseData *pData = (ChQvRenderBaseData *)(m_ppDefaults[QvState::TransformationIndex]->GetRenderData());
	return (ChQvTransformationInstance *)(pData->m_instances.GetHead());
}

ChRenderContext* ChRenderContext::AddCamera(QvNode *pCamera, string &strName)
{
	if(!strName.IsEmpty())
	{
		ChCameraEntry *pEntry = new ChCameraEntry(strName, pCamera, 
			((ChMazeWnd*)GetWnd())-> GetCurrentPage());
		m_cameras.AddTail(pEntry);
		m_cameraCount++;
	}
	return this;
}

ChRenderContext* ChRenderContext::RemoveCamera(string &strName)
{
	if(!strName.IsEmpty() && !m_cameras.IsEmpty())
	{
		ChPosition pos = m_cameras.GetHeadPosition();
		while(pos)
		{
			ChPosition thisPos = pos;
			ChCameraEntry *pEntry = m_cameras.GetNext(pos);
			if(pEntry && strName == pEntry->GetName())
			{
				m_cameras.Remove(thisPos);
				delete pEntry;
				break;
			}
		}
		//m_cameras.Delete(strName);
		m_cameraCount--;
	}
	return this;
}

ChRenderContext* ChRenderContext::RemoveCameras()
{
	while(!m_cameras.IsEmpty())
	{
		ChCameraEntry *pEntry = m_cameras.RemoveHead();
		delete pEntry;
	}
	m_cameraCount = 0;
	return this;
}

//////////////// ChCameraIterator - only non-trivial method ////////////
// We put it here because of similarity to RC camera stuff

bool ChCameraIterator::Iterate()
{
	if(!m_pRC) return false;

	bool boolContinue = true;
	if(!m_pRC->m_cameras.IsEmpty())
	{
		ChPosition pos = m_pRC->m_cameras.GetHeadPosition();
		while(pos && boolContinue)
		{
			ChCameraEntry *pEntry = m_pRC->m_cameras.GetNext(pos);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产不卡在线视频| 久久久久久久久99精品| 久久久久久97三级| 午夜私人影院久久久久| 日韩视频免费观看高清完整版| 久久久久国产精品麻豆| 亚洲www啪成人一区二区麻豆| 成人福利视频网站| 日韩女优av电影| 亚洲v中文字幕| 91亚洲精品久久久蜜桃| 中文字幕第一区第二区| 美女网站视频久久| 欧美人牲a欧美精品| 一区二区三区在线播| 成人理论电影网| 久久久噜噜噜久久人人看| 蜜乳av一区二区三区| 欧美日本乱大交xxxxx| 亚洲一区av在线| 欧美在线小视频| 亚洲日本乱码在线观看| 成人激情小说网站| 中文字幕免费不卡| 成人网在线播放| 国产性色一区二区| 国产麻豆精品95视频| 日韩三级视频在线观看| 日韩成人av影视| 91麻豆精品国产自产在线观看一区| 樱桃视频在线观看一区| 91国产免费观看| 亚洲一区二区三区四区在线 | 另类小说色综合网站| 欧美系列在线观看| 午夜久久久久久久久久一区二区| 在线一区二区三区四区五区| 亚洲自拍偷拍av| 777午夜精品免费视频| 爽爽淫人综合网网站| 91麻豆精品国产无毒不卡在线观看| 日韩国产精品91| 日韩欧美一级二级| 国产一区二区伦理片| 国产精品免费av| 99精品视频在线免费观看| 亚洲色欲色欲www| 在线观看日韩电影| 日本色综合中文字幕| 欧美xxxx老人做受| 不卡视频在线观看| 亚洲国产成人精品视频| 欧美一级专区免费大片| 国产成人亚洲综合a∨婷婷图片| 中文字幕一区二| 欧美日韩国产精品成人| 九九**精品视频免费播放| 久久精品人人做人人综合| 91色porny蝌蚪| 日韩成人一级大片| 国产午夜精品美女毛片视频| 91九色最新地址| 久久99国产精品久久99| 日韩美女视频一区二区| 欧美日韩成人高清| 成人在线视频一区二区| 亚洲香肠在线观看| 久久精品在这里| 欧美日本精品一区二区三区| 国产精品综合视频| 爽爽淫人综合网网站| 日本一区二区三区四区在线视频| 精品视频1区2区3区| 国产成人午夜片在线观看高清观看| 一区二区不卡在线播放 | 免费久久精品视频| 国产精品乱人伦| 91精品国产91久久久久久一区二区| 国产suv精品一区二区6| 日韩影视精彩在线| 中文字幕一区二区三区在线不卡 | 成人免费精品视频| 美女精品自拍一二三四| 亚洲综合免费观看高清完整版在线 | 午夜日韩在线电影| 欧美国产日韩亚洲一区| 91.com视频| 一区二区三区在线视频免费| 91精品麻豆日日躁夜夜躁| 白白色亚洲国产精品| 免费成人美女在线观看.| 一片黄亚洲嫩模| 国产精品久久久一本精品| 精品动漫一区二区三区在线观看| 欧美日韩国产一级片| 91视频在线观看| 国产91高潮流白浆在线麻豆 | 亚洲另类春色校园小说| 久久久久久久久久久电影| 日韩三级电影网址| 欧美一区二区视频在线观看2022 | 成人午夜视频免费看| 狠狠色狠狠色综合系列| 精品一区二区三区香蕉蜜桃| 视频一区视频二区中文字幕| 夜夜爽夜夜爽精品视频| 一区二区理论电影在线观看| 日韩码欧中文字| 亚洲欧美日韩精品久久久久| 国产精品国产三级国产aⅴ无密码| 国产欧美日韩不卡| 欧美激情在线一区二区三区| 久久久久久久网| 国产亚洲一区二区三区| 国产亚洲欧美日韩日本| 中文成人av在线| 中文字幕综合网| 亚洲最新视频在线观看| 国模少妇一区二区三区| 久久国产精品免费| 激情文学综合插| 国产成人在线视频播放| 成人污视频在线观看| 99国产精品99久久久久久| 99久久综合精品| 色女孩综合影院| 欧美日韩综合不卡| 欧美不卡一二三| 国产亚洲成aⅴ人片在线观看| 国产精品美女www爽爽爽| 亚洲人成精品久久久久| 亚洲观看高清完整版在线观看| 丝袜美腿亚洲综合| 激情五月婷婷综合网| av在线不卡免费看| 欧美日韩中文字幕精品| 日韩欧美成人一区| 国产精品视频免费看| 一区二区三区中文在线观看| 日韩高清一区二区| 国产高清亚洲一区| 色噜噜狠狠成人网p站| 欧美一区二区视频在线观看2022| 久久精品视频一区二区三区| 亚洲另类色综合网站| 日本最新不卡在线| 高清免费成人av| 欧美天天综合网| 国产亚洲欧洲一区高清在线观看| 亚洲女人的天堂| 黑人精品欧美一区二区蜜桃| 久久久国产一区二区三区四区小说| 国产精品久久久久久一区二区三区| 亚洲图片欧美色图| 精品在线一区二区三区| 欧美在线观看视频在线| 26uuu国产电影一区二区| 亚洲欧美视频在线观看视频| 精品无人码麻豆乱码1区2区| 色综合天天综合网天天狠天天| 欧美成人精品1314www| 亚洲天堂网中文字| 看国产成人h片视频| 97aⅴ精品视频一二三区| 精品久久人人做人人爱| 亚洲国产日韩a在线播放性色| 国产成人一区在线| 欧美一级夜夜爽| 樱花草国产18久久久久| 粉嫩13p一区二区三区| 91精品综合久久久久久| 亚洲图片另类小说| 国产一区 二区| 欧美一区二区三区成人| 一区二区三区高清| 99久久免费视频.com| 久久精品亚洲精品国产欧美kt∨ | 国产盗摄精品一区二区三区在线 | 99国内精品久久| 久久一区二区三区四区| 日本成人中文字幕| 在线免费观看不卡av| 国产精品蜜臀在线观看| 国产一区二区电影| 精品久久国产老人久久综合| 午夜精品久久一牛影视| 一本大道综合伊人精品热热 | 2020日本不卡一区二区视频| 丝袜国产日韩另类美女| 色吧成人激情小说| 夜夜爽夜夜爽精品视频| 色综合久久九月婷婷色综合| 中文字幕亚洲不卡| 99久久国产免费看| 亚洲乱码中文字幕| 在线中文字幕一区| 亚洲国产精品久久艾草纯爱| 欧美性猛交xxxx乱大交退制版| 亚洲一区二区视频| 精品视频免费在线|