//显示函数
void CResultThread::OnShwo_Pair_ThreadMessage(WPARAM wParam, LPARAM lParam)
{
	//cout << "OnShwo_Pair_ThreadMessage" << endl;
	//return;

	static IplImage *OUTImage = cvCreateImage(cvSize(640 * 2, 480), IPL_DEPTH_8U, 1);

	//static bool ONCE = true;

	//if (ONCE)
	//{
	//	cvSetZero(OUTImage);
	//	cvLine(OUTImage, cvPoint(640, 0), cvPoint(640, 480), cvScalar(150));
	//}



	////画点就好,画线很费时间
	//for (int i = 0; i < NumOfPairCounter; i++)
	//{
	//	OUTImage->imageData[640 * 2 * (int)(PairCounter[i].Left->y) + int(PairCounter[i].Left->x)] = -127;
	//	OUTImage->imageData[640 * 2 * (int)(PairCounter[i].Right->y) + 640 + int(PairCounter[i].Right->x)] = -127;
	//}

	//cvShowImage("配对线", OUTImage);

	//cvWaitKey(2);

	////用这个清零比较快 cvSetZero(OUTImage);
	//for (int i = 0; i < NumOfPairCounter; i++)
	//{
	//	OUTImage->imageData[640 * 2 * (int)(PairCounter[i].Left->y) + int(PairCounter[i].Left->x)] = 0;
	//	OUTImage->imageData[640 * 2 * (int)(PairCounter[i].Right->y) + 640 + int(PairCounter[i].Right->x)] = 0;
	//}


	CompareImage(Src_Left_Gray[int(wParam)], Src_Right_Gray[int(lParam)], OUTImage);
	cvShowImage("配对线", OUTImage);
	cvWaitKey(2);

}
//显示函数
void CResultThread::OnShwo_Pair_ThreadMessage(WPARAM wParam, LPARAM lParam)
{
	double StartTime = GETTIME();

	static IplImage *OUTImage = cvCreateImage(cvSize(640 * 2, 480), IPL_DEPTH_8U, 1);

	CompareImage(Src_Left_Gray[int(wParam)], Src_Right_Gray[int(lParam)], OUTImage);

	//画配对线
	for (int i = 0; i < NumOfPairCounter; i++)
	{
		cvLine(OUTImage, cvPoint((int)PairCounter[i].Left->x, (int)PairCounter[i].Left->y), cvPoint((int)PairCounter[i].Right->x + 640, (int)PairCounter[i].Right->y), cvScalar(150));
	}

	cvShowImage("配对线", OUTImage);

	double Endtime = GETTIME();


	if (Endtime - StartTime > 10)
	{
		cout << "显示配对耗时" << Endtime - StartTime << endl;
	}
}
//----------------------------------------------------------------------------
void medPipeVectorFieldSliceTest::TestCreate()
//----------------------------------------------------------------------------
{
  mafVMEStorage *storage = mafVMEStorage::New();
  storage->GetRoot()->SetName("root");
  storage->GetRoot()->Initialize();

  ///////////////// render stuff /////////////////////////
  vtkRenderer *frontRenderer;
  vtkNEW(frontRenderer);
  frontRenderer->SetBackground(0.1, 0.1, 0.1);

  vtkCamera *cam = frontRenderer->GetActiveCamera();

  m_RenderWindow = vtkRenderWindow::New();
  m_RenderWindow->AddRenderer(frontRenderer);
  m_RenderWindow->SetSize(640, 480);
  m_RenderWindow->SetPosition(200,0);

  vtkRenderWindowInteractor *renderWindowInteractor = vtkRenderWindowInteractor::New();
  renderWindowInteractor->SetRenderWindow(m_RenderWindow);
  //////////////////////////////////////////////////////////////////////////

  mafVMEVolumeGray *volume;
  mafNEW(volume);
  volume->ReparentTo(storage->GetRoot());

  vtkMAFSmartPointer<vtkFloatArray> scalarArray;
  scalarArray->SetName("Scalar");

  vtkMAFSmartPointer<vtkFloatArray> vectorArray;
  vectorArray->SetNumberOfComponents(3);
  vectorArray->SetName("velocity");

  vtkMAFSmartPointer<vtkFloatArray> tensorArray;
  tensorArray->SetNumberOfComponents(9);
  tensorArray->SetName("tensor");


  int x,y,z;
  x = y = z = 10;
  vtkMAFSmartPointer<vtkStructuredPoints> image;
  double origin[3] = {0.0,0.0, -45.};
  image->SetOrigin(origin);
  image->SetDimensions(x,y,z);
  image->SetSpacing(10.,10.,10.);

  int i = 0, size = x*y*z;
  for(;i<size;i++){
    scalarArray->InsertNextTuple1(1.0);
    vectorArray->InsertNextTuple3((float)rand()/(float)RAND_MAX, (float)rand()/(float)RAND_MAX, (float)rand()/(float)RAND_MAX);
    tensorArray->InsertNextTuple9((float)rand()/(float)RAND_MAX,(float)rand()/(float)RAND_MAX,(float)rand()/(float)RAND_MAX,(float)rand()/(float)RAND_MAX,(float)rand()/(float)RAND_MAX,(float)rand()/(float)RAND_MAX,(float)rand()/(float)RAND_MAX,(float)rand()/(float)RAND_MAX,(float)rand()/(float)RAND_MAX);
  }

  image->GetPointData()->AddArray(vectorArray);
  image->GetPointData()->AddArray(tensorArray);

  image->GetPointData()->SetScalars(scalarArray);
  image->GetPointData()->GetVectors("velocity")->Modified();
  image->GetPointData()->Update();

  image->GetPointData()->SetActiveVectors("velocity");

  image->Update();

  double bb[6];
  image->GetBounds(bb);

  volume->SetDataByReference(image, 0.);
  volume->Update();

  //Assembly will be create when instancing mafSceneNode
  mafSceneNode *rootscenenode = new mafSceneNode(NULL, NULL, storage->GetRoot(), NULL, NULL);
  mafSceneNode *sceneNode = new mafSceneNode(NULL,rootscenenode,volume, frontRenderer);

  /////////// Pipe Instance and Creation ///////////
  medPipeVectorFieldSlice *pipe = new medPipeVectorFieldSlice;
  pipe->Create(sceneNode);
  

  double focalPoint[3] = {45.,45.,0.};
  double position[3] = {45.,45.,100.};

  cam->SetFocalPoint(focalPoint);
  cam->SetPosition(position);

  ////////// ACTORS List ///////////////
  vtkProp3DCollection *actorList = pipe->GetAssemblyFront()->GetParts();

  actorList->InitTraversal();
  vtkProp *actor = actorList->GetNextProp();
  while(actor)
  {   
    frontRenderer->AddActor(actor);
    m_RenderWindow->Render();

    actor = actorList->GetNextProp();
  }

  //m_RenderWindow->Render();
  //mafSleep(2000);
  CompareImage();

  delete pipe;
  sceneNode->m_RenFront = NULL;
  delete sceneNode;
  delete(rootscenenode);

  volume->ReparentTo(NULL);
  mafDEL(volume);
  mafDEL(storage);

  vtkDEL(frontRenderer);
  vtkDEL(m_RenderWindow);
  vtkDEL(renderWindowInteractor);

}
//----------------------------------------------------------------------------
void medPipeVectorFieldGlyphsTest::TestCreate()
//----------------------------------------------------------------------------
{
  mafVMEStorage *storage = mafVMEStorage::New();
  storage->GetRoot()->SetName("root");
  storage->GetRoot()->Initialize();

  ///////////////// render stuff /////////////////////////
  vtkRenderer *frontRenderer;
  vtkNEW(frontRenderer);
  frontRenderer->SetBackground(0.1, 0.1, 0.1);
  m_RenderWindow = vtkRenderWindow::New();
  m_RenderWindow->AddRenderer(frontRenderer);
  m_RenderWindow->SetSize(640, 480);
  m_RenderWindow->SetPosition(200,0);

  vtkRenderWindowInteractor *renderWindowInteractor = vtkRenderWindowInteractor::New();
  renderWindowInteractor->SetRenderWindow(m_RenderWindow);
  //////////////////////////////////////////////////////////////////////////

  mafVMEVolumeGray *testVolume;
  mafNEW(testVolume);
  testVolume->ReparentTo(storage->GetRoot());

  int volumeDimensions[3];
  volumeDimensions[0] = 5;
  volumeDimensions[1] = 5;
  volumeDimensions[2] = 5;

  vtkMAFSmartPointer<vtkImageData> imageData;
  imageData->SetDimensions(volumeDimensions[0],volumeDimensions[1],volumeDimensions[2]);
  imageData->SetSpacing(1.,1.,1.);

  vtkMAFSmartPointer<vtkFloatArray> scalarArray;
  scalarArray->SetNumberOfComponents(1);
  scalarArray->SetName("Scalar");
  
  vtkMAFSmartPointer<vtkFloatArray> vectorArray;
  vectorArray->SetNumberOfComponents(3);
  vectorArray->SetNumberOfTuples(volumeDimensions[0]*volumeDimensions[1]*volumeDimensions[2]);
  vectorArray->SetName("Vector");

  for(int i=0;i< volumeDimensions[0]*volumeDimensions[1]*volumeDimensions[2];i++)
  {
    scalarArray->InsertNextTuple1(i%3);
    vectorArray->SetTuple3(i, i, i, i);
  }

  imageData->GetPointData()->SetScalars(scalarArray);
  imageData->GetPointData()->SetActiveScalars("Scalar");

  
  testVolume->SetData(imageData, 0.);
  testVolume->Update();

  mafVMEOutput *output = testVolume->GetOutput();
  output->Update();
  vtkPointData *pointData = output->GetVTKData()->GetPointData();
  pointData->Update();

  pointData->AddArray(vectorArray);
  pointData->SetActiveVectors("Vector");

  //Assembly will be create when instancing mafSceneNode
  mafSceneNode *rootscenenode = new mafSceneNode(NULL, NULL, storage->GetRoot(), NULL, NULL);
  mafSceneNode *sceneNode = new mafSceneNode(NULL,rootscenenode,testVolume, frontRenderer);

  /////////// Pipe Instance and Creation ///////////
  medPipeVectorFieldGlyphs *pipe = new medPipeVectorFieldGlyphs;
  pipe->Create(sceneNode);
  pipe->m_RenFront = frontRenderer;

  vtkPropCollection *actorList = vtkPropCollection::New();
  pipe->GetAssemblyFront()->GetActors(actorList);

  actorList->InitTraversal();
  vtkProp *actor = actorList->GetNextProp();
  while(actor)
  {   
    frontRenderer->AddActor(actor);
    m_RenderWindow->Render();

    actor = actorList->GetNextProp();
  }

  m_RenderWindow->Render();
  mafSleep(2000);
  CompareImage();

  vtkDEL(actorList);

  pipe->Delete();
  sceneNode->m_RenFront = NULL;
  delete sceneNode;
  delete(rootscenenode);

  vtkDEL(renderWindowInteractor);
  vtkDEL(m_RenderWindow);
  vtkDEL(frontRenderer);


  testVolume->ReparentTo(NULL);
  mafDEL(testVolume);
  mafDEL(storage);
}