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

2D图形编程

开发平台:

Delphi

  1. unit InovoFluxFx;
  2. //---------------------------------------------------------------------------
  3. // InovoFluxFx.pas                                      Modified: 28-Apr-2007
  4. // Interface for "InovoFlux.fx" 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 InovoFluxFx.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, Vectors2, Vectors3, Matrices3, Matrices4, AsphyreColors,
  41.  AsphyreDevices, AsphyreShaderFX, AsphyreMeshes, AsphyreTextures,
  42.  AsphyreImages;
  43. //---------------------------------------------------------------------------
  44. type
  45.  TInovoTechnique = (itBuildShadowMap, itShadowBumpPhong, itProjBumpPhong);
  46. //---------------------------------------------------------------------------
  47.  TInovoFluxFx = class(TAsphyreShaderEffect)
  48.  private
  49.   FTechnique    : TInovoTechnique;
  50.   FLightWVP     : TMatrix4;
  51.   FWorldInvT    : TMatrix4;
  52.   FWorldViewProj: TMatrix4;
  53.   FWorld        : TMatrix4;
  54.   FEyePos       : TVector3;
  55.   FLightPos     : TVector3;
  56.   FLightDir     : TVector3;
  57.   FAmbient      : Single;
  58.   FSpecular     : TAsphyreColor;
  59.   FSpecPower    : Single;
  60.   FTexMtx       : TMatrix3;
  61.   FSMapTex      : TAsphyreCustomTexture;
  62.   FSkinTex      : TAsphyreCustomTexture;
  63.   FBumpTex      : TAsphyreCustomTexture;
  64.   TempColor     : TD3DColorValue;
  65.   procedure SetTechnique(const Value: TInovoTechnique);
  66.  protected
  67.   procedure Describe(); override;
  68.   procedure UpdateParam(Code: Integer; out DataPtr: Pointer;
  69.    out DataSize: Integer); override;
  70.   procedure UpdateTexture(Code: Integer;
  71.    out ParamTex: IDirect3DTexture9); override;
  72.  public
  73.   // World(Object) * View(Light) * Projection(Light)
  74.   property LightWVP: TMatrix4 read FLightWVP write FLightWVP;
  75.   // Transpose of Inverse of World(Object)
  76.   property WorldInvT: TMatrix4 read FWorldInvT write FWorldInvT;
  77.   // World(Object) * View(Eye) * Projection(Eye)
  78.   property WorldViewProj: TMatrix4 read FWorldViewProj write FWorldViewProj;
  79.   // World(Object)
  80.   property World: TMatrix4 read FWorld write FWorld;
  81.   // Eye Position
  82.   property EyePos: TVector3 read FEyePos write FEyePos;
  83.   // Light Position
  84.   property LightPos: TVector3 read FLightPos write FLightPos;
  85.   // Light Direction
  86.   property LightDir: TVector3 read FLightDir write FLightDir;
  87.   // Shader material properties
  88.   property Ambient  : Single read FAmbient write FAmbient;
  89.   property Specular : TAsphyreColor read FSpecular write FSpecular;
  90.   property SpecPower: Single read FSpecPower write FSpecPower;
  91.   property TexMtx   : TMatrix3 read FTexMtx write FTexMtx;
  92.   // Shader textures
  93.   property SMapTex: TAsphyreCustomTexture read FSMapTex write FSMapTex;
  94.   property SkinTex: TAsphyreCustomTexture read FSkinTex write FSkinTex;
  95.   property BumpTex: TAsphyreCustomTexture read FBumpTex write FBumpTex;
  96.   // Rendering technique
  97.   property Technique: TInovoTechnique read FTechnique write SetTechnique;
  98.   // Updates the specified textures
  99.   procedure UpdateTex(SMap, Skin, Bump: TAsphyreCustomImage);
  100.   procedure UpdateParams();
  101.   procedure DrawMesh(Mesh: TAsphyreCustomMesh); overload;
  102.   procedure DrawShadow(Mesh: TAsphyreCustomMesh); overload;
  103.   constructor Create(ADevice: TAsphyreDevice);
  104.  end;
  105. //---------------------------------------------------------------------------
  106. implementation
  107. //---------------------------------------------------------------------------
  108. uses
  109.  AsphyreScene;
  110. //---------------------------------------------------------------------------
  111. const
  112.  RawLightWVP      = $01;
  113.  RawWorldInvT     = $02;
  114.  RawWorldViewProj = $03;
  115.  RawWorld         = $04;
  116.  RawEyePos        = $05;
  117.  RawLightPos      = $06;
  118.  RawLightDir      = $07;
  119.  RawAmbient       = $08;
  120.  RawSpecular      = $09;
  121.  RawSpecPower     = $0A;
  122.  RawTexMtx        = $0B;
  123.  RawSMapTex       = $0C;
  124.  RawSkinTex       = $0D;
  125.  RawBumpTex       = $0E;
  126.  TechBuildShadowMap  = $20;
  127.  TechShadowBumpPhong = $21;
  128.  TechProjBumpPhong   = $22;
  129. //---------------------------------------------------------------------------
  130. constructor TInovoFluxFx.Create(ADevice: TAsphyreDevice);
  131. begin
  132.  inherited;
  133.  FTechnique    := itBuildShadowMap;
  134.  FLightWVP     := IdentityMtx4;
  135.  FWorldInvT    := IdentityMtx4;
  136.  FWorldViewProj:= IdentityMtx4;
  137.  FWorld        := IdentityMtx4;
  138.  FEyePos       := UnityVec3;
  139.  FLightPos     := UnityVec3;
  140.  FLightDir     := -UnityVec3;
  141.  FAmbient      := 0.2;
  142.  FSpecular     := $FFFFFF;
  143.  FSpecPower    := 8.0;
  144.  FTexMtx       := IdentityMtx3;
  145.  FSMapTex      := nil;
  146.  FSkinTex      := nil;
  147.  FBumpTex      := nil;
  148. end;
  149. //---------------------------------------------------------------------------
  150. procedure TInovoFluxFx.Describe();
  151. begin
  152.  DescParam(sptCustom, 'LightWVP',              RawLightWVP);
  153.  DescParam(sptCustom, 'WorldInverseTranspose', RawWorldInvT);
  154.  DescParam(sptCustom, 'WorldViewProjection',   RawWorldViewProj);
  155.  DescParam(sptCustom, 'World',                 RawWorld);
  156.  DescParam(sptCustom, 'EyePos',                RawEyePos);
  157.  DescParam(sptCustom, 'LightPos',              RawLightPos);
  158.  DescParam(sptCustom, 'Ambient',               RawAmbient);
  159.  DescParam(sptCustom, 'Specular',              RawSpecular);
  160.  DescParam(sptCustom, 'SpecPower',             RawSpecPower);
  161.  DescParam(sptCustom, 'TexMtx',                RawTexMtx);
  162.  DescParam(sptTexture, 'SkinTex', RawSkinTex);
  163.  DescParam(sptTexture, 'BumpTex', RawBumpTex);
  164.  DescParam(sptTexture, 'SMapTex', RawSMapTex);
  165.  DescTechnique('BuildShadowMap',  TechBuildShadowMap);
  166.  DescTechnique('ShadowBumpPhong', TechShadowBumpPhong);
  167.  DescTechnique('ProjBumpPhong',   TechProjBumpPhong);
  168. end;
  169. //---------------------------------------------------------------------------
  170. procedure TInovoFluxFx.UpdateParam(Code: Integer; out DataPtr: Pointer;
  171.  out DataSize: Integer);
  172. begin
  173.  case Code of
  174.   RawLightWVP:
  175.    begin
  176.     DataPtr := @FLightWVP;
  177.     DataSize:= SizeOf(TMatrix4);
  178.    end;
  179.   RawWorldInvT:
  180.    begin
  181.     DataPtr := @FWorldInvT;
  182.     DataSize:= SizeOf(TMatrix4);
  183.    end;
  184.   RawWorldViewProj:
  185.    begin
  186.     DataPtr := @FWorldViewProj;
  187.     DataSize:= SizeOf(TMatrix4);
  188.    end;
  189.   RawWorld:
  190.    begin
  191.     DataPtr := @FWorld;
  192.     DataSize:= SizeOf(TMatrix4);
  193.    end;
  194.   RawEyePos:
  195.    begin
  196.     DataPtr := @FEyePos;
  197.     DataSize:= SizeOf(TVector3);
  198.    end;
  199.   RawLightPos:
  200.    begin
  201.     DataPtr := @FLightPos;
  202.     DataSize:= SizeOf(TVector3);
  203.    end;
  204.   RawLightDir:
  205.    begin
  206.     DataPtr := @FLightDir;
  207.     DataSize:= SizeOf(TVector3);
  208.    end;
  209.   RawAmbient:
  210.    begin
  211.     DataPtr := @FAmbient;
  212.     DataSize:= SizeOf(Single);
  213.    end;
  214.   RawSpecular:
  215.    begin
  216.     TempColor:= FSpecular;
  217.     DataPtr := @TempColor;
  218.     DataSize:= SizeOf(TD3DColorValue) - SizeOf(Single);
  219.    end;
  220.   RawSpecPower:
  221.    begin
  222.     DataPtr := @FSpecPower;
  223.     DataSize:= SizeOf(Single);
  224.    end;
  225.   RawTexMtx:
  226.    begin
  227.     DataPtr := @FTexMtx;
  228.     DataSize:= SizeOf(TMatrix3);
  229.    end;
  230.  end;
  231. end;
  232. //---------------------------------------------------------------------------
  233. procedure TInovoFluxFx.UpdateTexture(Code: Integer;
  234.  out ParamTex: IDirect3DTexture9);
  235. begin
  236.  ParamTex:= nil;
  237.  case Code of
  238.   RawSMapTex:
  239.    if (FSMapTex <> nil) then ParamTex:= FSMapTex.Tex9;
  240.   RawSkinTex:
  241.    if (FSkinTex <> nil) then ParamTex:= FSkinTex.Tex9;
  242.   RawBumpTex:
  243.    if (FBumpTex <> nil) then ParamTex:= FBumpTex.Tex9;
  244.  end;
  245. end;
  246. //---------------------------------------------------------------------------
  247. procedure TInovoFluxFx.DrawMesh(Mesh: TAsphyreCustomMesh);
  248. var
  249.  PassNo: Integer;
  250. begin
  251.  for PassNo:= 0 to NumPasses - 1 do
  252.   begin
  253.    if (not BeginPass(PassNo)) then Break;
  254.    Mesh.Draw();
  255.    EndPass();
  256.   end;
  257. end;
  258. //---------------------------------------------------------------------------
  259. procedure TInovoFluxFx.DrawShadow(Mesh: TAsphyreCustomMesh);
  260. begin
  261.  UpdateByCode(RawLightWVP);
  262.  DrawMesh(Mesh);
  263. end;
  264. //---------------------------------------------------------------------------
  265. procedure TInovoFluxFx.SetTechnique(const Value: TInovoTechnique);
  266. begin
  267.  if (FTechnique <> Value) then
  268.   begin
  269.    FTechnique:= Value;
  270.    if (Effect <> nil) then
  271.     case FTechnique of
  272.      itBuildShadowMap:
  273.       UseTechnique(TechBuildShadowMap);
  274.      itShadowBumpPhong:
  275.       UseTechnique(TechShadowBumpPhong);
  276.      itProjBumpPhong:
  277.       UseTechnique(TechProjBumpPhong);
  278.     end;
  279.   end;
  280. end;
  281. //---------------------------------------------------------------------------
  282. procedure TInovoFluxFx.UpdateTex(SMap, Skin, Bump: TAsphyreCustomImage);
  283. var
  284.  NewTex: TAsphyreCustomTexture;
  285. begin
  286.  // -> ShadowMap Texture
  287.  FSMapTex:= nil;
  288.  if (SMap <> nil) then FSMapTex:= SMap.Texture[0];
  289.  UpdateByCode(RawSMapTex);
  290.  // -> Skin Texture
  291.  NewTex:= nil;
  292.  if (Skin <> nil) then NewTex:= Skin.Texture[0];
  293.  if (NewTex <> FSkinTex) then
  294.   begin
  295.    FSkinTex:= NewTex;
  296.    UpdateByCode(RawSkinTex);
  297.   end;
  298.  // -> Bump Texture
  299.  NewTex:= nil;
  300.  if (Bump <> nil) then NewTex:= Bump.Texture[0];
  301.  if (NewTex <> FBumpTex) then
  302.   begin
  303.    FBumpTex:= NewTex;
  304.    UpdateByCode(RawBumpTex);
  305.   end;
  306. end;
  307. //---------------------------------------------------------------------------
  308. procedure TInovoFluxFx.UpdateParams();
  309. begin
  310.  UpdateByCode(RawLightWVP);
  311.  UpdateByCode(RawWorldInvT);
  312.  UpdateByCode(RawWorldViewProj);
  313.  UpdateByCode(RawWorld);
  314.  UpdateByCode(RawEyePos);
  315.  UpdateByCode(RawLightPos);
  316.  UpdateByCode(RawLightDir);
  317.  UpdateByCode(RawAmbient);
  318.  UpdateByCode(RawSpecular);
  319.  UpdateByCode(RawSpecPower);
  320.  UpdateByCode(RawTexMtx);
  321. end;
  322. //---------------------------------------------------------------------------
  323. end.