OpenGL i fragment modelu

0

Witam,
mam taki problem
Mam model (np rowerek) w pliku obj, wczytuje go do programu, rysuje, mogę skalować, przesuwać, itp..
I chce żeby po kliknięciu na koło w jakimś tam okienku pojawiało się co to jest znaczy koło.
Może ma ktoś jakiś pomysł jak taką funkcjonalność zrealizować?

0

akurat obj posiada funkcje grupowania faceow jak odpowiednio pogropujesz sciany i narysujesz kazda grupe innym kolorem to bedziesz w stanie wiedziec w co trafiles

0

;]

 
void __fastcall TGridBuilderClass::CREATE_SEPARATED_OBJECTS_FROM_MODEL(TachoGLModel * model)
{
double r = 0.0; double g = 0.0; double b = 0.0; //start color

model->FACE_R.set_length(model->VBO_BE.Length);
model->FACE_G.set_length(model->VBO_BE.Length);
model->FACE_B.set_length(model->VBO_BE.Length);

model->FACE_Cr.set_length(model->VBO_BE.Length);
model->FACE_Cg.set_length(model->VBO_BE.Length);
model->FACE_Cb.set_length(model->VBO_BE.Length);

int Ar = 0; int Ag = 0; int Ab =0;//i tak operujemy na tym

	 int i;
	 for (i = 0; i < model->VBO_BE.Length; i++) {
Ab = Ab+1;
if (Ab > 255) { Ab = 0; Ag = Ag + 1; }
if (Ag > 255) { Ag = 0; Ab = 0; Ar = Ar + 1;}
if (Ar > 255) {ShowMessage("PARANOJA"); return;}


model->FACE_R[i] = double(Ar) / 255.0;
model->FACE_G[i] = double(Ag) / 255.0;
model->FACE_B[i] = double(Ab) / 255.0;
model->FACE_Cr[i] = Ar;
model->FACE_Cg[i] = Ag;
model->FACE_Cb[i] = Ab;
	 }





     //ShowMessage(IntToStr(Ab)+ "   "+IntToStr(Ag)+"   "+IntToStr(Ar));

}
void __fastcall TGridBuilderClass::OnClick(int X, int Y)
{


int k;
     int i;

int p = RETURN_GRID_INDEX(X,Y);

													if (p > -1)   {
k = FIND_FACE_TO_EDIT(Grid[p]->gridmodel, X, Y,true);

if (k > -1)
Grid[p]->AddNewPoint(	Grid[p]->gridmodel->FACE_CENTER_POINT[k]	);



}



}
 
 
int __fastcall TGridBuilderClass::FIND_FACE_TO_EDIT(TachoGLModel * model, int X, int Y, bool rule)
{
glPushMatrix();
int result = -1;
	  int i;
//Graphics::TBitmap *BMP = new Graphics::TBitmap;

glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
	   glDisable(GL_TEXTURE_2D);
//glDisable(GL_FOG);
gluLookAt(EYEPOS.x,EYEPOS.y,EYEPOS.z,EYEPOS.x+EYELOOKATPOINT.x,
EYEPOS.y-EYELOOKATPOINT.y,EYEPOS.z-EYELOOKATPOINT.z,
0,1,0);

											glPushMatrix();
										   	glTranslatef(model->translacja.x,model->translacja.y,model->translacja.z);
model->DrawFacesAsSelection();
glPopMatrix();



//int xHRESULT = 0;

	glEnable(GL_TEXTURE_2D);//blad :] trza usunac
	glPopMatrix();

	int kr,kg,kb,ka;
	READ_RGBA_FROM_OGL_WINDOW(X,CH,Y,kr,kg,kb,ka);
//	ShowMessage("R="+IntToStr(kr) + "   G="+IntToStr(kg) + "   B="+IntToStr(kb) + "   A="+IntToStr(ka));
for (i = 0; i < model->VBO_BE.Length; i++)
if ( ( kb == model->FACE_Cb[i]) && ( kg == model->FACE_Cg[i]) && ( kr == model->FACE_Cr[i]) )   {

result = i; break;
}

	return result;
	//--------------------------jak co to ten kod tez dziala ale mam szybszy!
	/*
ZAPISZ_WIDOK_DO_BITMAPY( BMP ,CW,CH);
//BMP->SaveToFile("E:\\FACE MATRIX.BMP");
Byte *p;
p = (Byte*)BMP->ScanLine[Y];
for (i = 0; i < model->VBO_BE.Length; i++)
if ( ( p[X*4] == model->FACE_Cb[i]) && ( p[X*4+1] == model->FACE_Cg[i]) && ( p[X*4+2] == model->FACE_Cr[i]) )   {
//ShowMessage("I GOT A FACE");
result = i; break;
}
		if (rule == true) {
//						BMP->SaveToFile("C:\\RRRR.BMP");
		}
delete BMP;

//glEnable(GL_FOG);
   return result;
   */
}
 
