AsphyreStates.pas
上传用户:ctlcnc
上传日期:2021-12-10
资源大小:4933k
文件大小:8k
源码类别:

2D图形编程

开发平台:

Delphi

  1. unit AsphyreStates;
  2. //---------------------------------------------------------------------------
  3. // AsphyreStates.pas                                    Modified: 06-Mar-2007
  4. // A wrapper for some relevant Direct3D states                    Version 1.0
  5. //---------------------------------------------------------------------------
  6. // Important Notice:
  7. //
  8. // If you modify/use this code or one of its parts either in original or
  9. // modified form, you must comply with Mozilla Public License v1.1,
  10. // specifically section 3, "Distribution Obligations". Failure to do so will
  11. // result in the license breach, which will be resolved in the court.
  12. // Remember that violating author's rights is considered a serious crime in
  13. // many countries. Thank you!
  14. //
  15. // !! Please *read* Mozilla Public License 1.1 document located at:
  16. //  http://www.mozilla.org/MPL/
  17. //
  18. // If you require any clarifications about the license, feel free to contact
  19. // us or post your question on our forums at: http://www.afterwarp.net
  20. //---------------------------------------------------------------------------
  21. // The contents of this file are subject to the Mozilla Public License
  22. // Version 1.1 (the "License"); you may not use this file except in
  23. // compliance with the License. You may obtain a copy of the License at
  24. // http://www.mozilla.org/MPL/
  25. //
  26. // Software distributed under the License is distributed on an "AS IS"
  27. // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
  28. // License for the specific language governing rights and limitations
  29. // under the License.
  30. //
  31. // The Original Code is AsphyreStates.pas.
  32. //
  33. // The Initial Developer of the Original Code is M. Sc. Yuriy Kotsarenko.
  34. // Portions created by M. Sc. Yuriy Kotsarenko are Copyright (C) 2007,
  35. // Afterwarp Interactive. All Rights Reserved.
  36. //---------------------------------------------------------------------------
  37. interface
  38. //---------------------------------------------------------------------------
  39. uses
  40.  Direct3D9, AsphyreTypes, AsphyreDevices;
  41. //---------------------------------------------------------------------------
  42. type
  43.  TAsphyreCullMode = (acmNone, acmClockwise, acmAnticlockwise);
  44. //---------------------------------------------------------------------------
  45.  TAsphyreStates = class
  46.  private
  47.   FDevice: TAsphyreDevice;
  48.   function GetBoolValue(const Index: Integer): Boolean;
  49.   procedure SetBoolValue(const Index: Integer; const Value: Boolean);
  50.   function GetCullMode(): TAsphyreCullMode;
  51.   procedure SetCullMode(const Value: TAsphyreCullMode);
  52.   procedure SetAntialias(const Value: TAntialiasType);
  53.   procedure SetMipmapping(const Value: TMipmappingType);
  54.  public
  55.   property Device: TAsphyreDevice read FDevice;
  56.   // Determines the usage of depth buffer
  57.   property DepthBuffer: Boolean index 0 read GetBoolValue write SetBoolValue;
  58.   // Determines the usage of 3D lights and illumination
  59.   property Lighting: Boolean index 1 read GetBoolValue write SetBoolValue;
  60.   // Determines whether the normals should be normalized in 3D meshes
  61.   property NormalNormalize: Boolean index 2 read GetBoolValue write SetBoolValue;
  62.   // Whether to use specular illumination
  63.   property SpecularLights: Boolean index 3 read GetBoolValue write SetBoolValue;
  64.   // Determines the type of antialiasing used. This property cannot be read.
  65.   property Antialias : TAntialiasType write SetAntialias;
  66.   // Determines the type of mipmapping used. This property cannot be read.
  67.   property MipMapping: TMipmappingType write SetMipmapping;
  68.   // The type of culling used for rendering 3D triangles
  69.   property CullMode: TAsphyreCullMode read GetCullMode write SetCullMode;
  70.   constructor Create(ADevice: TAsphyreDevice);
  71.  end;
  72. //---------------------------------------------------------------------------
  73. implementation
  74. //--------------------------------------------------------------------------
  75. constructor TAsphyreStates.Create(ADevice: TAsphyreDevice);
  76. begin
  77.  inherited Create();
  78.  FDevice:= ADevice;
  79. end;
  80. //---------------------------------------------------------------------------
  81. function TAsphyreStates.GetBoolValue(const Index: Integer): Boolean;
  82. var
  83.  vCard: Cardinal;
  84. begin
  85.  if (FDevice = nil)or(FDevice.Dev9 = nil) then
  86.   begin
  87.    Result:= False;
  88.    Exit;
  89.   end;
  90.  with FDevice.Dev9 do
  91.   begin
  92.    case Index of
  93.     0: begin // DepthBuffer
  94.         GetRenderState(D3DRS_ZENABLE, vCard);
  95.         Result:= (vCard = D3DZB_TRUE);
  96.        end;
  97.     1: begin // Lighting
  98.         GetRenderState(D3DRS_LIGHTING, vCard);
  99.         Result:= (vCard = iTrue);
  100.        end;
  101.     2: begin // NormalNormalize
  102.         GetRenderState(D3DRS_NORMALIZENORMALS, vCard);
  103.         Result:= (vCard = iTrue);
  104.        end;
  105.     3: begin // SpecularLights
  106.         GetRenderState(D3DRS_SPECULARENABLE, vCard);
  107.         Result:= (vCard = iTrue);
  108.        end;
  109.     4: begin // Mipmapping
  110.         GetRenderState(D3DRS_SPECULARENABLE, vCard);
  111.         Result:= (vCard = iTrue);
  112.        end;
  113.      else Result:= False;
  114.    end; // case
  115.   end; // with
  116. end;
  117. //---------------------------------------------------------------------------
  118. procedure TAsphyreStates.SetBoolValue(const Index: Integer;
  119.  const Value: Boolean);
  120. begin
  121.  if (FDevice = nil)or(FDevice.Dev9 = nil) then Exit;
  122.  with FDevice.Dev9 do
  123.   case Index of
  124.    0: if (Value) then SetRenderState(D3DRS_ZENABLE, D3DZB_TRUE)
  125.        else SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
  126.    1: if (Value) then SetRenderState(D3DRS_LIGHTING, iTrue)
  127.        else SetRenderState(D3DRS_LIGHTING, iFalse);
  128.    2: if (Value) then SetRenderState(D3DRS_NORMALIZENORMALS, iTrue)
  129.        else SetRenderState(D3DRS_NORMALIZENORMALS, iFalse);
  130.    3: if (Value) then SetRenderState(D3DRS_SPECULARENABLE, iTrue)
  131.        else SetRenderState(D3DRS_SPECULARENABLE, iFalse);
  132.   end;
  133. end;
  134. //---------------------------------------------------------------------------
  135. function TAsphyreStates.GetCullMode(): TAsphyreCullMode;
  136. var
  137.  vCard: Cardinal;
  138. begin
  139.  if (FDevice = nil)or(FDevice.Dev9 = nil) then
  140.   begin
  141.    Result:= acmNone;
  142.    Exit;
  143.   end;
  144.  with FDevice.Dev9 do
  145.   begin
  146.    GetRenderState(D3DRS_CULLMODE, vCard);
  147.    case vCard of
  148.     D3DCULL_CW : Result:= acmClockwise;
  149.     D3DCULL_CCW: Result:= acmAnticlockwise;
  150.     else Result:= acmNone;
  151.    end;
  152.   end;
  153. end;
  154. //---------------------------------------------------------------------------
  155. procedure TAsphyreStates.SetCullMode(const Value: TAsphyreCullMode);
  156. begin
  157.  if (FDevice = nil)or(FDevice.Dev9 = nil) then Exit;
  158.  with FDevice.Dev9 do
  159.   case Value of
  160.    acmNone:
  161.     SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
  162.    acmClockwise:
  163.     SetRenderState(D3DRS_CULLMODE, D3DCULL_CW);
  164.    acmAnticlockwise:
  165.     SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW);
  166.   end;
  167. end;
  168. //---------------------------------------------------------------------------
  169. procedure TAsphyreStates.SetAntialias(const Value: TAntialiasType);
  170. var
  171.  i: Integer;
  172. begin
  173.  if (FDevice = nil)or(FDevice.Dev9 = nil) then Exit;
  174.  for i:= 0 to 7 do
  175.   with FDevice.Dev9 do
  176.    case Value of
  177.     atNone:
  178.      begin
  179.       SetSamplerState(i, D3DSAMP_MAGFILTER, D3DTEXF_POINT);
  180.       SetSamplerState(i, D3DSAMP_MINFILTER, D3DTEXF_POINT);
  181.      end;
  182.     atNormal:
  183.      begin
  184.       SetSamplerState(i, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
  185.       SetSamplerState(i, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);
  186.      end;
  187.     atBest:
  188.      begin
  189.       SetSamplerState(i, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);
  190.       SetSamplerState(i, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC);
  191.      end;
  192.    end;
  193. end;
  194. //---------------------------------------------------------------------------
  195. procedure TAsphyreStates.SetMipmapping(const Value: TMipmappingType);
  196. var
  197.  i: Integer;
  198. begin
  199.  if (FDevice = nil)or(FDevice.Dev9 = nil) then Exit;
  200.  for i:= 0 to 7 do
  201.   with FDevice.Dev9 do
  202.    case Value of
  203.     mtNone:
  204.      SetSamplerState(i, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
  205.     mtSingle:
  206.      SetSamplerState(i, D3DSAMP_MIPFILTER, D3DTEXF_POINT);
  207.     mtSmooth:
  208.      SetSamplerState(i, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);
  209.    end;
  210. end;
  211. //---------------------------------------------------------------------------
  212. end.