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

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

?? cvshapes.cpp

?? Windows上的MUD客戶端程序
?? CPP
?? 第 1 頁 / 共 5 頁
字號:
		int 	ifd = 0; // index into face data
		GxVec3f *n = new GxVec3f[numNorms], *v = new GxVec3f[numVerts];

		for (int index = 0; index < numVerts; index++)
		{
			int i = index % 8;
			v[index].x() = fSigns[i].x() * w2;
			v[index].y() = fSigns[i].y() * h2;
			v[index].z() = fSigns[i].z() * d2;
		}

		for( int iface = 0; iface < 6; iface ++)
		{
			n[iface] = -fNorms[iface];
			#if defined(FLIP_D3D_NORMALS) && defined(CH_USE_D3D)
			n[iface] = -n[iface];
			#endif

			face_data[ifd++] = 4;

			int istep = (iface / 2) * vertStep;	// which group of vertices, if texturing

			for( int j = 0; j < 4; j++ )
			{
				int index = indices[iface][j];
				face_data[ifd++] = index + istep;
				face_data[ifd++] = iface;
			}

		}
		face_data[ifd] = 0;	// terminate array
		
		#if 0  // || TRY_TO_FIX_POINT_LIGHTS
		GxTransform3Wf transform = GetTransform();
		(*(transform.GetMatrix()))[3][0] = 0;
		(*(transform.GetMatrix()))[3][1] = 0;
		(*(transform.GetMatrix()))[3][2] = 0;
		for(int ifn = 0; ifn < 6; ifn++)
		{
			float w;
			GxVec3f normT;
			normT =	transform.TransformW(n[ifn], w);
			float mag = normT.magnitude();
			if (w != 0.0) mag /= w;
			if (mag != 0.0) n[ifn] *= 1. / (mag);
		}
		#endif

		// Load the verts and faces
		ChNrFaceArray facesAdded;
		int numFacesAdded;
		ChNrMeshAddFaces(mesh,
				       numVerts,
				       (ChNrVector*) v,
				       6,
				       (ChNrVector*) n,
				       face_data,
				       &numFacesAdded,
				       &facesAdded);

		#if defined(CH_USE_D3D)
		numFacesAdded = facesAdded->GetSize();
		#endif
		#if 0 && defined(CH_USE_D3D)

		DWORD dwVerts, dwNormals, dwFaceSize;
		D3DVECTOR tmpV[24], tmpN[24];
		mesh->GetVertices(&dwVerts, tmpV, &dwNormals, tmpN, &dwFaceSize, 0);
		#endif

		ChNrFace elt;
		// Set the material for the whole mesh
		for( iface = 0; iface < 6; iface ++)
		{
			GetElement(facesAdded, unsigned(iface), elt);
			if(boolUseTexture) 
				SetTextureCoordinates(pTxMap, mesh, elt, iface); 
			materialMap.Set(mesh, elt);
			#if 0 && defined(CH_USE_D3D)
			D3DVECTOR Normal;
			elt->GetNormal(&Normal);
			//elt->SetNormal((ChNrVector*)(n+iface));
			#endif
			D3DRelease(elt);

		}

		if(boolUseTexture)
		{
			ChTextureHandle hdl = pTextureData->GetTextureHandle();
			if(hdl)
			{
				// Texture guy got here first, apply it
				//ChNrMeshSetTexture(mesh, hdl);
				SetTexture(pTextureData);

			}
		}  

		ChNrFree(facesAdded);
		delete [] v;
		delete [] n;
		delete [] face_data;
		delete pTxMap;

		pIterator->DidAShape();
		pRC->UnlockScene();		
		pRC->UnlockQv();		   // Unlock tree 

	}
#endif
	return	true;
}

