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
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