From c52248f779fcd79e77d3f542131c983be4fb0e05 Mon Sep 17 00:00:00 2001 From: Domingo Date: Sun, 7 Apr 2019 15:02:22 +0200 Subject: [PATCH] Use slice function instead of SliceDynArray. Avoid making temporary copies of arrays. --- bgrabitmaptypes.pas | 89 ++++++--------------------------- bgracanvas2d.pas | 70 +++++++++++++++++++++----- bgraopengl3d.pas | 52 ++++++++++++++++---- bgrapen.pas | 12 +++-- bgrarenderer3d.pas | 116 +++++++++++++++++++++++++++++++++++--------- bgrascene3d.pas | 8 ++- bgrascenetypes.pas | 24 +++------ bgrasse.pas | 19 +++----- 8 files changed, 236 insertions(+), 154 deletions(-) diff --git a/bgrabitmaptypes.pas b/bgrabitmaptypes.pas index 27f3424..06ccd16 100644 --- a/bgrabitmaptypes.pas +++ b/bgrabitmaptypes.pas @@ -507,15 +507,21 @@ function CreateBGRAImageWriter(AFormat: TBGRAImageFormat; AHasTransparentPixels: {$IFDEF BDS} type - ArrayofBGRASingle = array of Single; - Arrayofword = array of BGRAWord; - -procedure DynArrayToOpenArray(rOpen : array of TPointF; rDyn : array of TPointF); -function SliceDynArray(rOpen : array of TPointF; Count : integer): arrayofTPointF; overload; -function SliceDynArray(rOpen : array of TBGRAPixel; Count : integer): ArrayOfTBGRAPixel; overload; -function SliceDynArray(rOpen : array of Single; Count : Integer): ArrayofBGRASingle; overload; -function SliceDynArray(rOpen : array of BGRAWord; Count : Integer): Arrayofword; overload; -function SliceDynArray(rOpen : array of TColorF; Count : integer): arrayofTColorF; overload; + // help types for calling slice function in Delphi. + THackArrayOfTPointF= array[0..MaxInt div SizeOf(TPointF)-1] of TPointF; + PHackArrayOfTPointF=^THackArrayOfTPointF; + + THackArrayOfTBGRAPixel= array[0..MaxInt div SizeOf(TBGRAPixel)-1] of TBGRAPixel; + PHackArrayOfTBGRAPixel=^THackArrayOfTBGRAPixel; + + THackArrayOfTColorF= array[0..MaxInt div SizeOf(TColorF)-1] of TColorF; + PHackArrayOfTColorF=^THackArrayOfTColorF; + + THackArrayOfSingle= array[0..MaxInt div SizeOf(Single)-1] of Single; + PHackArrayOfSingle=^THackArrayOfSingle; + + THackArrayOfBGRAWord= array[0..MaxInt div SizeOf(BGRAWord)-1] of BGRAWord; + PHackArrayOfBGRAWord=^THackArrayOfBGRAWord; {$ENDIF} @@ -528,71 +534,6 @@ implementation {$ENDIF} BGRAWritePNG; -{$IFDEF BDS} -function SliceDynArray(rOpen : array of TColorF; Count : integer): arrayofTColorF; -var - i : integer; - Open : arrayofTColorF; -begin - SetLength(Open, Length(rOpen)); - for i := 0 to High(rOpen) do - Open[i] := rOpen[i]; - Result := Copy(Open, 0, Count); -end; - -function SliceDynArray(rOpen : array of TBGRAPixel; Count : integer): ArrayOfTBGRAPixel; -var - i : integer; - Open : ArrayOfTBGRAPixel; -begin - SetLength(Open, Length(rOpen)); - for i := 0 to High(rOpen) do - Open[i] := rOpen[i]; - Result := Copy(Open, 0, Count); -end; - -procedure DynArrayToOpenArray(rOpen : array of TPointF; rDyn : array of TPointF); -var - i : integer; -begin - for i := 0 to High(rDyn) do - rOpen[i] := rDyn[i]; -end; - -function SliceDynArray(rOpen : array of TPointF; Count : integer): arrayofTPointF; -var - i : integer; - Open : arrayofTPointF; -begin - SetLength(Open, Length(rOpen)); - for i := 0 to High(rOpen) do - Open[i] := rOpen[i]; - Result := Copy(Open, 0, Count); -end; - -function SliceDynArray(rOpen : array of Single; Count : Integer): ArrayofBGRASingle; -var - i : integer; - Open : ArrayofBGRASingle; -begin - SetLength(Open, Length(rOpen)); - for i := 0 to High(rOpen) do - Open[i] := rOpen[i]; - Result := Copy(Open, 0, Count); -end; - -function SliceDynArray(rOpen : array of BGRAWord; Count : Integer): Arrayofword; -var - i : integer; - Open : Arrayofword; -begin - SetLength(Open, Length(rOpen)); - for i := 0 to High(rOpen) do - Open[i] := rOpen[i]; - Result := Copy(Open, 0, Count); -end; -{$ENDIF} - {$DEFINE INCLUDE_IMPLEMENTATION} {$I geometrytypes.inc} diff --git a/bgracanvas2d.pas b/bgracanvas2d.pas index 165f57d..b813a9c 100644 --- a/bgracanvas2d.pas +++ b/bgracanvas2d.pas @@ -2140,7 +2140,7 @@ procedure TBGRACanvas2D.roundRect(x, y, w, h, rx, ry: single); procedure TBGRACanvas2D.openedSpline(const pts: array of TPointF; style: TSplineStyle); -var transf: {$IFDEF BDS}arrayofTPointF{$ELSE}array of TPointF{$ENDIF}; +var transf:{$IFDEF BDS}arrayofTPointF{$ELSE}array of TPointF{$ENDIF}; begin if length(pts)=0 then exit; transf := ApplyTransform(pts); @@ -2155,18 +2155,26 @@ procedure TBGRACanvas2D.closedSpline(const pts: array of TPointF; begin if length(pts)=0 then exit; transf := ApplyTransform(pts); - transf := BGRAPath.ComputeClosedSpline({$IFDEF BDS}SliceDynArray(transf{$ELSE}slice(transf{$ENDIF}, length(transf)-1),style); + {$IFDEF BDS} + transf := BGRAPath.ComputeClosedSpline(slice(PHackArrayOfTPointF(transf)^, length(transf)-1),style); + {$ELSE} + transf := BGRAPath.ComputeClosedSpline(slice(transf, length(transf)-1),style); + {$ENDIF} AddPoints(transf); FLastCoord := pts[high(pts)]; end; procedure TBGRACanvas2D.spline(const pts: array of TPointF; style: TSplineStyle); -var transf: {$IFDEF BDS}arrayofTPointF{$ELSE}array of TPointF{$ENDIF}; +var transf:{$IFDEF BDS}arrayofTPointF{$ELSE}array of TPointF{$ENDIF}; begin if length(pts)=0 then exit; transf := ApplyTransform(pts); if (pts[0] = pts[high(pts)]) and (length(pts) > 1) then - transf := BGRAPath.ComputeClosedSpline({$IFDEF BDS}SliceDynArray(transf{$ELSE}slice(transf{$ENDIF}, length(transf)-1),style) + {$IFDEF BDS} + transf := BGRAPath.ComputeClosedSpline(slice(PHackArrayOfTPointF(transf)^, length(transf)-1),style) + {$ELSE} + transf := BGRAPath.ComputeClosedSpline(slice(transf, length(transf)-1),style) + {$ENDIF} else transf := BGRAPath.ComputeOpenedSpline(transf,style); AddPoints(transf); @@ -2362,31 +2370,51 @@ function TBGRACanvas2D.measureText(AText: string): TCanvas2dTextSize; procedure TBGRACanvas2D.fill; begin if FPathPointCount = 0 then exit; - FillPoly({$IFDEF BDS}SliceDynArray(FPathPoints{$ELSE}slice(FPathPoints{$ENDIF},FPathPointCount)); + {$IFDEF BDS} + FillPoly(slice(PHackArrayOfTPointF(FPathPoints)^,FPathPointCount)); + {$ELSE} + FillPoly(slice(FPathPoints,FPathPointCount)); + {$ENDIF} end; procedure TBGRACanvas2D.stroke; begin if FPathPointCount = 0 then exit; - StrokePoly({$IFDEF BDS}SliceDynArray(FPathPoints{$ELSE}slice(FPathPoints{$ENDIF},FPathPointCount)); + {$IFDEF BDS} + StrokePoly(slice(PHackArrayOfTPointF(FPathPoints)^,FPathPointCount)); + {$ELSE} + StrokePoly(slice(FPathPoints,FPathPointCount)); + {$ENDIF} end; procedure TBGRACanvas2D.fillOverStroke; begin if FPathPointCount = 0 then exit; - FillStrokePoly({$IFDEF BDS}SliceDynArray(FPathPoints{$ELSE}slice(FPathPoints{$ENDIF},FPathPointCount),true); + {$IFDEF BDS} + FillStrokePoly(slice(PHackArrayOfTPointF(FPathPoints)^,FPathPointCount),true); + {$ELSE} + FillStrokePoly(slice(FPathPoints,FPathPointCount),true); + {$ENDIF} end; procedure TBGRACanvas2D.strokeOverFill; begin if FPathPointCount = 0 then exit; - FillStrokePoly({$IFDEF BDS}SliceDynArray(FPathPoints{$ELSE}slice(FPathPoints{$ENDIF},FPathPointCount),false); + {$IFDEF BDS} + FillStrokePoly(slice(PHackArrayOfTPointF(FPathPoints)^,FPathPointCount),false); + {$ELSE} + FillStrokePoly(slice(FPathPoints,FPathPointCount),false); + {$ENDIF} end; procedure TBGRACanvas2D.clearPath; begin if FPathPointCount = 0 then exit; - ClearPoly({$IFDEF BDS}SliceDynArray(FPathPoints{$ELSE}slice(FPathPoints{$ENDIF},FPathPointCount)); + {$IFDEF BDS} + ClearPoly(slice(PHackArrayOfTPointF(FPathPoints)^,FPathPointCount)); + {$ELSE} + ClearPoly(slice(FPathPoints,FPathPointCount)); + {$ENDIF} end; procedure TBGRACanvas2D.clip; @@ -2402,9 +2430,17 @@ procedure TBGRACanvas2D.clip; currentState.SetClipMask(surface.NewBitmap(width,height,BGRAWhite),True); tempBmp := surface.NewBitmap(width,height,BGRABlack); if antialiasing then - tempBmp.FillPolyAntialias({$IFDEF BDS}SliceDynArray(FPathPoints{$ELSE}slice(FPathPoints{$ENDIF},FPathPointCount),BGRAWhite) + {$IFDEF BDS} + tempBmp.FillPolyAntialias(slice(PHackArrayOfTPointF(FPathPoints)^,FPathPointCount),BGRAWhite) + {$ELSE} + tempBmp.FillPolyAntialias(slice(FPathPoints,FPathPointCount),BGRAWhite) + {$ENDIF} else - tempBmp.FillPoly({$IFDEF BDS}SliceDynArray(FPathPoints{$ELSE}slice(FPathPoints{$ENDIF},FPathPointCount),BGRAWhite,dmSet); + {$IFDEF BDS} + tempBmp.FillPoly(slice(PHackArrayOfTPointF(FPathPoints)^,FPathPointCount),BGRAWhite,dmSet); + {$ELSE} + tempBmp.FillPoly(slice(FPathPoints,FPathPointCount),BGRAWhite,dmSet); + {$ENDIF} currentState.clipMaskReadWrite.BlendImage(0,0,tempBmp,boDarken); tempBmp.Free; end; @@ -2414,9 +2450,17 @@ procedure TBGRACanvas2D.unclip; if FPathPointCount = 0 then exit; if currentState.clipMaskReadOnly = nil then exit; if antialiasing then - currentState.clipMaskReadWrite.FillPolyAntialias({$IFDEF BDS}SliceDynArray(FPathPoints{$ELSE}slice(FPathPoints{$ENDIF},FPathPointCount),BGRAWhite) + {$IFDEF BDS} + currentState.clipMaskReadWrite.FillPolyAntialias(slice(PHackArrayOfTPointF(FPathPoints)^,FPathPointCount),BGRAWhite) + {$ELSE} + currentState.clipMaskReadWrite.FillPolyAntialias(slice(FPathPoints,FPathPointCount),BGRAWhite) + {$ENDIF} else - currentState.clipMaskReadWrite.FillPoly({$IFDEF BDS}SliceDynArray(FPathPoints{$ELSE}slice(FPathPoints{$ENDIF},FPathPointCount),BGRAWhite,dmSet); + {$IFDEF BDS} + currentState.clipMaskReadWrite.FillPoly(slice(PHackArrayOfTPointF(FPathPoints)^,FPathPointCount),BGRAWhite,dmSet); + {$ELSE} + currentState.clipMaskReadWrite.FillPoly(slice(FPathPoints,FPathPointCount),BGRAWhite,dmSet); + {$ENDIF} if currentState.clipMaskReadOnly.Equals(BGRAWhite) then currentState.SetClipMask(nil,true); end; diff --git a/bgraopengl3d.pas b/bgraopengl3d.pas index b9d0fb3..c1d9655 100644 --- a/bgraopengl3d.pas +++ b/bgraopengl3d.pas @@ -898,7 +898,7 @@ function TBGLRenderer3D.RenderFace(var ADescription: TFaceRenderingDescription; end; PtCenter3D := PtCenter3D *(1/NbVertices); Normalize3D_128(NormalCenter3D); - ColorCenter := MergeBGRA({$IFDEF BDS}SliceDynArray(Colors{$ELSE}slice(Colors{$ENDIF},NbVertices)); + ColorCenter := MergeBGRA({$IFDEF BDS}slice(PHackArrayOfTBGRAPixel(Colors)^{$ELSE}slice(Colors{$ENDIF},NbVertices)); end; end; @@ -944,9 +944,17 @@ function TBGLRenderer3D.RenderFace(var ADescription: TFaceRenderingDescription; Positions3D[i].z := -Positions3D[i].z; if NbVertices = 3 then - tex.DrawTriangle({$IFDEF BDS}SSESliceDynArray(Positions3D{$ELSE}slice(Positions3D{$ENDIF},3),{$IFDEF BDS}SliceDynArray(TexCoords{$ELSE}slice(TexCoords{$ENDIF},3),{$IFDEF BDS}SliceDynArray(FShadedColorsF{$ELSE}slice(FShadedColorsF{$ENDIF},3)) + {$IFDEF BDS} + tex.DrawTriangle(slice(PHackArrayOfTPoint3D_128(Positions3D)^,3),slice(PHackArrayOfTPointF(TexCoords)^,3),slice(PHackArrayOfTColorF(FShadedColorsF)^,3)) + {$ELSE} + tex.DrawTriangle(slice(Positions3D,3),slice(TexCoords,3),slice(FShadedColorsF,3)) + {$ENDIF} else if NbVertices = 4 then - tex.DrawQuad({$IFDEF BDS}SSESliceDynArray(Positions3D{$ELSE}slice(Positions3D{$ENDIF},4),{$IFDEF BDS}SliceDynArray(TexCoords{$ELSE}slice(TexCoords{$ENDIF},4),{$IFDEF BDS}SliceDynArray(FShadedColorsF{$ELSE}slice(FShadedColorsF{$ENDIF},4)); + {$IFDEF BDS} + tex.DrawQuad(slice(PHackArrayOfTPoint3D_128(Positions3D)^,4),slice(PHackArrayOfTPointF(TexCoords)^,4),slice(PHackArrayOfTColorF(FShadedColorsF)^,4)); + {$ELSE} + tex.DrawQuad(slice(Positions3D,4),slice(TexCoords,4),slice(FShadedColorsF,4)); + {$ENDIF} end else begin for i := 0 to NbVertices-1 do @@ -956,9 +964,17 @@ function TBGLRenderer3D.RenderFace(var ADescription: TFaceRenderingDescription; end; if NbVertices = 3 then - tex.DrawTriangle({$IFDEF BDS}SSESliceDynArray(Positions3D{$ELSE}slice(Positions3D{$ENDIF},3),{$IFDEF BDS}SSESliceDynArray(Normals3D{$ELSE}slice(Normals3D{$ENDIF},3),{$IFDEF BDS}SliceDynArray(TexCoords{$ELSE}slice(TexCoords{$ENDIF},3)) + {$IFDEF BDS} + tex.DrawTriangle(slice(PHackArrayOfTPoint3D_128(Positions3D)^,3),slice(PHackArrayOfTPoint3D_128(Normals3D)^,3),slice(PHackArrayOfTPointF(TexCoords)^,3)) + {$ELSE} + tex.DrawTriangle(slice(Positions3D,3),slice(Normals3D,3),slice(TexCoords,3)) + {$ENDIF} else if NbVertices = 4 then - tex.DrawQuad({$IFDEF BDS}SSESliceDynArray(Positions3D{$ELSE}slice(Positions3D{$ENDIF},4),{$IFDEF BDS}SSESliceDynArray(Normals3D{$ELSE}slice(Normals3D{$ENDIF},4),{$IFDEF BDS}SliceDynArray(TexCoords{$ELSE}slice(TexCoords{$ENDIF},4)); + {$IFDEF BDS} + tex.DrawQuad(slice(PHackArrayOfTPoint3D_128(Positions3D)^,4),slice(PHackArrayOfTPoint3D_128(Normals3D)^,4),slice(PHackArrayOfTPointF(TexCoords)^,4)); + {$ELSE} + tex.DrawQuad(slice(Positions3D,4),slice(Normals3D,4),slice(TexCoords,4)); + {$ENDIF} end; end else @@ -977,7 +993,7 @@ function TBGLRenderer3D.RenderFace(var ADescription: TFaceRenderingDescription; if NbVertices > 4 then begin ComputeCenter; - ColorCenter := FBGRAShader.Apply(PtCenter3D,NormalCenter3D,MergeBGRA({$IFDEF BDS}SliceDynArray(Colors{$ELSE}slice(Colors{$ENDIF},NbVertices))); + ColorCenter := FBGRAShader.Apply(PtCenter3D,NormalCenter3D,MergeBGRA({$IFDEF BDS}slice(PHackArrayOfTBGRAPixel(Colors)^{$ELSE}slice(Colors{$ENDIF},NbVertices))); for i := 0 to NbVertices-1 do Positions3D[i].z := -Positions3D[i].z; @@ -997,9 +1013,17 @@ function TBGLRenderer3D.RenderFace(var ADescription: TFaceRenderingDescription; Positions3D[i].z := -Positions3D[i].z; if NbVertices = 3 then - FCanvas.FillTrianglesLinearColor({$IFDEF BDS}SSESliceDynArray(Positions3D{$ELSE}slice(Positions3D{$ENDIF},3),{$IFDEF BDS}SliceDynArray(FShadedColors{$ELSE}slice(FShadedColors{$ENDIF},3)) + {$IFDEF BDS} + FCanvas.FillTrianglesLinearColor(slice(PHackArrayOfTPoint3D_128(Positions3D)^,3),slice(PHackArrayOfTBGRAPixel(FShadedColors)^,3)) + {$ELSE} + FCanvas.FillTrianglesLinearColor(slice(Positions3D,3),slice(FShadedColors,3)) + {$ENDIF} else if NbVertices = 4 then - FCanvas.FillQuadsLinearColor({$IFDEF BDS}SSESliceDynArray(Positions3D{$ELSE}slice(Positions3D{$ENDIF},4),{$IFDEF BDS}SliceDynArray(FShadedColors{$ELSE}slice(FShadedColors{$ENDIF},4)); + {$IFDEF BDS} + FCanvas.FillQuadsLinearColor(slice(PHackArrayOfTPoint3D_128(Positions3D)^,4),slice(PHackArrayOfTBGRAPixel(FShadedColors)^,4)); + {$ELSE} + FCanvas.FillQuadsLinearColor(slice(Positions3D,4),slice(FShadedColors,4)); + {$ENDIF} end; end else begin @@ -1025,9 +1049,17 @@ function TBGLRenderer3D.RenderFace(var ADescription: TFaceRenderingDescription; end else begin if NbVertices = 3 then - FCanvas.FillTrianglesLinearColor({$IFDEF BDS}SSESliceDynArray(Positions3D{$ELSE}slice(Positions3D{$ENDIF},3),{$IFDEF BDS}SSESliceDynArray(Normals3D{$ELSE}slice(Normals3D{$ENDIF},3),{$IFDEF BDS}SliceDynArray(Colors{$ELSE}slice(Colors{$ENDIF},3)) + {$IFDEF BDS} + FCanvas.FillTrianglesLinearColor(slice(PHackArrayOfTPoint3D_128(Positions3D)^,3),slice(PHackArrayOfTPoint3D_128(Normals3D)^,3),slice(PHackArrayOfTBGRAPixel(Colors)^,3)) + {$ELSE} + FCanvas.FillTrianglesLinearColor(slice(Positions3D,3),slice(Normals3D,3),slice(Colors,3)) + {$ENDIF} else if NbVertices = 4 then - FCanvas.FillQuadsLinearColor({$IFDEF BDS}SSESliceDynArray(Positions3D{$ELSE}slice(Positions3D{$ENDIF},4),{$IFDEF BDS}SSESliceDynArray(Normals3D{$ELSE}slice(Normals3D{$ENDIF},4),{$IFDEF BDS}SliceDynArray(Colors{$ELSE}slice(Colors{$ENDIF},4)); + {$IFDEF BDS} + FCanvas.FillQuadsLinearColor(slice(PHackArrayOfTPoint3D_128(Positions3D)^,4),slice(PHackArrayOfTPoint3D_128(Normals3D)^,4),slice(PHackArrayOfTBGRAPixel(Colors)^,4)); + {$ELSE} + FCanvas.FillQuadsLinearColor(slice(Positions3D,4),slice(Normals3D,4),slice(Colors,4)); + {$ENDIF} end; end; end; diff --git a/bgrapen.pas b/bgrapen.pas index 9bf5ea7..7addfd5 100644 --- a/bgrapen.pas +++ b/bgrapen.pas @@ -835,9 +835,9 @@ function ComputeWidePolylinePoints(const linepts: array of TPointF; width: singl len: single; leftDir: TPointF; end; - compPts: {$IFDEF BDS}arrayofTPointF{$ELSE}array of TPointF{$ENDIF}; + compPts: array of TPointF; nbCompPts: integer; - revCompPts: {$IFDEF BDS}arrayofTPointF{$ELSE}array of TPointF{$ENDIF}; + revCompPts: array of TPointF; nbRevCompPts: integer; pts: array of TPointF; roundPrecision: integer; @@ -999,7 +999,13 @@ function ComputeWidePolylinePoints(const linepts: array of TPointF; width: singl -borders[high(pts)-1].leftSide.dir, false,true); end; posstyle := 0; - ApplyPenStyle({$IFDEF BDS}SliceDynArray(compPts{$ELSE}slice(compPts{$ENDIF},nbCompPts),{$IFDEF BDS}SliceDynArray(revCompPts{$ELSE}slice(revCompPts{$ENDIF},nbRevCompPts),penstyle,width,posstyle,enveloppe); +{$IFDEF BDS} + /// works ok + // ApplyPenStyle(slice(PHackArrayOfTPointF(@compPts[0])^,nbCompPts),slice(PHackArrayOfTPointF(@revCompPts[0])^,nbRevCompPts),penstyle,width,posstyle,enveloppe); + ApplyPenStyle(slice(PHackArrayOfTPointF(compPts)^,nbCompPts),slice(PHackArrayOfTPointF(revCompPts)^,nbRevCompPts),penstyle,width,posstyle,enveloppe); +{$ELSE} + ApplyPenStyle(slice(compPts,nbCompPts),slice(revCompPts,nbRevCompPts),penstyle,width,posstyle,enveloppe); +{$ENDIF} if Result=nil then begin Result := enveloppe; diff --git a/bgrarenderer3d.pas b/bgrarenderer3d.pas index cf97e4d..fe9717c 100644 --- a/bgrarenderer3d.pas +++ b/bgrarenderer3d.pas @@ -593,7 +593,7 @@ function TBGRARenderer3D.RenderFace(var ADescription: TFaceRenderingDescription; begin ClearPoint3D_128(pos3D); ClearPoint3D_128(normal3D); - color := MergeBGRA({$IFDEF BDS}SliceDynArray(Colors{$ELSE}slice(Colors{$ENDIF},NbVertices)); + color := MergeBGRA({$IFDEF BDS}slice(PHackArrayOfTBGRAPixel(Colors)^{$ELSE}slice(Colors{$ENDIF},NbVertices)); end; for j := 0 to NbVertices-1 do begin @@ -618,10 +618,17 @@ function TBGRARenderer3D.RenderFace(var ADescription: TFaceRenderingDescription; begin if Texture <> nil then begin + {$IFDEF BDS} BGRAPolygonAliased.PolygonPerspectiveMappingShaderAliased(FRenderSurface, - {$IFDEF BDS}SliceDynArray(Projections{$ELSE}slice(Projections{$ENDIF},NbVertices),{$IFDEF BDS}SSESliceDynArray(Positions3D{$ELSE}slice(Positions3D{$ENDIF},NbVertices),{$IFDEF BDS}SSESliceDynArray(Normals3D{$ELSE}slice(Normals3D{$ENDIF},NbVertices), - Texture,{$IFDEF BDS}SliceDynArray(TexCoords{$ELSE}slice(TexCoords{$ENDIF},NbVertices),FOptions.TextureInterpolation, + slice(PHackArrayOfTPointF(Projections)^,NbVertices),slice(PHackArrayOfTPoint3D_128(Positions3D)^,NbVertices),slice(PHackArrayOfTPoint3D_128(Normals3D)^,NbVertices), + Texture,slice(PHackArrayOfTPointF(TexCoords)^,NbVertices),FOptions.TextureInterpolation, FShader.ShaderFunction,True, BGRAPixelTransparent,FZBuffer,FShader.Context); + {$ELSE} + BGRAPolygonAliased.PolygonPerspectiveMappingShaderAliased(FRenderSurface, + slice(PHackArrayOfTPointF(Projections)^,NbVertices),slice(Positions3D,NbVertices),slice(Normals3D,NbVertices), + Texture,slice(PHackArrayOfTPointF(TexCoords)^,NbVertices),FOptions.TextureInterpolation, + FShader.ShaderFunction,True, BGRAPixelTransparent,FZBuffer,FShader.Context); + {$ENDIF} exit; end; @@ -631,9 +638,15 @@ function TBGRARenderer3D.RenderFace(var ADescription: TFaceRenderingDescription; if SameColor then begin + {$IFDEF BDS} BGRAPolygonAliased.PolygonPerspectiveMappingShaderAliased(FRenderSurface, - {$IFDEF BDS}SliceDynArray(Projections{$ELSE}slice(Projections{$ENDIF},NbVertices),{$IFDEF BDS}SSESliceDynArray(Positions3D{$ELSE}slice(Positions3D{$ENDIF},NbVertices),{$IFDEF BDS}SSESliceDynArray(Normals3D{$ELSE}slice(Normals3D{$ENDIF},NbVertices),nil, - {$IFDEF BDS}SliceDynArray(TexCoords{$ELSE}slice(TexCoords{$ENDIF},NbVertices),False,FShader.ShaderFunction,True,Colors[0],FZBuffer,FShader.Context); + slice(PHackArrayOfTPointF(Projections)^,NbVertices),slice(PHackArrayOfTPoint3D_128(Positions3D)^,NbVertices),slice(PHackArrayOfTPoint3D_128(Normals3D)^,NbVertices),nil, + slice(PHackArrayOfTPointF(TexCoords)^,NbVertices),False,FShader.ShaderFunction,True,Colors[0],FZBuffer,FShader.Context); + {$ELSE} + BGRAPolygonAliased.PolygonPerspectiveMappingShaderAliased(FRenderSurface, + slice(Projections,NbVertices),slice(Positions3D,NbVertices),slice(Normals3D,NbVertices),nil, + slice(TexCoords,NbVertices),False,FShader.ShaderFunction,True,Colors[0],FZBuffer,FShader.Context); + {$ENDIF} end else if NbVertices = 3 then begin @@ -641,9 +654,16 @@ function TBGRARenderer3D.RenderFace(var ADescription: TFaceRenderingDescription; FColorGradientTempBmp.SetPixel(1,0,Colors[1]); FColorGradientTempBmp.SetPixel(0,1,Colors[2]); FColorGradientTempBmp.SetPixel(1,1,MergeBGRA(Colors[1],Colors[2])); + {$IFDEF BDS} BGRAPolygonAliased.PolygonPerspectiveMappingShaderAliased(FRenderSurface, - {$IFDEF BDS}SliceDynArray(Projections{$ELSE}slice(Projections{$ENDIF},NbVertices),{$IFDEF BDS}SSESliceDynArray(Positions3D{$ELSE}slice(Positions3D{$ENDIF},NbVertices),{$IFDEF BDS}SSESliceDynArray(Normals3D{$ELSE}slice(Normals3D{$ENDIF},NbVertices),FColorGradientTempBmp, + slice(PHackArrayOfTPointF(Projections)^,NbVertices),slice(PHackArrayOfTPoint3D_128(Positions3D)^,NbVertices),slice(PHackArrayOfTPoint3D_128(Normals3D)^,NbVertices),FColorGradientTempBmp, [PointF(0,0),PointF(1,0),PointF(0,1)],True,FShader.ShaderFunction,True, BGRAPixelTransparent,FZBuffer,FShader.Context); + {$ELSE} + BGRAPolygonAliased.PolygonPerspectiveMappingShaderAliased(FRenderSurface, + slice(Projections,NbVertices),slice(Positions3D,NbVertices),slice(Normals3D,NbVertices),FColorGradientTempBmp, + [PointF(0,0),PointF(1,0),PointF(0,1)],True,FShader.ShaderFunction,True, BGRAPixelTransparent,FZBuffer,FShader.Context); + + {$ENDIF} end else if NbVertices = 4 then begin @@ -651,9 +671,15 @@ function TBGRARenderer3D.RenderFace(var ADescription: TFaceRenderingDescription; FColorGradientTempBmp.SetPixel(1,0,Colors[1]); FColorGradientTempBmp.SetPixel(1,1,Colors[2]); FColorGradientTempBmp.SetPixel(0,1,Colors[3]); + {$IFDEF BDS} + BGRAPolygonAliased.PolygonPerspectiveMappingShaderAliased(FRenderSurface, + slice(PHackArrayOfTPointF(Projections)^,NbVertices),slice(PHackArrayOfTPoint3D_128(Positions3D)^,NbVertices),slice(PHackArrayOfTPoint3D_128(Normals3D)^,NbVertices),FColorGradientTempBmp, + [PointF(0,0),PointF(1,0),PointF(1,1),PointF(0,1)],True,FShader.ShaderFunction,True, BGRAPixelTransparent,FZBuffer,FShader.Context); + {$ELSE} BGRAPolygonAliased.PolygonPerspectiveMappingShaderAliased(FRenderSurface, - {$IFDEF BDS}SliceDynArray(Projections{$ELSE}slice(Projections{$ENDIF},NbVertices),{$IFDEF BDS}SSESliceDynArray(Positions3D{$ELSE}slice(Positions3D{$ENDIF},NbVertices),{$IFDEF BDS}SSESliceDynArray(Normals3D{$ELSE}slice(Normals3D{$ENDIF},NbVertices),FColorGradientTempBmp, + slice(Projections,NbVertices),slice(Positions3D,NbVertices),slice(Normals3D,NbVertices),FColorGradientTempBmp, [PointF(0,0),PointF(1,0),PointF(1,1),PointF(0,1)],True,FShader.ShaderFunction,True, BGRAPixelTransparent,FZBuffer,FShader.Context); + {$ENDIF} end else if NbVertices >= 3 then begin //split into triangles @@ -724,7 +750,11 @@ function TBGRARenderer3D.RenderFace(var ADescription: TFaceRenderingDescription; ComputeShadedColors; if FSameShadedColors then - FMultishapeFiller.AddPolygon({$IFDEF BDS}SliceDynArray(Projections{$ELSE}slice(Projections{$ENDIF},NbVertices),FShadedColors[0]) + {$IFDEF BDS} + FMultishapeFiller.AddPolygon(slice(PHackArrayOfTPointF(Projections)^,NbVertices),FShadedColors[0]) + {$ELSE} + FMultishapeFiller.AddPolygon(slice(Projections,NbVertices),FShadedColors[0]) + {$ENDIF} else if NbVertices=3 then FMultishapeFiller.AddTriangleLinearColor( @@ -759,10 +789,19 @@ function TBGRARenderer3D.RenderFace(var ADescription: TFaceRenderingDescription; if FSameShadedColors then begin if FOptions.PerspectiveMode = pmZBuffer then - BGRAPolygonAliased.PolygonPerspectiveColorGradientAliased(FRenderSurface, {$IFDEF BDS}SliceDynArray(Projections{$ELSE}slice(Projections{$ENDIF},NbVertices), - {$IFDEF BDS}SliceDynArray(FDepths{$ELSE}slice(FDepths{$ENDIF},NbVertices), {$IFDEF BDS}SliceDynArray(FShadedColors{$ELSE}slice(FShadedColors{$ENDIF},NbVertices),True,FZBuffer) + {$IFDEF BDS} + BGRAPolygonAliased.PolygonPerspectiveColorGradientAliased(FRenderSurface, slice(PHackArrayOfTPointF(Projections)^,NbVertices), + slice(PHackArrayOfSingle(FDepths)^,NbVertices), slice(PHackArrayOfTBGRAPixel(FShadedColors)^,NbVertices),True,FZBuffer) + {$ELSE} + BGRAPolygonAliased.PolygonPerspectiveColorGradientAliased(FRenderSurface, slice(Projections,NbVertices), + slice(FDepths,NbVertices),slice(FShadedColors,NbVertices),True,FZBuffer) + {$ENDIF} else - FRenderSurface.FillPoly({$IFDEF BDS}SliceDynArray(Projections{$ELSE}slice(Projections{$ENDIF},NbVertices),FShadedColors[0],dmDrawWithTransparency); + {$IFDEF BDS} + FRenderSurface.FillPoly(slice(PHackArrayOfTPointF(Projections)^,NbVertices),FShadedColors[0],dmDrawWithTransparency); + {$ELSE} + FRenderSurface.FillPoly(slice(Projections,NbVertices),FShadedColors[0],dmDrawWithTransparency); + {$ENDIF} end else begin @@ -790,10 +829,19 @@ function TBGRARenderer3D.RenderFace(var ADescription: TFaceRenderingDescription; end else begin if FOptions.PerspectiveMode = pmLinearMapping then - FRenderSurface.FillPolyLinearColor({$IFDEF BDS}SliceDynArray(Projections{$ELSE}slice(Projections{$ENDIF},NbVertices),{$IFDEF BDS}SliceDynArray(FShadedColors{$ELSE}slice(FShadedColors{$ENDIF},NbVertices)) + {$IFDEF BDS} + FRenderSurface.FillPolyLinearColor(slice(PHackArrayOfTPointF(Projections)^,NbVertices),slice(PHackArrayOfTBGRAPixel(FShadedColors)^,NbVertices)) + {$ELSE} + FRenderSurface.FillPolyLinearColor(slice(Projections,NbVertices),slice(FShadedColors,NbVertices)) + {$ENDIF} else - BGRAPolygonAliased.PolygonPerspectiveColorGradientAliased(FRenderSurface, {$IFDEF BDS}SliceDynArray(Projections{$ELSE}slice(Projections{$ENDIF},NbVertices), - {$IFDEF BDS}SliceDynArray(FDepths{$ELSE}slice(FDepths{$ENDIF},NbVertices), {$IFDEF BDS}SliceDynArray(FShadedColors{$ELSE}slice(FShadedColors{$ENDIF},NbVertices),True,FZBuffer); + {$IFDEF BDS} + BGRAPolygonAliased.PolygonPerspectiveColorGradientAliased(FRenderSurface, slice(PHackArrayOfTPointF(Projections)^,NbVertices), + slice(PHackArrayOfSingle(FDepths)^,NbVertices), slice(PHackArrayOfTBGRAPixel(FShadedColors)^,NbVertices),True,FZBuffer); + {$ELSE} + BGRAPolygonAliased.PolygonPerspectiveColorGradientAliased(FRenderSurface, slice(Projections,NbVertices), + slice(FDepths,NbVertices), slice(FShadedColors,NbVertices),True,FZBuffer); + {$ENDIF} end; end; end; @@ -825,23 +873,47 @@ function TBGRARenderer3D.RenderFace(var ADescription: TFaceRenderingDescription; if noLighting then begin if FOptions.PerspectiveMode <> pmLinearMapping then - FRenderSurface.FillPolyPerspectiveMapping({$IFDEF BDS}SliceDynArray(Projections{$ELSE}slice(Projections{$ENDIF},NbVertices), - {$IFDEF BDS}SliceDynArray(FDepths{$ELSE}slice(FDepths{$ENDIF},NbVertices),Texture,{$IFDEF BDS}SliceDynArray(TexCoords{$ELSE}slice(TexCoords{$ENDIF},NbVertices), + {$IFDEF BDS} + FRenderSurface.FillPolyPerspectiveMapping(slice(PHackArrayOfTPointF(Projections)^,NbVertices), + slice(PHackArrayOfSingle(FDepths)^,NbVertices),Texture,slice(PHackArrayOfTPointF(TexCoords)^,NbVertices), + FOptions.TextureInterpolation, FZBuffer) + {$ELSE} + FRenderSurface.FillPolyPerspectiveMapping(slice(Projections,NbVertices), + slice(FDepths,NbVertices),Texture,slice(TexCoords,NbVertices), FOptions.TextureInterpolation, FZBuffer) + {$ENDIF} else - FRenderSurface.FillPolyLinearMapping({$IFDEF BDS}SliceDynArray(Projections{$ELSE}slice(Projections{$ENDIF},NbVertices), - Texture,{$IFDEF BDS}SliceDynArray(TexCoords{$ELSE}slice(TexCoords{$ENDIF},NbVertices),FOptions.TextureInterpolation); + {$IFDEF BDS} + FRenderSurface.FillPolyLinearMapping(slice(PHackArrayOfTPointF(Projections)^,NbVertices), + Texture,slice(PHackArrayOfTPointF(TexCoords)^,NbVertices),FOptions.TextureInterpolation); + {$ELSE} + FRenderSurface.FillPolyLinearMapping(slice(Projections,NbVertices), + Texture,slice(TexCoords,NbVertices),FOptions.TextureInterpolation); + {$ENDIF} end else begin if FOptions.PerspectiveMode <> pmLinearMapping then + {$IFDEF BDS} FRenderSurface.FillPolyPerspectiveMappingLightness( - {$IFDEF BDS}SliceDynArray(Projections{$ELSE}slice(Projections{$ENDIF},NbVertices),{$IFDEF BDS}SliceDynArray(FDepths{$ELSE}slice(FDepths{$ENDIF},NbVertices),Texture, - {$IFDEF BDS}SliceDynArray(TexCoords{$ELSE}slice(TexCoords{$ENDIF},NbVertices),{$IFDEF BDS}SliceDynArray(FLightings{$ELSE}slice(FLightings{$ENDIF},NbVertices), + slice(PHackArrayOfTPointF(Projections)^,NbVertices),slice(PHackArrayOfSingle(FDepths)^,NbVertices),Texture, + slice(PHackArrayOfTPointF(TexCoords)^,NbVertices),slice(PHackArrayOfBGRAWord(FLightings)^,NbVertices), FOptions.TextureInterpolation, FZBuffer) + {$ELSE} + FRenderSurface.FillPolyPerspectiveMappingLightness( + slice(Projections,NbVertices),slice(FDepths,NbVertices),Texture, + slice(TexCoords,NbVertices),slice(FLightings,NbVertices), + FOptions.TextureInterpolation, FZBuffer) + {$ENDIF} else + {$IFDEF BDS} + FRenderSurface.FillPolyLinearMappingLightness( + slice(PHackArrayOfTPointF(Projections)^,NbVertices),Texture,slice(PHackArrayOfTPointF(TexCoords)^,NbVertices), + slice(PHackArrayOfBGRAWord(FLightings)^,NbVertices),FOptions.TextureInterpolation); + {$ELSE} FRenderSurface.FillPolyLinearMappingLightness( - {$IFDEF BDS}SliceDynArray(Projections{$ELSE}slice(Projections{$ENDIF},NbVertices),Texture,{$IFDEF BDS}SliceDynArray(TexCoords{$ELSE}slice(TexCoords{$ENDIF},NbVertices), - {$IFDEF BDS}SliceDynArray(FLightings{$ELSE}slice(FLightings{$ENDIF},NbVertices),FOptions.TextureInterpolation); + slice(Projections,NbVertices),Texture,slice(TexCoords,NbVertices), + slice(FLightings,NbVertices),FOptions.TextureInterpolation); + {$ENDIF} end; end else diff --git a/bgrascene3d.pas b/bgrascene3d.pas index 71c8b50..068802d 100644 --- a/bgrascene3d.pas +++ b/bgrascene3d.pas @@ -933,7 +933,11 @@ TFaceVertexExtra = record faceExtra[i] := faceExtra[NbFaceVertices-1-i]; faceExtra[NbFaceVertices-1-i] := tempN; end; - face := result.AddFace({$IFDEF BDS}SliceDynArrayScene{$ELSE}slice{$ENDIF}(faceVertices,NbFaceVertices)); + {$IFDEF BDS} + face := result.AddFace(slice(PHackArrayOfIBGRAVertex3D(faceVertices)^,NbFaceVertices)); + {$ELSE} + face := result.AddFace(slice(faceVertices,NbFaceVertices)); + {$ENDIF} for i := 0 to NbFaceVertices-1 do begin face.SetNormal(i, faceExtra[i].normal); @@ -1372,7 +1376,7 @@ procedure TBGRAScene3D.DoRender; if not FRenderer.HandlesFaceCulling then begin - if not IsPolyVisible({$IFDEF BDS}SliceDynArray(faceDesc.Projections{$ELSE}slice(faceDesc.Projections{$ENDIF},VCount)) then + if not IsPolyVisible({$IFDEF BDS}slice(PHackArrayOfTPointF(faceDesc.Projections)^{$ELSE}slice(faceDesc.Projections{$ENDIF},VCount)) then begin if not Biface then exit; NegNormals := True; diff --git a/bgrascenetypes.pas b/bgrascenetypes.pas index 0ceca5b..d4fc022 100644 --- a/bgrascenetypes.pas +++ b/bgrascenetypes.pas @@ -592,10 +592,11 @@ TFaceRenderingDescription = record Biface: boolean; NbVertices: Integer; - Projections: {$IFDEF BDS}arrayofTPointF{$ELSE}array of TPointF{$ENDIF}; - Colors: {$IFDEF BDS}arrayofTBGRAPixel{$ELSE}array of TBGRAPixel{$ENDIF}; - Positions3D, Normals3D: {$IFDEF BDS}arrayofTPoint3D_128{$ELSE}array of TPoint3D_128{$ENDIF}; - TexCoords: {$IFDEF BDS}arrayofTPointF{$ELSE}array of TPointF{$ENDIF}; + Projections: array of TPointF; + Colors: array of TBGRAPixel; + Positions3D, Normals3D: array of TPoint3D_128; + TexCoords: array of TPointF; + end; { TCustomRenderer3D } @@ -663,23 +664,12 @@ TBGRALight3D = class(TInterfacedObject,IBGRALight3D) end; {$IFDEF BDS}//# -function SliceDynArrayScene(rOpen : array of IBGRAVertex3D; Count : integer): arrayofIBGRAVertex3D; + THackArrayOfIBGRAVertex3D= array[0..MaxInt div SizeOf(IBGRAVertex3D)-1] of IBGRAVertex3D; + PHackArrayOfIBGRAVertex3D=^THackArrayOfIBGRAVertex3D; {$ENDIF} implementation -{$IFDEF BDS} -function SliceDynArrayScene(rOpen : array of IBGRAVertex3D; Count : integer): arrayofIBGRAVertex3D; -var - i : integer; - Open : arrayofIBGRAVertex3D; -begin - SetLength(Open, Length(rOpen)); - for i := 0 to High(rOpen) do - Open[i] := rOpen[i]; - Result := Copy(Open, 0, Count); -end; -{$ENDIF} { TCustomRenderer3D } function TCustomRenderer3D.GetProjectionDefined: boolean; diff --git a/bgrasse.pas b/bgrasse.pas index 3f70319..9abd224 100644 --- a/bgrasse.pas +++ b/bgrasse.pas @@ -94,8 +94,6 @@ interface {$ENDIF} function IsPoint3D_128_Zero(const v: TPoint3D_128): boolean; {$ifdef inline}inline;{$endif} - function SSESliceDynArray(rOpen : array of TPoint3D_128; Count : integer): arrayofTPoint3D_128; - var Add3D_Aligned : procedure (var dest: TPoint3D_128; {$IFDEF OBJ}constref{$ELSE}const{$ENDIF} src: TPoint3D_128); Normalize3D_128 : procedure (var v: TPoint3D_128); @@ -131,21 +129,16 @@ TMemoryBlockAlign128 = class {112} dummy: packed array[0..15]of byte; end; {128} +{$IFDEF BDS}//# + THackArrayOfTPoint3D_128= array[0..MaxInt div SizeOf(TPoint3D_128)-1] of TPoint3D_128; + PHackArrayOfTPoint3D_128=^THackArrayOfTPoint3D_128; +{$ENDIF} + + const ExtendedLightingContextSize = 128; implementation -function SSESliceDynArray(rOpen : array of TPoint3D_128; Count : integer): arrayofTPoint3D_128; -var - i : integer; - Open : arrayofTPoint3D_128; -begin - SetLength(Open, Length(rOpen)); - for i := 0 to High(rOpen) do - Open[i] := rOpen[i]; - Result := Copy(Open, 0, Count); -end; - function ToPoint3D(const point3D_128: TPoint3D_128): TPoint3D;{$ifdef inline}inline;{$endif}overload; begin result.x := point3D_128.x;