bool ChQvCubeInstance::Draw(ChRenderContext *pRC, ChDrawIterator *pIterator)
{
#if defined( CH_USE_3DR )
	{
		Fixed32_t On = 1;
		Fixed32_t Off = 0;
		static long indices[6][4] =
		{
			{0, 1, 5, 4},	// front
			{2, 3, 7, 6},	// back
			{3, 0, 4, 7},	// left
			{1, 2, 6, 5},	// right
			{3, 2, 1, 0},	// top
			{4, 5, 6, 7}	// bottom
		};
		static  PointF_t fSigns[8] =
		{
			{-1, 1, 1},	// top front left
			{ 1, 1, 1},	// top right
			{ 1, 1, -1},	// top right back
			{-1, 1, -1},	// top left back
			{-1, -1, 1},	// bottom left
			{ 1, -1, 1},	// bottom right
			{ 1, -1, -1},	// bottom right back
			{-1, -1, -1}	// bottom left back
		};
		static  PointF_t fNorms[6] =		
		{									// indexed by face
			{ 0, 0, 1},// 
			{ 0, 0, -1},	// 
			{-1, 0, 0},	// 
			{ 1, 0, 0},	// 
			{ 0, 1, 0},	// 
			{ 0, -1, 0}	// bottom 
		};
		G3dHandle_t hGC = pRC->GetGC();
		Dword_t  hRC = pRC->GetRC();
		QvCube *pNode = (QvCube *)GetNode();
		pRC->SetModelTransform(GetTransform());

		pRC->SetShading(this);

		Float_t		cull = 1;	   // always backcull cubes
		Fixed32_t wMattNum = 0;	  // always use material 0
		G3dSetMatt( hGC,  wMattNum, G3DM_BACK_CULL,	(Float_t *)&cull );
	
		// Make a material mapping; we will use later for each face
		ChQvCubeMaterials materialMap( this );

		/* Do the texture stuff - find it, make the map, set up 3dr for it, */
		int boolUseTexture = SetupTexture(pRC);
		ChQvCubeTextures	*pTxMap = 0;
		if(boolUseTexture)
		{
			pTxMap = new ChQvCubeTextures( this );
		}

		float h2 = pNode->height.value / 2.;
		float w2 = pNode->width.value / 2.;
		float d2 = pNode->depth.value / 2.;

		Fixed32_t lCCW = true;
		G3dGetState( hGC, G3DL_FRONT_CCW, &lCCW);
		G3dSetState( hGC, G3DL_FRONT_CCW, &Off);

		for( int face = 0; face < 6; face ++)
		{
			bool boolPureEmissive;
			materialMap.Set(hRC, hGC, face, &boolPureEmissive);
			pRC->SetModulation( boolUseTexture, boolPureEmissive);

			G3dBeginPrim(hGC, G3D_PRM_POLYGON, 4);
			PointF_t n, v;
			n = fNorms[face];

			for( int j = 0; j < 4; j++ )
			{
				int index = indices[face][j];
				v.x = fSigns[index].x * w2;
				v.y = fSigns[index].y * h2;
				v.z = fSigns[index].z * d2;
				if(boolUseTexture)
				{
					PointF_t textCoord = pTxMap->GetCoord3(face, j);

					G3dAddPrimVtxF(hGC, &v, &n, &textCoord, 0);
				}
				else
				{
					G3dAddPrimVtxF(hGC, &v, &n, 0, 0);
				}
			}
			G3dEndPrim(hGC);

		}
		G3dSetState( hGC, G3DL_FRONT_CCW, &lCCW);
		if(boolUseTexture)
		{
			pRC->SetTexture(0);							// turn off texture
			delete pTxMap;
		}
	}
#elif (defined(CH_USE_RLAB) || defined(CH_USE_D3D))
#else
#endif //defined( CH_USE_3DR ) or others
	return true;
}

#if (defined(CH_USE_RLAB) || defined(CH_USE_D3D))
void ChQvCubeInstance::SetTextureCoordinates(ChQvCubeTextures *pTxMap, ChNrMesh mesh, ChNrFace face, int faceNum)
{
	int count = ChNrFaceGetVertexCount(face);
	for(int j = 0; j < count; j++)
	{
		GxVec3f textCoord = pTxMap->GetCoord3(faceNum, j);
		int index = ChNrFaceGetVertexIndex(face, j);
		ChNrMeshSetTextureCoordinates(mesh, index, textCoord.x(), textCoord.y());
	}
}
#endif

//////////////////////////////////////////////////////////////////////

