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

2D图形编程

开发平台:

Delphi

  1. unit AsphyreMinimalShader;
  2. //---------------------------------------------------------------------------
  3. interface
  4. //---------------------------------------------------------------------------
  5. uses
  6.  Direct3D9, d3dx9, Vectors3, Matrices4, AsphyreColors, AsphyreDevices,
  7.  AsphyreShaderFX, AsphyreMeshes;
  8. //---------------------------------------------------------------------------
  9. type
  10.  TAsphyreMinimalShader = class(TAsphyreShaderEffect)
  11.  private
  12.   TempColorValue: TD3DColorValue;
  13.   TempLightVec  : TD3DXVector3;
  14.   FDiffuseColor : TAsphyreColor;
  15.   FSpecularColor: TAsphyreColor;
  16.   FLightVector  : TVector3;
  17.  protected
  18.   procedure Describe(); override;
  19.   procedure UpdateParam(Code: Integer; out DataPtr: Pointer;
  20.    out DataSize: Integer); override;
  21.  public
  22.   property DiffuseColor : TAsphyreColor read FDiffuseColor write FDiffuseColor;
  23.   property SpecularColor: TAsphyreColor read FSpecularColor write FSpecularColor;
  24.   property LightVector  : TVector3 read FLightVector write FLightVector;
  25.   procedure Draw(Mesh: TAsphyreCustomMesh);
  26.   procedure DrawCol(Mesh: TAsphyreCustomMesh; const World: TMatrix4;
  27.    Color: Cardinal);
  28.   procedure DrawColSpec(Mesh: TAsphyreCustomMesh; const World: TMatrix4;
  29.    Diffuse, Specular: Cardinal);
  30.   constructor Create(ADevice: TAsphyreDevice);
  31.  end;
  32. //---------------------------------------------------------------------------
  33. implementation
  34. //---------------------------------------------------------------------------
  35. uses
  36.  AsphyreScene;
  37. //---------------------------------------------------------------------------
  38. const
  39.  ShdrDiffuseColor  = 1;
  40.  ShdrSpecularColor = 2;
  41.  ShdrLightVector   = 3;
  42. //---------------------------------------------------------------------------
  43. constructor TAsphyreMinimalShader.Create(ADevice: TAsphyreDevice);
  44. begin
  45.  inherited;
  46.  FDiffuseColor := $FF00FF00;
  47.  FSpecularColor:= $FFFFFFFF;
  48.  FLightVector  := Norm3(Vector3(1.0, 1.0, 1.0));
  49. end;
  50. //---------------------------------------------------------------------------
  51. procedure TAsphyreMinimalShader.Describe();
  52. begin
  53.  DescParam(sptWorldViewProjection,   'matWorldViewProj');
  54.  DescParam(sptWorldInverseTranspose, 'matInvTransposeWorld');
  55.  DescParam(sptCustom, 'vDic',        ShdrDiffuseColor);
  56.  DescParam(sptCustom, 'vSpec',       ShdrSpecularColor);
  57.  DescParam(sptCustom, 'vecLightDir', ShdrLightVector);
  58. end;
  59. //---------------------------------------------------------------------------
  60. procedure TAsphyreMinimalShader.UpdateParam(Code: Integer; out DataPtr: Pointer;
  61.  out DataSize: Integer);
  62. begin
  63.  case Code of
  64.   ShdrDiffuseColor:
  65.    begin
  66.     TempColorValue:= FDiffuseColor;
  67.     DataPtr := @TempColorValue;
  68.     DataSize:= SizeOf(TD3DColorValue);
  69.    end;
  70.   ShdrSpecularColor:
  71.    begin
  72.     TempColorValue:= FSpecularColor;
  73.     DataPtr := @TempColorValue;
  74.     DataSize:= SizeOf(TD3DColorValue);
  75.    end;
  76.   ShdrLightVector:
  77.    begin
  78.     TempLightVec:= TD3DXVector3(-Norm3(FLightVector));
  79.     DataPtr := @TempLightVec;
  80.     DataSize:= SizeOf(TD3DXVector3);
  81.    end;
  82.  end;
  83. end;
  84. //---------------------------------------------------------------------------
  85. procedure TAsphyreMinimalShader.Draw(Mesh: TAsphyreCustomMesh);
  86. var
  87.  PassNo: Integer;
  88. begin
  89.  for PassNo:= 0 to NumPasses - 1 do
  90.   begin
  91.    if (not BeginPass(PassNo)) then Break;
  92.    Mesh.Draw();
  93.    EndPass();
  94.   end;
  95. end;
  96. //---------------------------------------------------------------------------
  97. procedure TAsphyreMinimalShader.DrawCol(Mesh: TAsphyreCustomMesh;
  98.  const World: TMatrix4; Color: Cardinal);
  99. begin
  100.  WorldMtx.LoadMtx(@World);
  101.  DiffuseColor := Color;
  102.  SpecularColor:= $FFFFFFFF;
  103.  UpdateAll();
  104.  Draw(Mesh);
  105. end;
  106. //---------------------------------------------------------------------------
  107. procedure TAsphyreMinimalShader.DrawColSpec(Mesh: TAsphyreCustomMesh;
  108.  const World: TMatrix4; Diffuse, Specular: Cardinal);
  109. begin
  110.  WorldMtx.LoadMtx(@World);
  111.  DiffuseColor := Diffuse;
  112.  SpecularColor:= Specular;
  113.  UpdateAll();
  114.  Draw(Mesh);
  115. end;
  116. //---------------------------------------------------------------------------
  117. end.