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

2D图形编程

开发平台:

Delphi

  1. unit InstanceShaders;
  2. //---------------------------------------------------------------------------
  3. // AsphyreBasicShaders.pas                              Modified: 09-Apr-2007
  4. // High-level wrapper for basic Asphyre shader effect             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 AsphyreBasicShaders.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. // M. Sc. Yuriy Kotsarenko. All Rights Reserved.
  36. //---------------------------------------------------------------------------
  37. interface
  38. //---------------------------------------------------------------------------
  39. uses
  40.  Direct3D9, d3dx9, Vectors3, Matrices4, AsphyreColors, AsphyreDevices,
  41.  AsphyreShaderFX, InstanceMeshes;
  42. //---------------------------------------------------------------------------
  43. const
  44.  NumShdrInstances = 24;
  45. //---------------------------------------------------------------------------
  46. type
  47.  TInstanceShadingType = (istGouraud, istPhong);
  48. //---------------------------------------------------------------------------
  49.  TInstanceShader = class(TAsphyreShaderEffect)
  50.  private
  51.   TempLightVec: TD3DXVector3;
  52.   FLightVector: TVector3;
  53.   FShadingType: TInstanceShadingType;
  54.   InstanceWorld: array[0..NumShdrInstances - 1] of TMatrix4;
  55.   InstanceColor: array[0..NumShdrInstances - 1] of TD3DColorValue;
  56.   InstanceInvTWorld: array[0..NumShdrInstances - 1] of TMatrix4;
  57.   InstanceMesh: TInstanceMesh;
  58.   InstanceNo  : Integer;
  59.  protected
  60.   procedure Describe(); override;
  61.   procedure UpdateParam(Code: Integer; out DataPtr: Pointer;
  62.    out DataSize: Integer); override;
  63.  public
  64.   property LightVector: TVector3 read FLightVector write FLightVector;
  65.   property ShadingType: TInstanceShadingType read FShadingType write FShadingType;
  66.   procedure Draw(Mesh: TInstanceMesh; const World: TMatrix4; Color: Cardinal);
  67.   procedure Flush();
  68.   procedure Update(); override;
  69.   constructor Create(ADevice: TAsphyreDevice);
  70.  end;
  71. //---------------------------------------------------------------------------
  72. implementation
  73. //---------------------------------------------------------------------------
  74. const
  75.  ShdrLightVector   = 1;
  76.  ShdrGouraud       = 2;
  77.  ShdrPhong         = 3;
  78.  ShdrInstanceWorld     = 4;
  79.  ShdrInstanceInvTWorld = 5;
  80.  ShdrInstanceColor     = 6;
  81. //---------------------------------------------------------------------------
  82. constructor TInstanceShader.Create(ADevice: TAsphyreDevice);
  83. begin
  84.  inherited;
  85.  FLightVector:= Norm3(Vector3(1.0, 1.0, -1.0));
  86.  InstanceNo:= 0;
  87. end;
  88. //---------------------------------------------------------------------------
  89. procedure TInstanceShader.Describe();
  90. begin
  91.  DescParam(sptViewProjection, 'ViewProjection');
  92.  DescParam(sptCameraPosition, 'CameraPos');
  93.  DescParam(sptCustom, 'LightVector',   ShdrLightVector);
  94.  DescParam(sptCustom, 'InstanceWorld',     ShdrInstanceWorld);
  95.  DescParam(sptCustom, 'InstanceInvTWorld', ShdrInstanceInvTWorld);
  96.  DescParam(sptCustom, 'InstanceColor',     ShdrInstanceColor);
  97.  DescTechnique('GouraudShading', ShdrGouraud);
  98.  DescTechnique('PhongShading', ShdrPhong);
  99. end;
  100. //---------------------------------------------------------------------------
  101. procedure TInstanceShader.UpdateParam(Code: Integer; out DataPtr: Pointer;
  102.  out DataSize: Integer);
  103. begin
  104.  case Code of
  105.   ShdrLightVector:
  106.    begin
  107.     TempLightVec:= TD3DXVector3(-Norm3(FLightVector));
  108.     DataPtr := @TempLightVec;
  109.     DataSize:= SizeOf(TD3DXVector3);
  110.    end;
  111.   ShdrInstanceWorld:
  112.    begin
  113.     DataPtr := @InstanceWorld;
  114.     DataSize:= SizeOf(InstanceWorld);
  115.    end;
  116.   ShdrInstanceInvTWorld:
  117.    begin
  118.     DataPtr := @InstanceInvTWorld;
  119.     DataSize:= SizeOf(InstanceInvTWorld);
  120.    end;
  121.   ShdrInstanceColor:
  122.    begin
  123.     DataPtr := @InstanceColor;
  124.     DataSize:= SizeOf(InstanceColor);
  125.    end;
  126.  end;
  127. end;
  128. //---------------------------------------------------------------------------
  129. procedure TInstanceShader.Update();
  130. begin
  131.  inherited;
  132.  case FShadingType of
  133.   istGouraud:
  134.    UseTechnique(ShdrGouraud);
  135.   istPhong:
  136.    UseTechnique(ShdrPhong);
  137.  end;
  138. end;
  139. //---------------------------------------------------------------------------
  140. procedure TInstanceShader.Draw(Mesh: TInstanceMesh; const World: TMatrix4;
  141.  Color: Cardinal);
  142. begin
  143.  if (Mesh <> InstanceMesh)or(InstanceNo >= NumShdrInstances)or
  144.   (InstanceNo >= Mesh.NumCopies) then
  145.   begin
  146.    if (InstanceMesh <> nil) then Flush();
  147.    InstanceMesh:= Mesh;
  148.   end;
  149.  InstanceWorld[InstanceNo]:= World;
  150.  InstanceColor[InstanceNo]:= D3DXColorFromDWord(Color);
  151.  D3DXMatrixInverse(TD3DXMatrix(InstanceInvTWorld[InstanceNo]), nil,
  152.   TD3DXMatrix(InstanceWorld[InstanceNo]));
  153.  D3DXMatrixTranspose(TD3DXMatrix(InstanceInvTWorld[InstanceNo]),
  154.   TD3DXMatrix(InstanceInvTWorld[InstanceNo]));
  155.  Inc(InstanceNo);
  156. end;
  157. //---------------------------------------------------------------------------
  158. procedure TInstanceShader.Flush();
  159. var
  160.  PassNo: Integer;
  161. begin
  162.  UpdateAll();
  163.  for PassNo:= 0 to NumPasses - 1 do
  164.   begin
  165.    if (not BeginPass(PassNo)) then Break;
  166.    InstanceMesh.DrawCopies(InstanceNo);
  167.    EndPass();
  168.   end;
  169.  InstanceNo:= 0; 
  170. end;
  171. //---------------------------------------------------------------------------
  172. end.