CentrED/UOLib/UTexture.pas

173 lines
4.5 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

(*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at
* http://www.opensource.org/licenses/cddl1.php.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at
* http://www.opensource.org/licenses/cddl1.php. If applicable,
* add the following below this CDDL HEADER, with the fields enclosed
* by brackets "[]" replaced with your own identifying * information:
* Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*
*
* Portions Copyright 2007 Andreas Schneider
*)
unit UTexture;
{$mode objfpc}{$H+}
interface
uses
Classes, Imaging, ImagingTypes, ImagingClasses, UMulBlock, UArt, UGenericIndex;
type
TTexture = class(TMulBlock)
constructor Create(AData: TStream; AIndex: TGenericIndex); overload;
constructor Create(AExtra: Integer); overload;
destructor Destroy; override;
function Clone: TTexture; override;
function GetSize: Integer; override;
procedure Write(AData: TStream); override;
procedure RefreshBuffer;
protected
FGraphic: TSingleImage;
FBuffer: TStream;
FExtra: Integer;
public
property Graphic: TSingleImage read FGraphic;
property Buffer: TStream read FBuffer;
property Extra: Integer read FExtra write FExtra;
end;
TOldTexture = class(TTexture)
constructor Create(AData: TStream; AIndex: TGenericIndex); overload;
constructor Create(AExtra: Integer); overload;
constructor Create(AId: Cardinal);
private
FArtTile: TArt;
end;
implementation
uses
UGameResources;//, Logging;
constructor TTexture.Create(AData: TStream; AIndex: TGenericIndex);
var
size: Integer;
begin
FExtra := AIndex.Various;
if FExtra = 0 then
size := 64
else
size := 128;
FGraphic := TSingleImage.CreateFromParams(size, size, ifX1R5G5B5);
if assigned(AData) then
begin
AData.Position := AIndex.Lookup;
AData.Read(FGraphic.Bits^, size * size * 2);
end;
FGraphic.Format := ifX8R8G8B8;
end;
constructor TTexture.Create(AExtra: Integer);
var
size: Integer;
begin
FExtra := AExtra;
if AExtra = 0 then
size := 64
else
size := 128;
FGraphic := TSingleImage.CreateFromParams(size, size, ifX8R8G8B8);
FBuffer := TMemoryStream.Create;
end;
destructor TTexture.Destroy;
begin
if FGraphic <> nil then FGraphic.Free;
if FBuffer <> nil then FBuffer.Free;
inherited;
end;
function TTexture.Clone: TTexture;
begin
Result := TTexture.Create(FExtra);
Result.FGraphic.Assign(Self.Graphic);
end;
procedure TTexture.Write(AData: TStream);
begin
FBuffer.Position := 0;
AData.CopyFrom(FBuffer, FBuffer.Size);
end;
function TTexture.GetSize: Integer;
begin
RefreshBuffer;
Result := FBuffer.Size
end;
procedure TTexture.RefreshBuffer;
var
argbGraphic: TSingleImage;
begin
argbGraphic := TSingleImage.CreateFromImage(FGraphic);
argbGraphic.Format := ifX1R5G5B5;
FBuffer.Size := 0;
if (argbGraphic.Height > 0) and (argbGraphic.Width > 0) then
begin
if (argbGraphic.Height < 128) or (argbGraphic.Width < 128) then
begin
FExtra := 0;
argbGraphic.Resize(64, 64, rfNearest);
end else
begin
FExtra := 1;
argbGraphic.Resize(128, 128, rfNearest);
end;
FBuffer.Write(argbGraphic.Bits^, argbGraphic.Height * argbGraphic.Width * 2);
end;
argbGraphic.Free;
end;
// TOldTexture - перегрузка класса, для работы с текстурами пре альфа клиента
constructor TOldTexture.Create(AId: Cardinal);
var
extradata: Integer;
begin
FArtTile := ResMan.Art.GetArt($4000 + AId, 0, nil, False);
if (FArtTile.Graphic.Width <= 64) then extradata := 0 else extradata := 1;
inherited Create(extradata); // Клиент использует не правильные текстуры
FArtTile.Graphic.StretchTo(0,0,FArtTile.Graphic.Width,FArtTile.Graphic.Height,
FGraphic, 0,0,FGraphic.Width,FGraphic.Height, rfBilinear );
//FArtTile.Destroy; // Надо ли удалять тайл?
end;
constructor TOldTexture.Create(AData: TStream; AIndex: TGenericIndex);
begin
inherited Create(0);
end;
constructor TOldTexture.Create(AExtra: Integer);
begin
inherited Create(AExtra);
end;
end.