Newsgroup: it.comp.lang.delphi
Titolo: Problema di classi e company.....AIUTOOOOOOO

Cara gente programmatrice di Delphi,
sono un pò disperato perchè non mi funziona una cosa riguardante le classi, in
particolare, una procedura che mi serve per fare delle animazioni con le
Opengl, se avete un minimo di esperienza di programmazione grafica forse mi
potete aiutare, provate cmq.
Allora riassumendo il problema:
Creo 2 classi in una unit in questo modo + o meno
type T3DSModel=class
   public
    FileName:String;
    myfile:file;
    ecc....
    ecc....
   end;
type T3DSAnimation=class
  public
   appoggio:t3dsmodel;
   .... 
   ....
   Function glJunkAnimate3ds(models:array of
T3DSModel;Speed:integer;Frames:integer;Mode:glJunkAnimationMode):boolean;
  end;
la prima classe serve per contenere i dati di un modello 3d mentre la seconda
classe serve a gestire l'animazione in sè. Il primo parametro della funzione
della classe t3dsanimation è un array di modelli 3d in modo che la funzione
utilizzi gli elementi dell'array come i vari frame dell'animazione.
Ora, il problema è questo:
quando vado ad usare la funzione ed inserisco come primo paramentro l'array di
t3dmodel, la funzione non dovrebbe modificare in alcun modo l'array dato che:
1: L'ARRAY DI T3DSMODEL NON VIENE DICHIARATO CON VAR QUINDI NON PUO' VARIARE
2: DENTRO LA FUNZIONE NON MODIFICO MAI L'ARRAY PERCHE' CAMBIO SOLO LA VARIABILE
APPOGGIO ASSEGNANDOLA CON "..APPOGGIO:=MODELS[0] "
....e invece il primo elemento dell'array cambia INSPIEGABILMENTE insieme alla
variabile appoggio nonostante i motivi sopraelencati
PERCHEEEEEEEEEEEEE'???
sto impazzendo vi prego aiutatemi e benedirò questo NG.
CIAO
-- 
Posted from  [212.171.201.109] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 PERCHEEEEEEEEEEEEE'???
Poi per caso fai appoggio.qualcosa:=qualcosaltro ? (ovvero, poi l'oggetto
appoggio lo modifichi ?) Se si allora e' quello, perche' le classi anche se
le passi per parametro e non per valore, solo comunque modificabili,
perche', come dice il saggio, le classi sono puntatori..
Se non modifichi appoggio, prova a postare il codice della funzione, cosi'
vediamo. Ciao !

 vediamo. Ciao !
Bè non avrei mai voluto farlo ma purtroppo ecco qui il codice:
var 
ani:t3dsanimation;
morf: array [0..2] of t3dsmodel;
procedure TForm1.FormCreate(Sender: TObject);
 begin
  ...... 
  ......
   for i:=0 to 2 do
    begin
     morf[i]:=T3DSModel.Create;
     case i of
      0:morf[i].FileName:='00.3ds';
      1:morf[i].FileName:='01.3ds';
      2:morf[i].FileName:='02.3ds';
     end;
     morf[i].glJunkLoad3ds;
    end;
    ani:=T3DSAnimation.Create;
    ani.appoggio:=t3dsmodel.Create;
    ani.appoggio:=morf[0];
    ani.fposition:=1;
   .....
   .....
  end;
nella routine di rendering poi inserisco:
ani.glJunkAnimate3ds(morf,200,3,glj_onereverse);
//non fate caso al quarto parametro
questa è in modo sintetico la funzione nella unit:
function T3dsanimation.glJunkAnimate3ds(models:array of
T3DSModel;Speed:integer;Frames:integer;Mode:glJunkAnimationMode):boolean;
var i,a:integer;
begin
for i:=0 to appoggio.numelement do
begin
//************************Caricamento dati animazione da eseguire una volta per
ogni modello*********************
if unitbool=false then
 begin
   unitbool:=true;
     for a:=0 to appoggio.element[i].vertexlist.Number-1 do
      begin
