C2MiscVisual.pas
上传用户:yj_qiu
上传日期:2022-08-08
资源大小:23636k
文件大小:13k
源码类别:

游戏引擎

开发平台:

Delphi

  1. (*
  2.  @Abstract(CAST II Engine miscellaneous visual items unit)
  3.  (C) 2006 George "Mirage" Bakhtadze. <a href="http://www.casteng.com">www.casteng.com</a> <br>
  4.  The source code may be used under either MPL 1.1 or LGPL 2.1 license. See included license.txt file <br>
  5.  Unit contains miscellaneous classes of visual items
  6. *)
  7. {$Include GDefines.inc}
  8. {$Include C2Defines.inc}
  9. unit C2MiscVisual;
  10. interface
  11. uses
  12.   SysUtils,
  13.   TextFile, 
  14.   BaseTypes, Basics, Base3D, Props, BaseClasses, BaseCont, CAST2, C2VisItems, C2MiscTess, C2Materials, C2Visual;
  15. type
  16.   TScaledMeshTesselator = class(TMeshTesselator)
  17.     Direction: TVector3s;
  18.     constructor Create; override;
  19.     function IsSameItem(AItem: TReferencedItem): Boolean; override;
  20.     function Tesselate(const Params: TTesselationParameters; VBPTR: Pointer): Integer; override;
  21.   end;
  22.   TTree = class(TVisible)
  23.     CurZA, ZAStep, MaxAngle: Single;
  24.     constructor Create(AManager: TItemsManager); override;
  25.     function GetTesselatorClass: CTesselator; override;
  26.     procedure AddProperties(const Result: Props.TProperties); override;
  27.     procedure SetProperties(Properties: Props.TProperties); override;
  28.     procedure Process(const DeltaT: Float); override;
  29.   end;
  30.   TColoredTree = class(TTree)
  31.     EndColor: BaseTypes.TColor;
  32.     BurningTime: Cardinal;
  33.     Burning, Burned: Boolean;
  34.     procedure AddProperties(const Result: Props.TProperties); override;
  35.     procedure SetProperties(Properties: Props.TProperties); override;
  36.     procedure Process(const DeltaT: Float); override;
  37.     procedure Burn; virtual;
  38.     procedure StopBurn; virtual;
  39.   protected
  40.     BurningTimer: Cardinal;
  41.   end;
  42. implementation
  43. { TScaledMeshTesselator }
  44. constructor TScaledMeshTesselator.Create;
  45. begin
  46.   Direction := GetVector3s(0, 0, 1);
  47.   inherited;
  48. end;
  49. function TScaledMeshTesselator.IsSameItem(AItem: TReferencedItem): Boolean;
  50. begin
  51.   Result := False;
  52. end;
  53. function TScaledMeshTesselator.Tesselate(const Params: TTesselationParameters; VBPTR: Pointer): Integer;
  54. var i: Integer; DirP: Single;
  55. begin
  56.   LastTotalVertices := 0;
  57.   Result := LastTotalVertices;
  58.   if Vertices = nil then Exit;
  59.   
  60.   if not CompositeMember then begin
  61.     for i := 0 to TotalVertices-1 do begin
  62.       DirP := DotProductVector3s(TVector3s((@TByteBuffer(Vertices^)[i*VertexSize])^), Direction);
  63.       TVector3s((@TByteBuffer(VBPTR^)[i*VertexSize])^) := SubVector3s(TVector3s((@TByteBuffer(Vertices^)[i*VertexSize])^), ScaleVector3s(Direction, DirP));
  64.       Move(TByteBuffer(Vertices^)[i*VertexSize + SizeOf(TVector3s)], TByteBuffer(VBPTR^)[i*VertexSize + SizeOf(TVector3s)], VertexSize - SizeOf(TVector3s));
  65.     end;
  66.   end else begin
  67.     Assert(CompositeOffset <> nil, 'Composite object''s offset is nil');
  68.     for i := 0 to TotalVertices-1 do begin
  69.       
  70.       TVector3s((@TByteBuffer(VBPTR^)[i*VertexSize])^).X := TVector3s((@TByteBuffer(Vertices^)[i*VertexSize])^).X + CompositeOffset.X;
  71.       TVector3s((@TByteBuffer(VBPTR^)[i*VertexSize])^).Y := TVector3s((@TByteBuffer(Vertices^)[i*VertexSize])^).Y + CompositeOffset.Y;
  72.       TVector3s((@TByteBuffer(VBPTR^)[i*VertexSize])^).Z := TVector3s((@TByteBuffer(Vertices^)[i*VertexSize])^).Z + CompositeOffset.Z;
  73.       Move(TByteBuffer(Vertices^)[i*VertexSize + SizeOf(TVector3s)], TByteBuffer(VBPTR^)[i*VertexSize + SizeOf(TVector3s)], VertexSize - SizeOf(TVector3s));
  74.     end;
  75.   end;
  76. //  TesselationStatus[tbVertex].Status := tsTesselated;
  77.   TesselationStatus[tbVertex].Status := tsChanged;
  78.   LastTotalIndices := TotalIndices*1;
  79.   LastTotalVertices := TotalVertices;
  80.   Result := LastTotalVertices;
  81. end;
  82. { TTree }
  83. constructor TTree.Create(AManager: TItemsManager);
  84. begin
  85.   inherited;
  86.   MaxAngle := 5/180*pi;
  87.   CurZA := (Cos(Location.X/180*pi/200))*5/180*pi;
  88.   ZAStep := (0.3)/180*pi;
  89.   SetMesh;
  90. end;
  91. function TTree.GetTesselatorClass: CTesselator; begin Result := TWholeTreeMesh; end;
  92. procedure TTree.AddProperties(const Result: Props.TProperties);
  93. var Mesh: TWholeTreeMesh; Str: string;
  94. begin
  95.   inherited;
  96.   if not Assigned(Result) then Exit;
  97.   Result.Add('Tweening speed',     vtInt,     [], IntToStr(Round(ZAStep/pi*180*10)), '');
  98.   Result.Add('Max. angle',         vtInt,     [], IntToStr(Round(MaxAngle/pi*180)), '');
  99.   if not (CurrentTesselator is TWholeTreeMesh) then Exit;
  100.   Mesh := CurrentTesselator as TWholeTreeMesh;
  101.   Str := 'Geometry';
  102.   Result.Add(Str + 'Smoothing',          vtInt,     [], IntToStr(Mesh.Smoothing),       '');
  103.   Result.Add(Str + 'Levels',             vtInt,     [], IntToStr(Mesh.Levels),          '');
  104.   Result.Add(Str + 'Level height',       vtSingle,  [], FloatToStr(Mesh.LevelHeight),    '');
  105.   Result.Add(Str + 'Level stride',       vtSingle,  [], FloatToStr(Mesh.LevelStride),    '');
  106.   Result.Add(Str + 'Inner radius',       vtSingle,  [], FloatToStr(Mesh.InnerRadius),    '');
  107.   Result.Add(Str + 'Outer radius',       vtSingle,  [], FloatToStr(Mesh.OuterRadius),    '');
  108.   Result.Add(Str + 'Inner radius step',  vtSingle,  [], FloatToStr(Mesh.IRadiusStep),    '');
  109.   Result.Add(Str + 'Outer radius step',  vtSingle,  [], FloatToStr(Mesh.ORadiusStep),    '');
  110.   Result.Add(Str + 'Stride factor',      vtSingle,  [], FloatToStr(Mesh.StrideFactor),   '');
  111.   Result.Add('TextureCrown UV radius',   vtSingle,  [], FloatToStr(Mesh.CrownUVRadius),  '');
  112.   Result.Add(Str + 'Crown start',        vtSingle,  [], FloatToStr(Mesh.CrownStart),     '');
  113.   Result.Add('Color',             vtBoolean, [], OnOffStr[Mesh.Colored], '');
  114.   AddColorProperty(Result, 'ColorStem',  Mesh.StemColor);
  115.   AddColorProperty(Result, 'ColorCrown', Mesh.CrownColor);
  116.   Str := Str + 'Stem';
  117.   Result.Add(Str,                    vtBoolean, [], OnOffStr[Mesh.Stem],             '');
  118.   Result.Add('TextureU height',     vtSingle,  [], FloatToStr(Mesh.StemUHeight),    '');
  119.   Result.Add('TextureV height',     vtSingle,  [], FloatToStr(Mesh.StemVHeight),    '');
  120.   Result.Add(Str + 'Bottom radius', vtSingle,  [], FloatToStr(Mesh.StemLowRadius),  '');
  121.   Result.Add(Str + 'Top radius',    vtSingle,  [], FloatToStr(Mesh.StemHighRadius), '');
  122.   Result.Add(Str + 'Height',        vtSingle,  [], FloatToStr(Mesh.StemHeight),     '');
  123. end;
  124. procedure TTree.SetProperties(Properties: Props.TProperties);
  125. var Mesh: TWholeTreeMesh; Str: string;
  126. begin
  127.   inherited;
  128.   if Properties.Valid('Tweening speed') then ZAStep := StrToIntDef(Properties['Tweening speed'], 0) / 180*pi/10;
  129.   if Properties.Valid('Max. angle')     then MaxAngle := StrToIntDef(Properties['Max. angle'], 0)   / 180*pi;
  130.   if not (CurrentTesselator is TWholeTreeMesh) then Exit;
  131.   Mesh := CurrentTesselator as TWholeTreeMesh;
  132.   Str := 'Geometry';
  133.   if Properties.Valid(Str + 'Smoothing')         then Mesh.Smoothing    := StrToIntDef (Properties[Str + 'Smoothing'],         6);
  134.   if Properties.Valid(Str + 'Levels')            then Mesh.Levels       := StrToIntDef (Properties[Str + 'Levels'],            3);
  135.   if Properties.Valid(Str + 'Level height')      then Mesh.LevelHeight  := StrToFloatDef(Properties[Str + 'Level height'],      0.2);
  136.   if Properties.Valid(Str + 'Level stride')      then Mesh.LevelStride  := StrToFloatDef(Properties[Str + 'Level stride'],      0.3);
  137.   if Properties.Valid(Str + 'Inner radius')      then Mesh.InnerRadius  := StrToFloatDef(Properties[Str + 'Inner radius'],      0.4);
  138.   if Properties.Valid(Str + 'Outer radius')      then Mesh.OuterRadius  := StrToFloatDef(Properties[Str + 'Outer radius'],      0.8);
  139.   if Properties.Valid(Str + 'Inner radius step') then Mesh.IRadiusStep  := StrToFloatDef(Properties[Str + 'Inner radius step'], 0.08);
  140.   if Properties.Valid(Str + 'Outer radius step') then Mesh.ORadiusStep  := StrToFloatDef(Properties[Str + 'Outer radius step'], 0.08);
  141.   if Properties.Valid(Str + 'Stride factor')     then Mesh.StrideFactor := StrToFloatDef(Properties[Str + 'Stride factor'],     0.9);
  142.   if Properties.Valid('TextureCrown UV radius')  then Mesh.CrownUVRadius := StrToFloatDef(Properties['TextureCrown UV radius'], 1.0);
  143.   if Properties.Valid(Str + 'Crown start')       then Mesh.CrownStart    := StrToFloatDef(Properties[Str + 'Crown start'],      0.2);
  144.   if Properties.Valid('Color')       then Mesh.Colored    := Properties.GetAsInteger('Color') > 0;
  145.   SetColorProperty(Properties, 'ColorStem',  Mesh.StemColor);
  146.   SetColorProperty(Properties, 'ColorCrown', Mesh.CrownColor);
  147.   Str := Str + 'Stem';
  148.   if Properties.Valid(Str)                    then Mesh.Stem           := Properties.GetAsInteger(Str) > 0;
  149.   if Properties.Valid('TextureU height')     then Mesh.StemUHeight    := StrToFloatDef(Properties['TextureU height'],       0.25);
  150.   if Properties.Valid('TextureV height')     then Mesh.StemVHeight    := StrToFloatDef(Properties['TextureV height'],       0.25);
  151.   if Properties.Valid(Str + 'Bottom radius') then Mesh.StemLowRadius  := StrToFloatDef(Properties[Str + 'Bottom radius'],   0.30);
  152.   if Properties.Valid(Str + 'Top radius')    then Mesh.StemHighRadius := StrToFloatDef(Properties[Str + 'Top radius'],      0.10);
  153.   if Properties.Valid(Str + 'Height')        then Mesh.StemHeight     := StrToFloatDef(Properties[Str + 'Height'],          1.00);
  154.   SetMesh;
  155. {  Mesh.SetParameters(Single(GetPropertyValue(AProperties, 'Level height')), Single(GetPropertyValue(AProperties, 'Level stride')),
  156.                      Single(GetPropertyValue(AProperties, 'Inner radius')), Single(GetPropertyValue(AProperties, 'Outer radius')),
  157.                      Single(GetPropertyValue(AProperties, 'Inner radius step')), Single(GetPropertyValue(AProperties, 'Outer radius step')),
  158.                      Single(GetPropertyValue(AProperties, 'Height factor')),
  159.                      Boolean(GetPropertyValue(AProperties, 'Stem')),
  160.                      Single(GetPropertyValue(AProperties, 'Stem U height')), Single(GetPropertyValue(AProperties, 'Stem V height')),
  161.                      Single(GetPropertyValue(AProperties, 'Crown UV radius')),
  162.                      Single(GetPropertyValue(AProperties, 'Stem bottom radius')), Single(GetPropertyValue(AProperties, 'Stem top radius')),
  163.                      Single(GetPropertyValue(AProperties, 'Stem height')),
  164.                      Single(GetPropertyValue(AProperties, 'Crown start')),
  165.                      Longword(GetPropertyValue(AProperties, 'Smooth')), Longword(GetPropertyValue(AProperties, 'Levels')));}
  166. end;
  167. procedure TTree.Process(const DeltaT: Float);
  168. //var AbsPos: TVector3s; h: Single;
  169. begin
  170.   inherited;
  171. //  Exit;
  172. (*  if (World.Landscape <> nil) and (World.Landscape.HeightMap <> nil) then begin
  173.     AbsPos := GetAbsLocation3s;
  174.     h := World.Landscape.HeightMap.GetHeight(AbsPos.X, AbsPos.Z);
  175.     if h > World.Landscape.HeightMap.MinHeight then begin
  176.       if (AbsPos.Y - h > Epsilon) or (AbsPos.Y - h < -Epsilon) then
  177.        SetLocation(GetVector3s(Location.X, Location.Y - (AbsPos.Y - h), Location.Z));
  178.     end else SetLocation(GetVector3s(Location.X, Location.Y + World.GlobalForce.Y*10, Location.Z));
  179.   end;
  180.   CurZA := CurZA + ZAStep*5;
  181. //  if Abs(CurZA) > 1 then ZAStep := -ZAStep;
  182.   ModelMatrix1 := MulMatrix4s(ZRotationMatrix4s(Sin(CurZA)*MaxAngle), ModelMatrix);
  183.   Result := True;*)
  184. end;
  185. { TColoredTree }
  186. procedure TColoredTree.AddProperties(const Result: Props.TProperties);
  187. begin
  188.   inherited;
  189.   if Assigned(Result) then begin
  190.     AddColorProperty(Result, 'ColorFinal', EndColor);
  191.     Result.Add('BurningTime',     vtInt,        [], IntToStr(BurningTime),        '');
  192.   end;  
  193.   AddItemLink(Result, 'BurningMaterial', [], 'TMaterial');
  194. end;
  195. procedure TColoredTree.SetProperties(Properties: Props.TProperties);
  196. begin
  197.   inherited;
  198.   SetColorProperty(Properties, 'ColorFinal', EndColor);
  199.   if Properties.Valid('BurningTime')     then BurningTime         := StrToIntDef(Properties['BurningTime'], 0);
  200.   if Properties.Valid('BurningMaterial') then SetLinkProperty('BurningMaterial', Properties['BurningMaterial']);
  201.   SetMesh;
  202.   Burned := False;
  203.   Burning := False;
  204. //  if BurningMaterialName <> '' then Burn;
  205. end;
  206. procedure TColoredTree.Process(const DeltaT: Float);
  207. var Mesh: TWholeTreeMesh;
  208. begin
  209.   inherited;
  210.   if not Burning then Exit;
  211.   Mesh := CurrentTesselator as TWholeTreeMesh;
  212.   Mesh.StemColor := BlendColor(Mesh.StemColor, EndColor, 1 - BurningTimer/BurningTime);
  213.   Mesh.CrownColor := BlendColor(Mesh.CrownColor, EndColor, 1 - BurningTimer/BurningTime);
  214.   Mesh.Invalidate([tbVertex], False);
  215.   if BurningTimer > 0 then Dec(BurningTimer) else StopBurn;
  216. end;
  217. procedure TColoredTree.Burn;
  218. //var i: Integer;
  219. begin
  220.   if (BurningTime <= 0) or Burned then Exit;
  221. //  if not Burning then MatName := BurningMaterialName;
  222.   Burning := True;
  223.   BurningTimer := BurningTime + Trunc(0.5 + (Random*2-1) * BurningTime * 0.1);
  224.   CurZA := 0; MaxAngle := MaxAngle * 0.5;
  225. {  for i := 0 to TotalChilds-1 do if Childs[i] is TParticleSystem then begin
  226.     Childs[i].Status := Childs[i].Status or isProcessing or isVisible;
  227.     Childs[i].Init;
  228.   end;}
  229. end;
  230. procedure TColoredTree.StopBurn;
  231. //var i: Integer;
  232. begin
  233.   Burning := False;
  234.   Burned := True;
  235. {  for i := 0 to TotalChilds-1 do if Childs[i] is TParticleSystem then begin
  236.     (Childs[i] as TParticleSystem).DisableEmit := True;
  237.   end;}
  238. end;
  239. end.