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

2D图形编程

开发平台:

Delphi

  1. unit AsphyreLights;
  2. //---------------------------------------------------------------------------
  3. // AsphyreLights.pas                                    Modified: 28-Jan-2007
  4. // Direct3D wrapper for Light Sources in 3D                      Version 1.01
  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 AsphyreLights.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, Vectors3, AsphyreAsserts, TrueColors;
  41. //--------------------------------------------------------------------------
  42. type
  43.  TAsphyreLightType = (altOmni, altDirectional, ltSpotlight);
  44. //--------------------------------------------------------------------------
  45.  PAsphyreLight = ^TAsphyreLight;
  46.  TAsphyreLight = record
  47.   Active   : Boolean;           // The status of light source
  48.   LightType: TAsphyreLightType; // Type of light source
  49.   Diffuse  : TTrueColor;        // Diffuse color of light
  50.   Specular : TTrueColor;        // Specular color of light
  51.   Ambient  : TTrueColor;        // Ambient color of light
  52.   Position : TVector3;          // Position in world space
  53.   Direction: TVector3;          // Direction in world space
  54.   Range    : Single;            // Cutoff range
  55.   Falloff  : Single;            // Falloff
  56.   Theta    : Single;            // Inner angle of spotlight cone
  57.   Phi      : Single;            // Outer angle of spotlight cone
  58.   AttenConstant : Single;       // Constant attenuation
  59.   AttenLinear   : Single;       // Linear attenuation
  60.   AttenQuadratic: Single;       // Quadratic attenuation
  61.  end;
  62. //--------------------------------------------------------------------------
  63.  TAsphyreLights = class
  64.  private
  65.   FScene: TObject;
  66.   Lights: array[0..7] of TAsphyreLight;
  67.   function GetLight(Num: Integer): PAsphyreLight;
  68.   procedure LightToStruct(Source: PAsphyreLight; Dest: PD3DLight9);
  69.  protected
  70.   procedure ResetLights();
  71.  public
  72.   property Scene: TObject read FScene;
  73.   property Light[Num: Integer]: PAsphyreLight read GetLight; default;
  74.   constructor Create(AScene: TObject);
  75.   function UpdateStates(): Boolean;
  76.  end;
  77. //--------------------------------------------------------------------------
  78. implementation
  79. //--------------------------------------------------------------------------
  80. uses
  81.  AsphyreScene;
  82. //--------------------------------------------------------------------------
  83. constructor TAsphyreLights.Create(AScene: TObject);
  84. begin
  85.  inherited Create();
  86.  FScene:= AScene;
  87.  Assert((FScene <> nil)and(FScene is TAsphyreScene), msgInvalidOwner);
  88.  ResetLights();
  89. end;
  90. //--------------------------------------------------------------------------
  91. function TAsphyreLights.GetLight(Num: Integer): PAsphyreLight;
  92. begin
  93.  Assert((Num >= 0)and(Num <= 7), msgIndexOutOfBounds);
  94.  Result:= @Lights[Num];
  95. end;
  96. //--------------------------------------------------------------------------
  97. procedure TAsphyreLights.ResetLights();
  98. var
  99.  i: Integer;
  100. begin
  101.  for i:= Low(Lights) to High(Lights) do
  102.   begin
  103.    FillChar(Lights[i], SizeOf(TAsphyreLight), 0);
  104.    Lights[i].Diffuse  := $FFFFFF;
  105.    Lights[i].Ambient  := $202020;
  106.    Lights[i].Specular := $FFFFFF;
  107.    Lights[i].LightType:= altOmni;
  108.    Lights[i].Range    := 4000.0;
  109.    Lights[i].Direction:= UnityVec3;
  110.    Lights[i].AttenConstant:= 1.0;
  111.   end;
  112. end;
  113. //--------------------------------------------------------------------------
  114. procedure TAsphyreLights.LightToStruct(Source: PAsphyreLight;
  115.  Dest: PD3DLight9);
  116. begin
  117.  case Source.LightType of
  118.   altOmni:
  119.    Dest._Type:= D3DLIGHT_POINT;
  120.   altDirectional:
  121.    Dest._Type:= D3DLIGHT_DIRECTIONAL;
  122.   ltSpotlight:
  123.    Dest._Type:= D3DLIGHT_SPOT;
  124.  end;
  125.  Dest.Diffuse  := TD3DColorValue(Source.Diffuse);
  126.  Dest.Specular := TD3DColorValue(Source.Specular);
  127.  Dest.Ambient  := TD3DColorValue(Source.Ambient);
  128.  Dest.Position := TD3DVector(Source.Position);
  129.  Dest.Direction:= TD3DVector(Source.Direction);
  130.  Dest.Falloff  := Source.Falloff;
  131.  Dest.Theta    := Source.Theta;
  132.  Dest.Phi      := Source.Phi;
  133.  Dest.Range    := Source.Range;
  134.  Dest.Attenuation0:= Source.AttenConstant;
  135.  Dest.Attenuation1:= Source.AttenLinear;
  136.  Dest.Attenuation2:= Source.AttenQuadratic;
  137. end;
  138. //--------------------------------------------------------------------------
  139. function TAsphyreLights.UpdateStates(): Boolean;
  140. var
  141.  CurLight: TD3DLight9;
  142.  i, LightIndex: Integer;
  143. begin
  144.  Assert(TAsphyreScene(FScene).Device.Initialized, msgNotInitialized);
  145.  Result:= True;
  146.  LightIndex:= 0;
  147.  for i:= Low(Lights) to High(Lights) do
  148.   if (Lights[i].Active) then
  149.    begin
  150.     LightToStruct(@Lights[i], @CurLight);
  151.     with TAsphyreScene(FScene).Device.Dev9 do
  152.      begin
  153.       SetLight(LightIndex, CurLight);
  154.       LightEnable(LightIndex, True);
  155.      end;
  156.     Inc(LightIndex); 
  157.    end;
  158.  // disable the rest of lights
  159.  for i:= LightIndex to 7 do
  160.   TAsphyreScene(FScene).Device.Dev9.LightEnable(i, False);
  161. end;
  162. //--------------------------------------------------------------------------
  163. end.