Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Jul 05, 2025 13:40

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: TextureManager spackt rum Oo
BeitragVerfasst: Mi Jun 14, 2006 15:57 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
Mein TextureManager führt beim binden zu einer AccessViolation beim zugriff auf das array, ich weiß leider nicht warum:
Code:
  1.  
  2. unit UTextureManager;
  3.  
  4. interface
  5.  
  6. uses sysutils, inifiles, dglOpenGL, glBitmap;
  7.  
  8. type
  9.   TTextureManager = class
  10.     Textures: array of Tgluint;
  11.     TextureName: THashedStringList;
  12.     constructor Create;
  13.     destructor Destroy; override;    
  14.     procedure Free;
  15.   public
  16.     procedure AddTexture(pFileName, pTextureName: String);
  17.     procedure AddTexturesInDir(pDirName, pFileMask: String; psubdirs: boolean);
  18.     procedure BindTexture(pTextureName: String);
  19.   end;
  20.  
  21. implementation
  22.  
  23. constructor TTextureManager.Create;
  24. begin
  25.   inherited Create;
  26.   setlength(Textures, 0);
  27.   TextureName := THashedStringList.Create;
  28. end;
  29.  
  30. destructor TTextureManager.Destroy;
  31. begin
  32.   TextureName.Free;
  33.   inherited Destroy;
  34. end;
  35.  
  36. procedure TTextureManager.Free;
  37. begin
  38.   if Self <> nil then
  39.     Destroy;
  40. end;
  41.  
  42. procedure TTextureManager.AddTexture(pFileName, pTextureName: String);
  43. begin
  44.   setlength(Textures, length(Textures) + 1);
  45.   LoadTexture(pFilename, Textures[high(Textures)], False);
  46.   TextureName.add(pTextureName);
  47. end;
  48.  
  49. procedure TTextureManager.AddTexturesInDir(pDirName, pFileMask: String; psubdirs: boolean);
  50.   procedure ScanDir(const Directory: String);
  51.     function CutExt(astr: string): string;
  52.     var
  53.       i: integer;
  54.     begin
  55.       result := astr;
  56.       for i := length(astr) downto 1 do
  57.         if astr[i] = '.' then
  58.         begin
  59.           result := copy(astr, 1, i);
  60.           exit;
  61.         end;
  62.     end;
  63.   var
  64.     SR: TSearchRec;
  65.   begin
  66.     if FindFirst(Directory + pFileMask, faAnyFile - faDirectory, SR) = 0 then
  67.     try
  68.       repeat
  69.         AddTexture(Directory + SR.Name, CutExt(SR.Name));
  70.       until FindNext(SR) <> 0;
  71.     finally
  72.       FindClose(SR);
  73.     end;
  74.     if pSubDirs then
  75.     begin
  76.       if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then
  77.       try
  78.         repeat
  79.           if ((SR.attr and faDirectory) = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') then
  80.             ScanDir(Directory + SR.Name + '');
  81.         until FindNext(SR) <> 0;
  82.       finally
  83.         FindClose(SR);
  84.       end;
  85.     end;
  86.   end;
  87. var
  88.   aDir: string;
  89. begin
  90.   aDir := pDirName;
  91.   if aDir = '' then
  92.     Exit;
  93.   if aDir[Length(aDir)] <> '' then
  94.     aDir := aDir + '';
  95.   ScanDir(aDir);
  96. end;
  97.  
  98. procedure TTextureManager.BindTexture(pTextureName: String);
  99. begin
  100.   glBindTexture(GL_TEXTURE_2D, Textures[Texturename.IndexOf(pTextureName)]);
  101. end;
  102.  
  103. end.
  104.  


Vielen Dank schonmal


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 14, 2006 16:28 
Offline
DGL Member

Registriert: Mo Dez 20, 2004 08:58
Beiträge: 442
Wohnort: Mittweida (Sachsen)
Na auf Anhieb würde ich sagen, dass der Texturnamen nicht in der HashedStringList ist (und demzufolge IndexOf -1 liefert.
Teil doch mal diese Zeile auf, indem Du erstmal den Index in nen Int schreibst...

Zudem Ist doch LoadTexture imho Call by reference, und schreibt dann die id in den übergebenen Int.. Jetzt isses aber bein dyn arrays bissi kniflig mit sowas. Auch hier solltest Du evtl erstmal einfach ne intvariable übergeben und diese nach dem Aufruf von LoadTexture in das Array schreiben.

Zudem kannst Du dir das Array eigentlich komplett sparen, da die Stringliste die schöne Prop .Objects[] hat. hier kannst Du problemlos einen auf TObject gecasteten Integer reinschreiben und diesen beim lesen wieder in int zurückcasten. (Der Compiler sagt dann zwar unsichere Typumwandlung, aber was solls)

_________________
Manchmal sehen Dinge, die wie Dinge aussehen wollen, mehr wie Dinge aus, als Dinge.
<Esmerelda Wetterwax>
Es kann vorkommen, dass die Nachkommen trotz Abkommen mit ihrem Einkommen nicht auskommen und umkommen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 14, 2006 16:32 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
ich kann auch manuell auf [0] zugreifen, der fehler kommt trotzdem
Zitat:
Zudem Ist doch LoadTexture imho Call by reference, und schreibt dann die id in den übergebenen Int.. Jetzt isses aber bein dyn arrays bissi kniflig mit sowas. Auch hier solltest Du evtl erstmal einfach ne intvariable übergeben und diese nach dem Aufruf von LoadTexture in das Array schreiben.

versteh ich net ganz, Edit: achso hab verstanden - teste....

du meinstest:
Code:
  1.  
  2. procedure TTextureManager.AddTexture(pFileName, pTextureName: String);
  3. var
  4.   tempint: TGluInt;
  5. begin
  6.   setlength(Textures, length(Textures) + 1);
  7.   LoadTexture(pFilename, tempint, False);
  8.   TextureName.add(pTextureName);
  9.   Textures[high(Textures)] := tempint;
  10. end;
  11.  

aber daran hats wohl net gelegen


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 14, 2006 18:17 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
so gehts leider auch net:
Code:
  1.  
  2. unit UTextureManager;
  3.  
  4. interface
  5.  
  6. uses sysutils, inifiles, dglOpenGL, glBitmap;
  7.  
  8. type
  9.   TTextureManager = class
  10.     Textures: array of TglBitmap2D;
  11.     TextureName: THashedStringList;
  12.     constructor Create;
  13.     destructor Destroy; override;    
  14.     procedure Free;
  15.   public
  16.     procedure AddTexture(pFileName, pTextureName: String);
  17.     procedure AddTexturesInDir(pDirName, pFileMask: String; psubdirs: boolean);
  18.     procedure BindTexture(pTextureName: String);
  19.   end;
  20.  
  21. implementation
  22.  
  23. constructor TTextureManager.Create;
  24. begin
  25.   inherited Create;
  26.   setlength(Textures, 0);
  27.   TextureName := THashedStringList.Create;
  28. end;
  29.  
  30. destructor TTextureManager.Destroy;
  31. var
  32.   i: integer;
  33. begin
  34.   TextureName.Free;
  35.   for i := low(Textures) to high(Textures) do
  36.     Textures[i].Free;
  37.   inherited Destroy;
  38. end;
  39.  
  40. procedure TTextureManager.Free;
  41. begin
  42.   if Self <> nil then
  43.     Destroy;
  44. end;
  45.  
  46. procedure TTextureManager.AddTexture(pFileName, pTextureName: String);
  47. begin
  48.   setlength(Textures, length(Textures) + 1);
  49. //  LoadTexture(pFilename, Textures[high(Textures)], False);
  50.   TextureName.add(pTextureName);
  51.  
  52.   Textures[high(Textures)] := TglBitmap2D.Create; // Instanz der Klasse erstellen
  53.   Textures[high(Textures)].LoadFromFile(pFilename); // Datei laden
  54.   Textures[high(Textures)].GenTexture; // geladene Textur an OpenGL übergeben
  55. end;
  56.  
  57. procedure TTextureManager.AddTexturesInDir(pDirName, pFileMask: String; psubdirs: boolean);
  58.   procedure ScanDir(const Directory: String);
  59.     function CutExt(astr: string): string;
  60.     var
  61.       i: integer;
  62.     begin
  63.       result := astr;
  64.       for i := length(astr) downto 1 do
  65.         if astr[i] = '.' then
  66.         begin
  67.           result := copy(astr, 1, i);
  68.           exit;
  69.         end;
  70.     end;
  71.   var
  72.     SR: TSearchRec;
  73.   begin
  74.     if FindFirst(Directory + pFileMask, faAnyFile - faDirectory, SR) = 0 then
  75.     try
  76.       repeat
  77.         AddTexture(Directory + SR.Name, CutExt(SR.Name));
  78.       until FindNext(SR) <> 0;
  79.     finally
  80.       FindClose(SR);
  81.     end;
  82.     if pSubDirs then
  83.     begin
  84.       if FindFirst(Directory + '*.*', faAnyFile, SR) = 0 then
  85.       try
  86.         repeat
  87.           if ((SR.attr and faDirectory) = faDirectory) and (SR.Name <> '.') and (SR.Name <> '..') then
  88.             ScanDir(Directory + SR.Name + '');
  89.         until FindNext(SR) <> 0;
  90.       finally
  91.         FindClose(SR);
  92.       end;
  93.     end;
  94.   end;
  95. var
  96.   aDir: string;
  97. begin
  98.   aDir := pDirName;
  99.   if aDir = '' then
  100.     Exit;
  101.   if aDir[Length(aDir)] <> '' then
  102.     aDir := aDir + '';
  103.   ScanDir(aDir);
  104. end;
  105.  
  106. procedure TTextureManager.BindTexture(pTextureName: String);
  107. begin
  108. //  glBindTexture(GL_TEXTURE_2D, Textures[Texturename.IndexOf(pTextureName)]);
  109.   Textures[Texturename.IndexOf(pTextureName)].Bind;
  110. end;
  111.  
  112. end.
  113.  


die liste ist ebenfalls leer :cry: das liegt an dem loadfromdir teil


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi Jun 14, 2006 18:46 
Offline
DGL Member

Registriert: Di Mai 24, 2005 16:43
Beiträge: 710
ok ihr werdet es mir nicht glauben *nichhaun*

ich habe nur ein '*' vergessen ^^ :lol: :roll: jetzt gehts alles, vielen dank


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]