unitx[a]:=abs((appoggio.element[i].vertexlist.floatdata[5+(a*8)]-models[fposition].element[i].vertexlist.floatdata[5+(a*8)])/speed);
unity[a]:=abs((appoggio.element[i].vertexlist.floatdata[6+(a*8)]-models[fposition].element[i].vertexlist.floatdata[6+(a*8)])/speed);
unitz[a]:=abs((appoggio.element[i].vertexlist.floatdata[7+(a*8)]-models[fposition].element[i].vertexlist.floatdata[7+(a*8)])/speed);
       if   appoggio.element[i].vertexlist.floatdata[5+(a*8)]<
models[fposition].element[i].vertexlist.floatdata[5+(a*8)]
       then ridx[a]:=true
       else ridx[a]:=false;
       if   appoggio.element[i].vertexlist.floatdata[6+(a*8)]<
models[fposition].element[i].vertexlist.floatdata[6+(a*8)]
       then ridy[a]:=true
       else ridy[a]:=false;
       if   appoggio.element[i].vertexlist.floatdata[7+(a*8)]<
models[fposition].element[i].vertexlist.floatdata[7+(a*8)]
       then ridz[a]:=true
       else ridz[a]:=false;
 
      end; //FOR
 end;
//*******************************Spostamento dei
vertici*******************************************
if loop<>speed then
begin
 for a:=0 to appoggio.element[i].vertexlist.Number-1 do
  begin
   if   ridx[a]
   then
appoggio.element[i].vertexlist.floatdata[5+(a*8)]:=appoggio.element[i].vertexlist.floatdata[5+(a*8)]+UNITX[a]
   else
appoggio.element[i].vertexlist.floatdata[5+(a*8)]:=appoggio.element[i].vertexlist.floatdata[5+(a*8)]-UNITX[a];
   if   ridy[a]
   then
appoggio.element[i].vertexlist.floatdata[6+(a*8)]:=appoggio.element[i].vertexlist.floatdata[6+(a*8)]+UNITY[a]
   else
appoggio.element[i].vertexlist.floatdata[6+(a*8)]:=appoggio.element[i].vertexlist.floatdata[6+(a*8)]-UNITY[a];
   if   ridz[a]
   then
appoggio.element[i].vertexlist.floatdata[7+(a*8)]:=appoggio.element[i].vertexlist.floatdata[7+(a*8)]+unitz[a]
   else
appoggio.element[i].vertexlist.floatdata[7+(a*8)]:=appoggio.element[i].vertexlist.floatdata[7+(a*8)]-unitz[a];
  end; // for
//@models[0].element[i].vertexlist.floatdata - se metto questo l'effetto è lo
stesso (invece models[0] non dovrebbe variare)
glInterleavedArrays(GL_T2F_N3F_V3F,0,@appoggio.element[i].vertexlist.floatdata);
glDrawElements(GL_TRIANGLES,appoggio.element[i].faceslist.Number*3,GL_UNSIGNED_SHORT,@appoggio.element[i].faceslist.worddata);
 inc(loop);
 
end  /// IF
else      // se tutti i vertici si sono spostati nella posizione dei vertici
del frame successivo allora...
begin
   unitbool:=false;   //permette di caricare i dati del prossimo frame
   loop:=0;
   if Frames-1>=fposition+1 then fposition:=fposition+1   
   else begin
         fposition:=0 //A QUESTO PUNTO SE ASSEGNO AD FPOSITION 0 L'ANIMAZIONE
DOVREBBE RIPARTIRMI DA CAPO
                      //(E NON SUCCEDE xCHè Models[0] SI MODIFICA CON APPOGGIO)
                      // SE INVECE METTO fposition:=1 L'ANIMAZIONE TORNA
CORRETTAMENTE AL SECONDO FRAME
                      // DA CIO' DEDUCO CHE SOLO IL PRIMO ELEMENTO DI MODELS SI
MODIFICA SENZA SPIEGAZIONI!
        end;
end;
end;
end; ///FINE FUNZIONE
-- 
Posted from  [212.171.201.106] 


 for i:=0 to appoggio.numelement do
non capisco... glJunkAnimate3ds accetta models, che è un array di
modelli... ma lavora su appoggio... che è in realtà morf[0] ... non
dovrebbe lavorare su morf ? (magari copiando ogni modello in un
appoggio)
Ciao,
--
Davide DG.
  - In medio stat virtus -