コード例 #1
0
ファイル: CWorld.cpp プロジェクト: zphilip/VirtualTS
void CWorld::SortByDepth(CDesktop* desktop)
{
	int i, degree = objectList.GetDegree();

	if(!degree) return;

	CComponent3D* object;
	double m[16];
	double* depthList;
	CVirtualWebCam* vWebCam;

	depthList = new double[degree];
	int* idList = new int[degree];

	glMatrixMode(GL_MODELVIEW);
	glPushMatrix();
		if(CARDeskTop::mode == CARDeskTop::kAR) {
			arglCameraViewRH(desktop->trans, m, VIEW_SCALEFACTOR);
			glLoadMatrixd(m);
			glMultMatrixd(matrix);
		} else if(CARDeskTop::mode == CARDeskTop::kVR) {
			glLoadMatrixd(matrix);
			vWebCam = (CVirtualWebCam*) CARDeskTop::arDeskTop->window->webCamList[0];
		}

		objectList.GoToFirst();
		for(i = 0; i < degree; i++) {
			object = (CComponent3D*) objectList.GetKey();
			idList[i] = object->GetID();

			glPushMatrix();
				glMultMatrixd(object->matrix);
				glGetDoublev(GL_MODELVIEW_MATRIX, m);
				if(CARDeskTop::mode == CARDeskTop::kAR) {
					depthList[i] = m[12] * m[12] + m[13] * m[13] + m[14] * m[14];
				} else if(CARDeskTop::mode == CARDeskTop::kVR) {
					depthList[i] = -(vWebCam->newPos[0] * m[12] + vWebCam->newPos[1] * m[13] + vWebCam->newPos[2] * m[14]);
				//	depthList[i] = -m[14];
				}
			glPopMatrix();

			objectList.GoToNext();
		}
	glPopMatrix();


	BubbleSortd(depthList, idList, degree);

	CList list;
	int j, degree2;

	objectList.MoveAllLinkTo(&list);

	for(i = 0; i < degree; i++) {
		list.GoToFirst();
		degree2 = list.GetDegree();
		for(j = 0; j < degree2; j++) {
			object = (CComponent3D*) list.GetKey();
			if(idList[i] == object->GetID()) {
				objectList.Push(list.Remove(object));
				break;
			}
			list.GoToNext();
		}
	}

	delete depthList;
	delete idList;
}