|
EWeiss
(Gast)
n/a Beiträge |
#25
![]() Bei der von mir vorgeschlagenen Lösung würdest du jeweils maximal 25 Texturen behalten, aber müsstest trotzdem immer nur Eine neu laden.
Beim Start werden all Texturen mit NoCoverTexturen befüllt.
Delphi-Quellcode:
Anschließend wird die INI eingeladen.
// fill all Quads with NoCoverTexture
if FileExists(FullDataPath + 'images\Default\NoCover.JPG') then begin LoadTexture(FullDataPath + 'images\Default\NoCover.JPG', NoCoverTexture, False); for q := 0 to QuadCount - 1 do quadTexture[q] := NoCoverTexture; end else NoCoverTexture := 0;
Delphi-Quellcode:
In aCovers stehen jetzt alle 25 Pfade zu den Album Covers.
procedure LoadINI;
var I: Integer; str: string; tmpList: TStringList; begin tmpList := TStringList.Create; try With AlbumIni do begin aCovers.Clear; CoverCount := StrToInt(ReadString('AlbumCover', 'Count', '0')); if CoverCount > 0 then begin for I := 0 to CoverCount - 1 do begin str := ReadString('AlbumCover', 'Folder' + IntToStr(I), ''); if (Length(str) > 0) then if FileExists(str) then aCovers.Add(str) else tmpList.Add(str); end; end; end; finally if tmpList.count > 0 then begin AlbumIni.EraseSection('AlbumCover'); for I := 0 to aCovers.count - 1 do AlbumIni.WriteString('AlbumCover', 'Folder' + IntToStr(I), aCovers.strings[I]); end; tmpList.Free; end; AlbumIni.Free; end; Jetzt werden all NoCoverTexturen mit den vorhandenen Covers gefüllt.
Delphi-Quellcode:
Und hier wird jetzt nur noch 1 Cover geladen..
if (aFileName = 'FOLDER') or (aFileName = Name) then
begin if quadTexture[I] = NoCoverTexture then LoadTexture(aCovers[I], quadTexture[I], False); // add to List LstCoverPath.Add(aCovers[I]); end;
Delphi-Quellcode:
Der erste Eintrag in der Liste für die Pfade zu den Cover Bildern wird geöscht.
if (aCovers.count > QuadCount) then
begin // delete first Cover aCovers.Delete(0); // move textures from destination to source for I := 0 to (aCovers.count - 1) do begin quadTexture[I] := quadTexture[I + 1]; // add to List LstCoverPath.Add(aCovers[I]); // Load last Testure if I = (QuadCount - 1) then begin // extract Filename aFileName := ExtractFileName(aCovers[I]); // extract extension aFileName := Copy(aFileName, 1, Length(aFileName) - Length(ExtractFileExt(aFileName))); // uppercase aFileName := AnsiUpperCase(aFileName); Name := ExtractFileName(GetAlbumArtistName); if Name <> '' then Name := Copy(Name, 1, Length(Name) - Length(ExtractFileExt(Name))); if (aFileName = 'FOLDER') or (aFileName = Name) then begin if quadTexture[I] <> NoCoverTexture then glDeleteTextures(1, @quadTexture[I]); LoadTexture(aCovers[I], quadTexture[I], False); end; end; end; end aCovers.Delete(0); Hier werden die Texturen verschoben quadTexture[I] := quadTexture[I + 1]; Jetzt wird die Liste zu den Cover Bildern aktualisiert LstCoverPath.Add(aCovers[I]); Wenn I das gleiche wie Maximaler Cover Count -1 dann wird die letzte Texture gelöscht glDeleteTextures(1, @quadTexture[I]); und nur noch einmalig für dieses Album geladen LoadTexture(aCovers[I], quadTexture[I], False); Das geht schnell ohne merklichen Performance Verlust. Ich weiß das Rendern von dir ist nur ein Beispiel aber da steckt im Original einiges mehr an Funktionen drin
Delphi-Quellcode:
procedure RenderAlbum(aDeltaTime: single);
// Diese Funktion zeichnet die Quader. ColorScale skaliert dabei die Farbwerte der oberen beiden Ecken procedure DrawQuads(); var I: Integer; // index der for-schleife QuadAngle: single; // die Rotation des aktuellen Quads aPos: TGLVectord3; // die finale Position des aktuellen Quads [aPos = array[0..2] of single] begin glEnable(GL_TEXTURE_2D); glInitNames; glPushName(0); // alle Quads durchgehen for I := 0 to QuadCount - 1 do begin // Position initialisieren (aPos[0] = 0, aPos[1] = 0, aPos[2] = 10) aPos := Vector_Make3f(0, 0, 12); // Die Rotation des Quads (um den Mittelpunkt des Kreises, der durch die Quads gebildet wird) // + ListAnge, also die Rotation, die mit der Maus gemacht wird QuadAngle := DegToRad(360 / (QuadCount) * I) + ListAngle; // Den Positionvektor um den Mittelpunkt des Kreises um die Y-Achse rotieren aPos := Vector_Rotatef3(aPos, Vector_Make3f(0, 0, 0), QuadAngle, False, True, False); glBindTexture(GL_TEXTURE_2D, quadTexture[I]); if I = CurrentQuad then begin // Jetzt brauchen wir Blending glEnable(GL_BLEND); // nun die Blending-Funktion setzen glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(1, 1, 1, 0.7); // move to foreground StayOnTop(aPos, 1.5); // show only available cover if not(quadTexture[I] = NoCoverTexture) then begin win.IMGTexture := quadTexture[I]; win.bRenderGUI := True; end; end else begin // Original Farben setzen glColor4f(1, 1, 1, 1); // Blenden ausschalten glDisable(GL_BLEND); end; if not(LastAddCover = Round(NoCoverTexture)) then if LastAddCover = Trunc(quadTexture[I]) then begin glColor3f(1.0, 1.0, 1.0); glDisable(GL_TEXTURE_2D); // rahmen zeichnen glLineWidth(1); glBegin(GL_LINE_LOOP); glVertex3f(aPos[0] - QuadSizeS, aPos[1] + QuadSizeS * 2, aPos[2]); glVertex3f(aPos[0] - QuadSizeS, aPos[1], aPos[2]); glVertex3f(aPos[0] + QuadSizeS, aPos[1], aPos[2]); glVertex3f(aPos[0] + QuadSizeS, aPos[1] + QuadSizeS * 2, aPos[2]); glEnd; glEnable(GL_TEXTURE_2D); // Quad zeichnen glBegin(GL_QUADS); glTexCoord2f(0, 1); glVertex3f(aPos[0] - QuadSizeS, aPos[1] + QuadSizeS * 2, aPos[2]); glTexCoord2f(0, 0); glVertex3f(aPos[0] - QuadSizeS, aPos[1], aPos[2]); glTexCoord2f(1, 0); glVertex3f(aPos[0] + QuadSizeS, aPos[1], aPos[2]); glTexCoord2f(1, 1); glVertex3f(aPos[0] + QuadSizeS, aPos[1] + QuadSizeS * 2, aPos[2]); glEnd(); end; // Quad zeichnen glBegin(GL_QUADS); glTexCoord2f(0, 1); glVertex3f(aPos[0] - QuadSize, aPos[1] + QuadSize * 2, aPos[2]); glTexCoord2f(0, 0); glVertex3f(aPos[0] - QuadSize, aPos[1], aPos[2]); glTexCoord2f(1, 0); glVertex3f(aPos[0] + QuadSize, aPos[1], aPos[2]); glTexCoord2f(1, 1); glVertex3f(aPos[0] + QuadSize, aPos[1] + QuadSize * 2, aPos[2]); glEnd(); glLoadName(I + 1); end; glPopName; end; begin glDepthMask(ByteBool(GL_TRUE)); // Kamera ausrichten, damit man was sieht glTranslatef(0, -7, -30); // Maus verarbeiten if FMousePos.X > 0 then begin if FMousePos.X < 30 then ListAngle := ListAngle - pi / 4 * aDeltaTime else if FMousePos.X > _FNormal.Image1.Width - 30 then ListAngle := ListAngle + pi / 4 * aDeltaTime; end; // Wichtig für die Spiegelung glDisable(GL_CULL_FACE); glEnable(GL_BLEND); // Jetzt spiegel wir alles an der x-z-Ebene glScalef(1, -1, 1); // Jetzt zeichnen wir zuerst die Reflektionen der Quads DrawQuads(); glDisable(GL_BLEND); // Dann spiegel wir wieder zurück glScalef(1, -1, 1); // und zeichnen die eigentlichen Quads DrawQuads(); // Jetzt brauchen wir Blending glEnable(GL_BLEND); // nun die Blending-Funktion setzen glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBegin(GL_QUADS); glColor4f(0.0, 0.0, 0.0, 0.7); glVertex3f(-15, 0, 15); glVertex3f(-15, 0, -15); glVertex3f(15, 0, -15); glVertex3f(15, 0, 15); glEnd(); glDisable(GL_BLEND); glLoadIdentity; end; gruss Geändert von EWeiss (17. Aug 2016 um 19:21 Uhr) |
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |