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

游戏引擎

开发平台:

Delphi

  1. (*
  2.  @Abstract(CAST II Engine resources 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 engine basic resource classes
  6. *)
  7. {$Include GDefines.inc}
  8. {$Include C2Defines.inc}
  9. unit C2Res;
  10. interface
  11. uses SysUtils,
  12.      TextFile,
  13.      Basics, Props, BaseTypes, BaseClasses, Resources, Base3D,
  14.      C2Types;
  15. type
  16.   // Path data container
  17.   TPathResource = class(Resources.TArrayResource)
  18.     function GetElementSize: Integer; override;
  19.   end;
  20.   // Vertices data container
  21.   TVerticesResource = class(Resources.TArrayResource)
  22.   private
  23.     FVertexSize: Integer;
  24.     function GetVertexCoords(Index: Integer): TVector3s;
  25.     procedure SetVertexCoords(Index: Integer; const Value: TVector3s);
  26.   protected
  27.     // Performs mesh conversion to new format
  28.     function Convert(OldFormat, NewFormat: Cardinal): Boolean; override;
  29.   public
  30.     constructor Create(AManager: TItemsManager); override;
  31.     function GetElementSize: Integer; override;
  32.     procedure AddProperties(const Result: Props.TProperties); override;
  33.     procedure SetProperties(Properties: Props.TProperties); override;
  34.     // Coordinates of each vertice
  35.     property VertexCoords[Index: Integer]: TVector3s read GetVertexCoords write SetVertexCoords;
  36.   end;
  37.   THeightMapResource = class(TImageResource)
  38.   protected
  39.     function Convert(OldFormat, NewFormat: Cardinal): Boolean; override;
  40.   end;
  41.   // Indices data container
  42.   TIndicesResource = class(Resources.TArrayResource)
  43.     function GetElementSize: Integer; override;
  44.   end;
  45.   // Shader programs container
  46.   TShaderResource = class(Resources.TScriptResource)
  47.   end;
  48.   // Returns list of classes introduced by the unit
  49.   function GetUnitClassList: TClassArray;
  50. implementation
  51. uses C2Visual;                          // For GetVertexElementOffset, etc
  52. function GetUnitClassList: TClassArray;
  53. begin
  54.   Result := GetClassList([TPathResource, TVerticesResource, TIndicesResource, TShaderResource, THeightMapResource]);
  55. end;
  56. { TPathResource }
  57. function TPathResource.GetElementSize: Integer;
  58. begin
  59.   Result := SizeOf(TVector4s);
  60. end;
  61. { TVerticesResource }
  62. function TVerticesResource.GetVertexCoords(Index: Integer): TVector3s;
  63. begin
  64.   Result := TVector3s(Pointer(Cardinal(Integer(Data) + Index*GetElementSize + GetVertexElementOffset(Format, vfiXYZ)))^);
  65. end;
  66. procedure TVerticesResource.SetVertexCoords(Index: Integer; const Value: TVector3s);
  67. begin
  68.   TVector3s(Pointer(Cardinal(Integer(Data) + Index*GetElementSize + GetVertexElementOffset(Format, vfiXYZ)))^) := Value;
  69. end;
  70. function TVerticesResource.Convert(OldFormat, NewFormat: Cardinal): Boolean;
  71. var Buffer: Pointer; BufSize: Integer;
  72. begin
  73.   Result := True;
  74.   Assert(OldFormat <> NewFormat);
  75.   if OldFormat = NewFormat then Exit;
  76.   BufSize := TotalElements * Integer(GetVertexSize(NewFormat));
  77.   GetMem(Buffer, BufSize);
  78.   ConvertVertices(OldFormat, NewFormat, TotalElements, Data, Buffer);
  79.   FVertexSize := MaxI(1, GetVertexSize(NewFormat));
  80.   SetAllocated(BufSize, Buffer);
  81. end;
  82. constructor TVerticesResource.Create(AManager: TItemsManager);
  83. begin
  84.   inherited;
  85.   FVertexSize := 1;
  86. end;
  87. function TVerticesResource.GetElementSize: Integer;
  88. begin
  89.   Result := FVertexSize;
  90. end;
  91. procedure TVerticesResource.AddProperties(const Result: TProperties);
  92. const
  93.   TexSetsStr: array[1..4] of string[4] = ('u', 'uv', 'uvw', 'uvwx');
  94.   TexSetsEnum = 'u&uv&uvw&uvwx';
  95. var i: Integer; s: string;
  96. begin
  97.   inherited;
  98.   if not Assigned(Result) then Exit;
  99.   if VertexContains(Format, vfTRANSFORMED) then s := '[RHW' else s := '[XYZ';
  100.   if VertexContains(Format, vfNORMALS)     then s := s + ' N';
  101.   if VertexContains(Format, vfDIFFUSE)     then s := s + ' D';
  102.   if VertexContains(Format, vfSPECULAR)    then s := s + ' S';
  103.   if VertexContains(Format, vfPOINTSIZE)   then s := s + ' P';
  104.   for i := 0 to GetVertexTextureSetsCount(Format)-1 do s := s + ' T' + TexSetsStr[GetVertexTextureCoordsCount(Format, i)];
  105.   if GetVertexWeightsCount(Format) > 0 then s := s + ' W' + IntToStr(GetVertexWeightsCount(Format));
  106.   if GetVertexIndexedBlending(Format) then s := s + 'i';
  107.   s := s + '] ' + IntToStr(GetVertexSize(Format)) + ' bytes';
  108.   Result.Add('FormatVertex', vtString, [poDerivative, poReadonly], s, '');
  109.   Result.Add('FormatVertexTransformed', vtBoolean, [poDerivative], OnOffStr[VertexContains(Format, vfTRANSFORMED)], '');
  110.   Result.Add('FormatVertexNormals',     vtBoolean, [poDerivative], OnOffStr[VertexContains(Format, vfNORMALS)],     '');
  111.   Result.Add('FormatVertexDiffuse',     vtBoolean, [poDerivative], OnOffStr[VertexContains(Format, vfDIFFUSE)],     '');
  112.   Result.Add('FormatVertexSpecular',    vtBoolean, [poDerivative], OnOffStr[VertexContains(Format, vfSPECULAR)],    '');
  113.   Result.Add('FormatVertexPoint size',  vtBoolean, [poDerivative], OnOffStr[VertexContains(Format, vfPOINTSIZE)],   '');
  114.   Result.Add('FormatVertexIndexed blending', vtBoolean, [poDerivative], OnOffStr[GetVertexIndexedBlending(Format)],   '');
  115.   Result.Add('FormatVertexNumber of UV sets', vtInt, [poDerivative], IntToStr(GetVertexTextureSetsCount(Format)), '');
  116.   for i := 0 to GetVertexTextureSetsCount(Format)-1 do
  117.     Result.AddEnumerated('FormatVertexUV set ' + IntToStr(i), [poDerivative], GetVertexTextureCoordsCount(Format, i)-1, TexSetsEnum);
  118.   Result.Add('FormatVertexNumber of weights', vtInt, [poDerivative], IntToStr(GetVertexWeightsCount(Format)), '');
  119. end;
  120. procedure TVerticesResource.SetProperties(Properties: TProperties);
  121. var
  122.   NewFormat: Cardinal;
  123.   NFTransformed, NFNormals, NFDiffuse, NFSpecular, NFPointSize, NFIndexedBlending: Boolean;
  124.   TextureSets: array of Integer; i, NumberOfTSets, NumberOfWeights: Integer;
  125. begin
  126.   inherited;
  127.   NFTransformed := VertexContains(Format, vfTRANSFORMED);
  128.   NFNormals     := VertexContains(Format, vfNORMALS);
  129.   NFDiffuse     := VertexContains(Format, vfDIFFUSE);
  130.   NFSpecular    := VertexContains(Format, vfSPECULAR);
  131.   NFPointSize   := VertexContains(Format, vfPOINTSIZE);
  132.   NumberOfTSets := GetVertexTextureSetsCount(Format);
  133.   SetLength(TextureSets, NumberOfTSets);
  134.   for i := 0 to NumberOfTSets-1 do TextureSets[i] := GetVertexTextureCoordsCount(Format, i);
  135.   NumberOfWeights := GetVertexWeightsCount(Format);
  136.   NFIndexedBlending := GetVertexIndexedBlending(Format);
  137.   if Properties.Valid('FormatVertexTransformed') then NFTransformed := Properties.GetAsInteger('FormatVertexTransformed') > 0;
  138.   if Properties.Valid('FormatVertexNormals')     then NFNormals     := Properties.GetAsInteger('FormatVertexNormals')     > 0;
  139.   if Properties.Valid('FormatVertexDiffuse')     then NFDiffuse     := Properties.GetAsInteger('FormatVertexDiffuse')     > 0;
  140.   if Properties.Valid('FormatVertexSpecular')    then NFSpecular    := Properties.GetAsInteger('FormatVertexSpecular')    > 0;
  141.   if Properties.Valid('FormatVertexPoint size')  then NFPointSize   := Properties.GetAsInteger('FormatVertexPoint size')  > 0;
  142.   if Properties.Valid('FormatVertexIndexed blending') then NFIndexedBlending := Properties.GetAsInteger('FormatVertexIndexed blending') > 0;
  143.   if Properties.Valid('FormatVertexNumber of UV sets') then NumberOfTSets := StrToIntDef(Properties['FormatVertexNumber of UV sets'], NumberOfTSets);
  144.   SetLength(TextureSets, NumberOfTSets);
  145.   for i := 0 to High(TextureSets) do TextureSets[i] := 2;
  146.   for i := 0 to NumberOfTSets-1 do
  147.     if Properties.Valid('FormatVertexUV set ' + IntToStr(i)) then TextureSets[i] := Properties.GetAsInteger('FormatVertexUV set ' + IntToStr(i)) + 1;
  148.   if Properties.Valid('FormatVertexNumber of weights') then NumberOfWeights := StrToIntDef(Properties['FormatVertexNumber of weights'], NumberOfWeights);
  149.   NewFormat := GetVertexFormat(NFTransformed, NFNormals, NFDiffuse, NFSpecular, NFPointSize, NumberOfWeights or (vwIndexedBlending * Ord(NFIndexedBlending)), TextureSets);
  150.   if NewFormat <> Format then Format := NewFormat;
  151.   TextureSets := nil;
  152. end;
  153. { TIndicesResource }
  154. function TIndicesResource.GetElementSize: Integer;
  155. begin
  156.   Result := MaxI(1, Format);
  157. end;
  158. { THeightMapResource }
  159. function THeightMapResource.Convert(OldFormat, NewFormat: Cardinal): Boolean;
  160. begin
  161.   case NewFormat of
  162.     pfA8, pfL8, pfD16, pfD32: Result := inherited Convert(OldFormat, NewFormat);
  163.     else begin
  164.       Log.Log('THeightMapResource.Convert: invalid format "' + PixelFormatToStr(NewFormat), lkError);
  165.       Result := False;
  166.     end;
  167.   end;
  168. end;
  169. begin
  170.   GlobalClassList.Add('C2Res', GetUnitClassList);
  171. end.