void __fastcall READ_RGBA_FROM_OGL_WINDOW(int x,int height, int y, int & r, int & g, int & b, int & a)
{




	unsigned char* pdata = new unsigned char[4];

	glReadBuffer(GL_COLOR_BUFFER_BIT);


	glReadPixels(x,height-y,1,1,GL_RGBA,GL_UNSIGNED_BYTE,pdata);


r = pdata[0];
g = pdata[1];
b = pdata[2];
a = pdata[3];
//	delete B2;
	delete [] pdata;

}
 
void __fastcall TachoGLModel::DrawFacesAsSelection()
{

glDisableClientState(GL_NORMAL_ARRAY_EXT);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(t3dpoint), &VBO_V[0]);

int i,j;

for (i = 0; i < Matrixarr.Length; i++)  {
glColor3f(FACE_R[i],FACE_G[i],FACE_B[i]);

glDrawArrays(matrixtogl(Matrixarr[i]), VBO_BE[i].INDEX_START , VBO_BE[i].length);

}


glEnableClientState(GL_NORMAL_ARRAY_EXT);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
}

ewentualnie jesazce ta funkcja

 
int __fastcall TGridBuilderClass::RETURN_GRID_INDEX(int X, int Y)
{

int result = -1;
      int i;                    glPushMatrix();
//Graphics::TBitmap *BMP = new Graphics::TBitmap;
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);

			   glDisable(GL_TEXTURE_2D);
			   glLoadIdentity();
gluLookAt(EYEPOS.x,EYEPOS.y,EYEPOS.z,EYEPOS.x+EYELOOKATPOINT.x,
EYEPOS.y-EYELOOKATPOINT.y,EYEPOS.z-EYELOOKATPOINT.z,
0,1,0);


//glDisable(GL_FOG);

for (i = 0; i < Grid.Length; i++)  {
											glPushMatrix();
											glTranslatef(
											Grid[i]->gridmodel->translacja.x,
											Grid[i]->gridmodel->translacja.y,
											Grid[i]->gridmodel->translacja.z);
Grid[i]->gridmodel->DrawAsSelection();
                                            glPopMatrix();
}
//model->DrawAsSelection();
//TERRAIN2->DrawAsSelection();


int xHRESULT = 0;

glEnable(GL_TEXTURE_2D);        glPopMatrix();


	int kr,kg,kb,ka;
	READ_RGBA_FROM_OGL_WINDOW(X,CH,Y,kr,kg,kb,ka);
for (i = 0; i < Grid.Length; i++)
if ( ( kb == Grid[i]->gridmodel->Cb) && ( kg == Grid[i]->gridmodel->Cg) && ( kr == Grid[i]->gridmodel->Cr) )   {
result = i;
}
return result;

//-----------------jak co to nizej dziala ale mam szybsze rozwiazanie
					/*
ZAPISZ_WIDOK_DO_BITMAPY( BMP,CW,CH );

//BMP->SaveToFile("E:\\FACE.BMP");
Byte *p;
p = (Byte*)BMP->ScanLine[Y];
for (i = 0; i < Grid.Length; i++)
if ( ( p[X*4] == Grid[i]->gridmodel->Cb) && ( p[X*4+1] == Grid[i]->gridmodel->Cg) && ( p[X*4+2] == Grid[i]->gridmodel->Cr) )   {
result = i;
}
delete BMP;

//glEnable(GL_FOG);
return result;       */
}


i co teraz?

ogolnie to niekeidy mam tam w kodzie glENable(GL_TEXTURE_2D); a go tam nie powinno byc ale na szczescie mi to dziala nawet z tym glenable ale tam tych linijek nie powinno byc bo rysujemy czysta sciany bez tekstur

1 użytkowników online, w tym zalogowanych: 0, gości: 1