diff options
-rw-r--r-- | Game/Code/Classes/UTexture.pas | 84 |
1 files changed, 45 insertions, 39 deletions
diff --git a/Game/Code/Classes/UTexture.pas b/Game/Code/Classes/UTexture.pas index d5926e45..3028fb71 100644 --- a/Game/Code/Classes/UTexture.pas +++ b/Game/Code/Classes/UTexture.pas @@ -131,9 +131,6 @@ uses ULog, DateUtils, UCovers, UThemes, - {$IFDEF DARWIN} - // MacResources, - {$ENDIF} StrUtils; Constructor TTextureUnit.Create; @@ -266,9 +263,9 @@ begin for PixelIndex := 0 to (TexSurface^.W * TexSurface^.H)-1 do begin PixelColors := PByteArray(Pixel); - // inlined colorize per pixel + // inlined colorize per pixel - // uses fixed point math + // uses fixed point math // get color values clr2[0] := PixelColors[0] shl 10; clr2[1] := PixelColors[1] shl 10; @@ -284,29 +281,32 @@ begin delta2 := max2-delta2; hsv2[0] := dhue; // shl 8 hsv2[2] := max2; // shl 8 - if (max2 = 0) then hsv2[1] := 0 - else hsv2[1] := (delta2 shl 10) div max2; // shl 8 - h_int := hsv2[0] and $fffffC00; - f2 := hsv2[0]-h_int; //shl 10 - p2 := (hsv2[2]*(1024-hsv2[1])) shr 10; - q2 := (hsv2[2]*(1024-(hsv2[1]*f2) shr 10)) shr 10; - t2 := (hsv2[2]*(1024-(hsv2[1]*(1024-f2)) shr 10)) shr 10; - h_int := h_int shr 10; - case h_int of - 0: begin clr2[0] := hsv2[2]; clr2[1] := t2; clr2[2] := p2; end; // (v,t,p) - 1: begin clr2[0] := q2; clr2[1] := hsv2[2]; clr2[2] := p2; end; // (q,v,p) - 2: begin clr2[0] := p2; clr2[1] := hsv2[2]; clr2[2] := t2; end; // (p,v,t) - 3: begin clr2[0] := p2; clr2[1] := q2; clr2[2] := hsv2[2]; end; // (p,q,v) - 4: begin clr2[0] := t2; clr2[1] := p2; clr2[2] := hsv2[2]; end; // (t,p,v) - 5: begin clr2[0] := hsv2[2]; clr2[1] := p2; clr2[2] := q2; end; // (v,p,q) - end; + if (max2 = 0) then + hsv2[1] := 0 + else + hsv2[1] := (delta2 shl 10) div max2; // shl 8 + h_int := hsv2[0] and $fffffC00; + f2 := hsv2[0]-h_int; //shl 10 + p2 := (hsv2[2]*(1024-hsv2[1])) shr 10; + q2 := (hsv2[2]*(1024-(hsv2[1]*f2) shr 10)) shr 10; + t2 := (hsv2[2]*(1024-(hsv2[1]*(1024-f2)) shr 10)) shr 10; + h_int := h_int shr 10; + case h_int of + 0: begin clr2[0] := hsv2[2]; clr2[1] := t2; clr2[2] := p2; end; // (v,t,p) + 1: begin clr2[0] := q2; clr2[1] := hsv2[2]; clr2[2] := p2; end; // (q,v,p) + 2: begin clr2[0] := p2; clr2[1] := hsv2[2]; clr2[2] := t2; end; // (p,v,t) + 3: begin clr2[0] := p2; clr2[1] := q2; clr2[2] := hsv2[2]; end; // (p,q,v) + 4: begin clr2[0] := t2; clr2[1] := p2; clr2[2] := hsv2[2]; end; // (t,p,v) + 5: begin clr2[0] := hsv2[2]; clr2[1] := p2; clr2[2] := q2; end; // (v,p,q) + end; PixelColors[0] := clr2[0] shr 10; PixelColors[1] := clr2[1] shr 10; PixelColors[2] := clr2[2] shr 10; // old floating point version -(* clr[0] := PixelColors[0]/255; +(* + clr[0] := PixelColors[0]/255; clr[1] := PixelColors[1]/255; clr[2] := PixelColors[2]/255; max := maxvalue(clr); @@ -315,23 +315,25 @@ begin hsv[0] := DestinationHue; // set H(ue) hsv[2] := max; // set V(alue) // calc S(aturation) - if (max = 0.0) then hsv[1] := 0.0 - else hsv[1] := delta/max; + if (max = 0.0) then + hsv[1] := 0.0 + else + hsv[1] := delta/max; // ColorizePixel(PByteArray(Pixel), DestinationHue); - h_int := trunc(hsv[0]); // h_int = |_h_| - f := hsv[0]-h_int; // f = h-h_int - p := hsv[2]*(1.0-hsv[1]); // p = v*(1-s) - q := hsv[2]*(1.0-(hsv[1]*f)); // q = v*(1-s*f) - t := hsv[2]*(1.0-(hsv[1]*(1.0-f))); // t = v*(1-s*(1-f)) - case h_int of - 0: begin clr[0] := hsv[2]; clr[1] := t; clr[2] := p; end; // (v,t,p) - 1: begin clr[0] := q; clr[1] := hsv[2]; clr[2] := p; end; // (q,v,p) - 2: begin clr[0] := p; clr[1] := hsv[2]; clr[2] := t; end; // (p,v,t) - 3: begin clr[0] := p; clr[1] := q; clr[2] := hsv[2]; end; // (p,q,v) - 4: begin clr[0] := t; clr[1] := p; clr[2] := hsv[2]; end; // (t,p,v) - 5: begin clr[0] := hsv[2]; clr[1] := p; clr[2] := q; end; // (v,p,q) - end; + h_int := trunc(hsv[0]); // h_int = |_h_| + f := hsv[0]-h_int; // f = h-h_int + p := hsv[2]*(1.0-hsv[1]); // p = v*(1-s) + q := hsv[2]*(1.0-(hsv[1]*f)); // q = v*(1-s*f) + t := hsv[2]*(1.0-(hsv[1]*(1.0-f))); // t = v*(1-s*(1-f)) + case h_int of + 0: begin clr[0] := hsv[2]; clr[1] := t; clr[2] := p; end; // (v,t,p) + 1: begin clr[0] := q; clr[1] := hsv[2]; clr[2] := p; end; // (q,v,p) + 2: begin clr[0] := p; clr[1] := hsv[2]; clr[2] := t; end; // (p,v,t) + 3: begin clr[0] := p; clr[1] := q; clr[2] := hsv[2]; end; // (p,q,v) + 4: begin clr[0] := t; clr[1] := p; clr[2] := hsv[2]; end; // (t,p,v) + 5: begin clr[0] := hsv[2]; clr[1] := p; clr[2] := q; end; // (v,p,q) + end; // and store new rgb back into the image PixelColors[0] := trunc(255*clr[0]); @@ -552,7 +554,8 @@ begin Log.BenchmarkEnd(4); if Log.BenchmarkTimeLength[4] >= 1 then Log.LogBenchmark('**********> Texture Load Time Warning - ' + Identifier + '/' + TextureTypeToStr(Typ), 4) - else Log.LogBenchmark('**********> Texture Load Time ' + ExtractFileName(Identifier) + '/' + TextureTypeToStr(Typ), 4); + else + Log.LogBenchmark('**********> Texture Load Time ' + ExtractFileName(Identifier) + '/' + TextureTypeToStr(Typ), 4); {$ifdef blindydebug} Log.LogStatus('',' JB-8'); {$endif} @@ -719,6 +722,7 @@ var begin Result := -1; for T := 0 to high(TextureDatabase.Texture) do + begin if (TextureDatabase.Texture[T].Name = Name) and (TextureDatabase.Texture[T].Typ = Typ) then begin @@ -730,6 +734,7 @@ begin break; end; end; + end; end; function TTextureUnit.LoadTexture(const Identifier: string; Typ: TTextureType; Col: LongWord): TTexture; @@ -815,7 +820,8 @@ begin else begin TexNum := TextureDatabase.Texture[T].TextureCache.TexNum; - if TexNum > 0 then begin + if TexNum > 0 then + begin glDeleteTextures(1, @TexNum); TextureDatabase.Texture[T].TextureCache.TexNum := 0; // Log.LogError('Unload texture cache no '+IntToStr(TexNum)); |