C22D.pas
上传用户:yj_qiu
上传日期:2022-08-08
资源大小:23636k
文件大小:8k
源码类别:

游戏引擎

开发平台:

Delphi

  1. (*
  2.  @Abstract(CAST II Engine 2D wrapper unit)
  3.  (C) 2006 George "Mirage" Bakhtadze. <a href="http://www.casteng.com">www.casteng.com</a> <br>
  4.  The source code may be used under either MPL 1.1 or LGPL 2.1 license. See included license.txt file <br>
  5.  Unit contains classes for rendering 2D objects through 3D device
  6. *)
  7. {$Include GDefines.inc}
  8. {$Include C2Defines.inc}
  9. unit C22D;
  10. interface
  11. uses
  12.   TextFile,
  13.   Basics, Base3D, BaseGraph, Props, Resources,
  14.   BaseClasses, BaseTypes, C2Types, C2Tess2D, C2Visual, C2Materials, CAST2, C2Core;
  15. const
  16.   ZDecr = 0.0001;
  17. type
  18.   // 2D primitive kinds
  19.   T2DPrimitiveKind = (// Solid primitive
  20.                       pkSolid,
  21.                       // Text
  22.                       pkText);
  23.   TBitmapFont = class(TBaseBitmapFont)
  24.     procedure AddProperties(const Result: TProperties); override;
  25.     procedure SetProperties(Properties: TProperties); override;
  26.   protected
  27.     procedure ResolveLinks; override;
  28.   end;
  29.   TC2Screen = class(TScreen)
  30.   private
  31.     Tech, SolidTech: TTechnique;
  32.     Core: TCore;
  33.   public
  34.     constructor Create;
  35.     procedure Reset; override;
  36.     procedure SetCore(ACore: TCore);
  37. // Draw/fill parameters
  38.     procedure SetTechnique(PrimitiveKind: T2DPrimitiveKind; const ATech: TTechnique);
  39. // Primitive drawing
  40.     procedure LineTo(const X, Y: Single); override;
  41.     procedure Bar(X1, Y1, X2, Y2: Single); override;
  42. // Text drawing
  43.     procedure PutText(const Str: string); override;
  44.     procedure PutTextXY(const X, Y: Single; const Str: string); override;
  45.     procedure Clear; override;
  46.     // Material technique used to draw solid 2D primitives
  47.     property SolidTechnique: TTechnique read SolidTech;
  48.     // Material technique used to draw text
  49.     property TextTechnique: TTechnique read Tech;
  50.   end;
  51.   // Returns list of classes introduced by the unit
  52.   function GetUnitClassList: TClassArray;
  53. implementation
  54. function GetUnitClassList: TClassArray;
  55. begin
  56.   Result := GetClassList([TBitmapFont]);
  57. end;
  58. { TBitmapFont }
  59. procedure TBitmapFont.AddProperties(const Result: TProperties);
  60. begin
  61.   inherited;
  62.   AddItemLink(Result, 'Bitmap',   [], 'TImageResource');
  63.   AddItemLink(Result, 'UV map',   [], 'TUVMapResource');
  64.   AddItemLink(Result, 'Char map', [], 'TCharMapResource');
  65. end;
  66. procedure TBitmapFont.SetProperties(Properties: TProperties);
  67. begin
  68.   inherited;
  69.   if Properties.Valid('Bitmap')   then SetLinkProperty('Bitmap',   Properties['Bitmap']);
  70.   if Properties.Valid('UV map')   then SetLinkProperty('UV map',   Properties['UV map']);
  71.   if Properties.Valid('Char map') then SetLinkProperty('Char map', Properties['Char map']);
  72.   ResolveLinks;
  73. end;
  74. procedure TBitmapFont.ResolveLinks;
  75. var LinkedRes: TItem; 
  76. begin
  77.   inherited;
  78.   if ResolveLink('UV map', LinkedRes) then begin
  79.     UVMap    := (LinkedRes as TUVMapResource).Data;
  80.     TotalUVs := (LinkedRes as TUVMapResource).TotalElements;
  81.   end;
  82.   if ResolveLink('Char map', LinkedRes) then begin
  83.     CharMap         := (LinkedRes as TCharMapResource).Data;
  84.     TotalCharacters := (LinkedRes as TCharMapResource).TotalElements;
  85.   end;
  86.   if ResolveLink('Bitmap', LinkedRes) then begin
  87.     Bitmap       := (LinkedRes as TImageResource).Data;
  88.     BitmapFormat := (LinkedRes as TImageResource).Format;
  89.     XScale       := (LinkedRes as TImageResource).Width;
  90.     YScale       := (LinkedRes as TImageResource).Height;
  91.   end;
  92. end;
  93. { TC2Screen }
  94. constructor TC2Screen.Create;
  95. begin
  96.   inherited;
  97. end;
  98. procedure TC2Screen.Reset;
  99. begin
  100.   inherited;
  101.   if Assigned(Core) and Assigned(Core.DefaultMaterial) and (Core.DefaultMaterial.TotalTechniques > 0) then
  102.     SetTechnique(pkSolid, Core.DefaultMaterial.Technique[0]);
  103. end;
  104. procedure TC2Screen.SetCore(ACore: TCore);
  105. var Ind: Integer;
  106. begin
  107.   if ACore = Core then Exit;
  108.   Core := ACore;
  109.   if Assigned(Core) and Assigned(Core.DefaultMaterial) and (Core.DefaultMaterial.TotalTechniques > 0) then begin
  110.     Ind := Core.DefaultMaterial.TotalTechniques;
  111.     Core.DefaultMaterial.TotalTechniques := Ind + 1;
  112.     Core.DefaultMaterial.Technique[Ind] := TTechnique.Create(Core);
  113.     Core.DefaultMaterial.Technique[Ind].TotalPasses := 1;
  114.     Core.DefaultMaterial.Technique[Ind].Valid := True;
  115.     Core.DefaultMaterial.Technique[Ind].Passes[0] := TRenderPass.Create(Core);
  116.     Core.DefaultMaterial.Technique[Ind].Passes[0].Group         := 0;
  117.     Core.DefaultMaterial.Technique[Ind].Passes[0].BlendingState := GetBlendingState(True, bmSRCALPHA, bmINVSRCALPHA, 0, tfAlways, boADD);
  118.     Core.DefaultMaterial.Technique[Ind].Passes[0].ZBufferState  := GetZBufferState(False, tfAlways, 0);
  119.     Core.DefaultMaterial.Technique[Ind].Passes[0].Order         := poPostProcess;
  120.     Core.DefaultMaterial.Technique[Ind].Passes[0].LightingState := GetLightingState(slNONE, False, False, GetColor($40404040));
  121.     Core.DefaultMaterial.Technique[Ind].Passes[0].FillShadeMode := GetFillShadeMode(fmSOLID, smGOURAUD, cmNONE, $FFFFFFFF);
  122.     Core.DefaultMaterial.Technique[Ind].Passes[0].FogKind       := fkNone;
  123.     Core.DefaultMaterial.Technique[Ind].Passes[0].TotalStages   := 1;
  124.     Core.DefaultMaterial.Technique[Ind].Passes[0].Stages[0].ColorArg0 := taDIFFUSE;
  125.     Core.DefaultMaterial.Technique[Ind].Passes[0].Stages[0].ColorOp := toARG2;
  126.     Core.DefaultMaterial.Technique[Ind].Passes[0].State := Core.DefaultMaterial.Technique[Ind].Passes[0].State + [isVisible];
  127.     SetTechnique(pkSolid, Core.DefaultMaterial.Technique[Ind]);
  128.     SetTechnique(pkText,  Core.DefaultMaterial.Technique[Ind]);
  129.   end;
  130. end;
  131. procedure TC2Screen.SetTechnique(PrimitiveKind: T2DPrimitiveKind; const ATech: TTechnique);
  132. begin
  133.   if ATech <> nil then begin
  134.     case PrimitiveKind of
  135.       pkSolid: SolidTech := ATech;
  136.       pkText: Tech := ATech;
  137.     end;
  138.   end else {$IFDEF LOGGING} Log.Log(ClassName + '.SetTechnique: Parameter is nil', lkError); {$ENDIF}
  139. end;
  140. procedure TC2Screen.LineTo(const X, Y: Single);
  141. var Mesh: TLineMesh;
  142. begin
  143.   Assert(SolidTech <> nil, ClassName + '.LineTo: Solid technique is undefined');
  144.   Mesh := TLineMesh((Core.SharedTesselators as TSharedTesselators).Tesselator[TLineMesh, SolidTech]);
  145.   Mesh.AddPoint(CurrentX, CurrentY, Color);
  146.   MoveTo(X, Y);
  147.   Mesh.AddPoint(CurrentX, CurrentY, Color);
  148.   CurrentZ := CurrentZ - ZDecr;                    // Decrement Z to imitate correct primitive order
  149. end;
  150. procedure TC2Screen.Bar(X1, Y1, X2, Y2: Single);
  151. var Mesh: TTetragonMesh;
  152. begin
  153.   Assert(SolidTech <> nil, ClassName + '.Bar: Solid technique is undefined');
  154. //  if X1 > X2 then begin X := X2; X2 := X1; X1 := X; end;
  155. //  if Y1 > Y2 then begin Y := Y2; Y2 := Y1; Y1 := Y; end;
  156.   Mesh := TTetragonMesh((Core.SharedTesselators as TSharedTesselators).Tesselator[TTetragonMesh, SolidTech]);
  157.   Mesh.AddCorner(X1, Y1, UV.U,        UV.V,        Color);
  158.   Mesh.AddCorner(X2, Y2, UV.U + UV.W, UV.V + UV.H, Color);
  159.   CurrentZ := CurrentZ - ZDecr;                    // Decrement Z to imitate correct primitive order
  160. end;
  161. procedure TC2Screen.PutText(const Str: string);
  162. var Mesh: TTextMesh; TX, TY: Single;
  163. begin
  164.   Assert(Tech <> nil, ClassName + '.DrawFormattedText: Technique is undefined');
  165.   if not (Font is TBitmapFont) or (TBitmapFont(Font).TotalUVs = 0) then Exit;
  166.   if Str = '' then Exit;
  167.   Mesh := TTextMesh((Core.SharedTesselators as TSharedTesselators).Tesselator[TTextMesh, Tech]);
  168.   Mesh.SetFont(Font, 1, 1);
  169.   Mesh.AddText(CurrentX, CurrentY, Color, Str);
  170.   Font.GetTextExtent(Str, TX, TY);
  171.   MoveTo(LocalX + TX, LocalY);
  172.   CurrentZ := CurrentZ - ZDecr;                    // Decrement Z to imitate correct primitive order
  173. end;
  174. procedure TC2Screen.PutTextXY(const X, Y: Single; const Str: string);
  175. begin
  176.   MoveTo(X, Y);
  177.   PutText(Str);
  178. end;
  179. procedure TC2Screen.Clear;
  180. begin
  181.   inherited;
  182. //  if (Core <> nil) and (Core.Renderer <> nil) then Core.Renderer.Clear(False, True, False, 0, ClearingZ, 0);
  183.   CurrentZ := ClearingZ;
  184. end;
  185. initialization
  186.   if Screen <> nil then Screen.Free;
  187.   Screen := TC2Screen.Create;
  188.   GlobalClassList.Add('C22D', GetUnitClassList);
  189. finalization
  190.   if Screen <> nil then begin
  191.     if Screen is TC2Screen then (Screen as TC2Screen).Core := nil;         // Core should be freed here
  192.     Screen.Free;
  193.   end;
  194. end.