ChQvCylinderInstance::ChQvCylinderInstance() : ChQvShapeInstance()
{
}
bool ChQvCylinderInstance::Construct(ChRenderContext *pRC, ChConstructionIterator *pIterator)
{
#if (defined(CH_USE_RLAB) || defined(CH_USE_D3D))
	{
		QvCylinder *pNode = (QvCylinder *)GetNode();

		ASSERT(m_frame );
		pRC->LockQv();		   // Lock tree so other threads don't kill our data
		if(!pIterator->IsOKToProceed(this))	 // This locks scene if available
		{
			pRC->UnlockQv();		   // Unlock tree 
			return 0;
		}
		if(IsConstructed())
		{
			pRC->UnlockScene();
			pRC->UnlockQv();		   // Unlock tree 
			return 1;
		}
		m_boolConstructed = true;
		
		ChNrMesh mesh = m_mesh = pRC->CreateMesh();
		ChNrFrameAddVisual(GetFrame(), mesh);				   
		D3DRelease(mesh);

		ChNrObjectSetAppData(mesh, (unsigned long)this);
		ChNrMeshSetColorSource(mesh,ColorFromFace); // alternative: ChNativeColorFromVertex
		ChNrMeshSetPerspective(mesh,true);  
		 
		ChNrMeshSetTextureTopology(mesh,true, false); // uwrap, vwrap 

		bool boolCull = (pNode->parts.value == QvCylinder::ALL);	// if all sides are present, then cull
		   //boolCull = true;
		int numFacets = CalcCylinderFacetCount(this, state);

		// Make a material mapping; we will use later for each facet, top and bottom
		ChQvCylinderMaterials materialMap( this );
		pRC->AdjustTransparency(materialMap);

		/* Do the texture stuff -  make the map, assign to all the verts, */
		ChQvCylinderTextures	*pTxMap =  new ChQvCylinderTextures( this, numFacets );
		ChQvTextureRenderData *pTextureData = (ChQvTextureRenderData*)(GetTexture2()->GetRenderData());
		bool boolUseTexture = !(pTextureData->IsEmpty());  // one -might- arrive
	
		float h2 = pNode->height.value / 2.;
		float r = pNode->radius.value;

		float pi = atan(1.) * 4.;
		float twoPi = pi * 2;

		// Build the display list: verts, normals, and faces
		int numFaces = numFacets + 2, numVerts = numFacets * 2, numNorms = numFacets + 2;
		if (!boolCull) numNorms *= 2;
		int vertStep = 0;		// step to find verts for sides
		if (boolUseTexture)
		{
			vertStep = numVerts;
			numVerts *= 2;
		}

		// alloc face_data conservatively; might be a touch too big in some cases
		int face_data_size = numFacets * 4 * 2 		// for side faces
							+ numFacets 			// side counts
							+ 2 * numFacets * 2 	// ends
							+ 2 					// end counts		
							+ 1;					// terminator
		if (!boolCull) face_data_size *= 2;
		ChNrFaceData * face_data = new ChNrFaceData[face_data_size];

		int 	ifd = 0; // index into face data
		GxVec3f *n = new GxVec3f[numNorms];
		GxVec3f *v = new GxVec3f[numVerts];

		int normStep = numNorms / 2;
		  // We store both inside and outside normals if not backculled,
		  // but only store outsides if this is solid (not backCulled).
		  // We store all outside norms, first side norms, then ends,
		  // then same for insides if needed.
		for( int facet = 0; facet < numFacets; facet ++)
		{
			float theta = facet * twoPi / numFacets;
			float sintheta = sin(theta);
			float costheta = cos(theta);
			n[facet].x() = -sintheta;
			n[facet].y() = 0;
			n[facet].z() = -costheta;
			if(!boolCull)
			{
				n[facet+normStep] = -n[facet];	// inside normal
			}
	 
			v[facet*2].x() = -sintheta * r;
			v[facet*2].y() = h2;
			v[facet*2].z() = -costheta * r;
			v[facet*2+1] = v[facet*2];
			v[facet*2+1].y() = -h2;
		}
		n[facet].set(0,1,0);	 
		if(!boolCull) n[facet+normStep] = -n[facet];	// inside normal
		facet++;
		n[facet].set(0,-1,0);
		if(!boolCull) n[facet+normStep] = -n[facet];	// inside normal
		facet++;

		// Dupe the verts, to use for sides, if we have texture
		if(boolUseTexture)
		{
			for( int i = 0; i < numVerts / 2; i ++)
			{
				v[i+vertStep] = v[i];
			}
		}

		// Do the top
		if(pNode->parts.value & QvCylinder::TOP)
		{
			face_data[ifd++] = numFacets;	// count
			for( int j = 0; j < numFacets; j ++)
			{
				// Use the even numbered vertices, in reversed order
				int index = ((numFacets - j) * 2) % (numFacets * 2);
				face_data[ifd++] = index;			// vertex
				face_data[ifd++] = numFacets;		// normal
			}
			if(!boolCull)
			{
				// Back face - uses inside normal
				face_data[ifd++] = numFacets;	// count for this face
				for( int j = 0; j < numFacets; j ++)
				{
					// Use the even numbered vertices, in reversed order from front face
					int index = (j * 2) % (numFacets * 2);
					face_data[ifd++] = index;			// vertex
					face_data[ifd++] = numFacets + normStep;		// normal
				}
			}
		}

		// Do the bottom
		if(pNode->parts.value & QvCylinder::BOTTOM)
		{
		 	 // TODO : Make sure this order is right when we do textures
			face_data[ifd++] = numFacets;	// count for this face
			for( int j = 0; j < numFacets; j ++)
			{
					// Use the odd numbered vertices, in mangled order

				int index = ((j * 2) % (numFacets * 2)) + 1;
				face_data[ifd++] = index;			// vertex
				face_data[ifd++] = (numFacets + 1);		// normal
			}
			if(!boolCull)
			{
				// Back face - uses inside normal
				face_data[ifd++] = numFacets;	// count for this face
				for( int j = 0; j < numFacets; j ++)
				{
					// Use the odd numbered vertices, in even more mangled order

					int index = (numFacets * 2 - j * 2) % (numFacets * 2) + 1;
					face_data[ifd++] = index;			// vertex
					face_data[ifd++] = (numFacets + 1)  + normStep;		// normal
				}
			}
		}

		// Do the sides
		if(pNode->parts.value & QvCylinder::SIDES)
		{
			static int backPermute[4] = { 0, 1, 3, 2 };
			static int permute[4] = { 0, 2, 3, 1 };
			for( int facet = 0; facet < numFacets; facet ++)
			{
				face_data[ifd++] = 4;	// count
				for( int j = 0; j < 4; j++ )
				{
					int index = (facet * 2 + permute[j]) % (numFacets * 2);
					face_data[ifd++] = index + vertStep;
					face_data[ifd++] = (facet + (permute[j] / 2)) % numFacets;
				}
			}
			if(!boolCull)
			{
				// Back face - uses inside normal
				for( int facet = 0; facet < numFacets; facet ++)
				{
					face_data[ifd++] = 4;	// count

					for( int j = 0; j < 4; j++ )
					{
						int index = (facet * 2 + backPermute[j]) % (numFacets * 2);
						face_data[ifd++] = index + vertStep;
						face_data[ifd++] = ((facet + (permute[j] / 2)) % numFacets) + normStep;
					}
				}
			}
		}

		face_data[ifd] = 0;	// terminate array

		// Load the verts and faces
		ChNrFaceArray	facesAdded;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲男人的天堂网| www.亚洲色图| 国产成人亚洲精品狼色在线| 99精品视频一区二区三区| 欧美日韩国产小视频在线观看| 日韩欧美一区电影| 日韩美女久久久| 久久精品国产免费看久久精品| 99久久99久久精品国产片果冻| 欧美乱熟臀69xxxxxx| 国产精品灌醉下药二区| 久久99精品视频| 欧美三日本三级三级在线播放| 欧美国产精品一区二区三区| 美国av一区二区| 欧美在线色视频| 日韩美女视频一区二区| 懂色av一区二区夜夜嗨| 欧美一二三区在线| 亚洲国产精品一区二区www| 成人影视亚洲图片在线| 精品国产精品一区二区夜夜嗨| 亚洲一区二区三区美女| 99re视频精品| 日韩激情视频在线观看| 亚洲精品国产视频| 欧美日韩不卡在线| 一区二区中文字幕在线| 国产精品一级在线| 日韩欧美三级在线| 日韩影视精彩在线| 51精品国自产在线| 亚洲不卡av一区二区三区| 欧美性色黄大片手机版| 一区二区三区免费| 欧美午夜理伦三级在线观看| 亚洲激情中文1区| 91电影在线观看| 亚洲精品国产视频| 欧美视频在线播放| 亚洲大片在线观看| 欧美福利视频一区| 日本亚洲视频在线| 亚洲欧美视频在线观看视频| 亚洲欧美日韩综合aⅴ视频| 久久久亚洲综合| 亚洲视频图片小说| 一区二区免费在线播放| 色婷婷国产精品| 亚洲美女在线国产| 在线精品视频一区二区| 亚洲久草在线视频| 欧美色大人视频| 久久精品国产第一区二区三区| 精品久久久久久久久久久院品网| 九一九一国产精品| 国产亚洲精品aa午夜观看| 丁香桃色午夜亚洲一区二区三区| 久久精品人人做| 成人av电影在线网| 亚洲一区影音先锋| 欧美电视剧免费观看| 高清日韩电视剧大全免费| 亚洲男人的天堂在线aⅴ视频| 欧美日本高清视频在线观看| 久久不见久久见中文字幕免费| 国产亚洲1区2区3区| 91美女福利视频| 日日夜夜精品视频免费| 国产亚洲一区字幕| 在线观看不卡视频| 久久99国产精品免费网站| 自拍偷自拍亚洲精品播放| 日韩西西人体444www| 懂色av一区二区在线播放| 亚洲v中文字幕| 久久久久久久久一| 精品视频免费看| 国产成人午夜电影网| 视频在线在亚洲| 国产日韩在线不卡| 欧美日韩国产美| 懂色av一区二区三区蜜臀| 视频一区二区欧美| 国产精品久久久久一区| 欧美一级在线免费| 一本色道久久综合亚洲精品按摩| 狠狠色综合色综合网络| 亚洲一区二区三区四区不卡| 国产精品免费丝袜| 欧美成人一区二区三区| 欧美亚洲一区二区三区四区| 国产传媒欧美日韩成人| 免费精品99久久国产综合精品| 亚洲少妇中出一区| 久久久99精品久久| 精品少妇一区二区三区在线播放| 在线观看日产精品| 波多野结衣在线一区| 国产在线不卡一区| 免费成人av在线| 亚洲高清视频中文字幕| 一区二区理论电影在线观看| 国产精品色婷婷| 国产午夜亚洲精品理论片色戒| 欧美一区二区精美| 91精品国产高清一区二区三区蜜臀 | 日韩成人免费看| 一区二区三区四区激情| 国产精品不卡一区| 国产偷国产偷精品高清尤物| 欧美大胆人体bbbb| 日韩欧美亚洲另类制服综合在线| 91成人网在线| 色8久久人人97超碰香蕉987| 99久久免费精品高清特色大片| 国产福利不卡视频| 国产成人福利片| 国产精品一二三在| 国产91富婆露脸刺激对白| 国产成人欧美日韩在线电影| 国产成人精品免费在线| 色菇凉天天综合网| 黄一区二区三区| 97精品国产露脸对白| 这里是久久伊人| 777亚洲妇女| 亚洲视频在线观看三级| 亚洲女与黑人做爰| 色综合久久66| 日本美女视频一区二区| 石原莉奈在线亚洲二区| 日日夜夜一区二区| 免费成人av在线| 九九**精品视频免费播放| 国产精品一区二区不卡| 成人av在线资源网站| 99精品黄色片免费大全| 欧美日韩国产精品自在自线| 3751色影院一区二区三区| 欧美成人性战久久| 国产精品视频线看| 亚欧色一区w666天堂| 国产一区二区三区在线观看精品| 国产精品性做久久久久久| 色婷婷av一区二区三区软件| 欧美日本免费一区二区三区| 欧美不卡一区二区三区| 欧美激情综合网| 亚洲自拍与偷拍| 国产一区二区三区久久久 | 亚洲精品成人天堂一二三| 日韩电影在线免费看| 国产精品白丝av| 91啦中文在线观看| 日韩视频免费观看高清完整版 | 欧美福利一区二区| 国产精品国产a| 日韩电影在线免费看| 91在线观看视频| 制服丝袜在线91| 日本一区二区三区dvd视频在线| 亚洲乱码中文字幕| 九九九久久久精品| 91久久人澡人人添人人爽欧美| 日韩久久久久久| 亚洲无人区一区| 国产成人综合在线| 欧美日韩五月天| 国产精品毛片久久久久久久| 青椒成人免费视频| 色94色欧美sute亚洲13| 日本一区二区三区国色天香| 日韩一区精品字幕| 欧美在线免费观看视频| 国产精品久久一卡二卡| 久久99热99| 91麻豆精品国产91久久久资源速度 | 蜜臀久久99精品久久久久宅男| av成人免费在线观看| 久久免费视频色| 天天影视涩香欲综合网| av不卡一区二区三区| 久久夜色精品国产噜噜av| 日一区二区三区| 欧美日韩久久久| 一区二区三区中文在线观看| 成人网页在线观看| 精品处破学生在线二十三| 丝袜a∨在线一区二区三区不卡| 在线观看一区日韩| 中文字幕日本不卡| 国产99久久久国产精品 | 欧美老肥妇做.爰bbww视频| 国产精品家庭影院| 国产成人av一区二区| 久久久久国产精品厨房| 国产另类ts人妖一区二区| 精品国产乱码久久| 激情都市一区二区|