fixed MM renderer,
MM renderer classes are now derived from non-MM ones
This commit is contained in:
parent
5b7a3b1118
commit
7264e2ac56
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
Flame screensaver Copyright (C) 2002 Ronald Hordijk
|
Flame screensaver Copyright (C) 2002 Ronald Hordijk
|
||||||
Apophysis Copyright (C) 2001-2004 Mark Townsend
|
Apophysis Copyright (C) 2001-2004 Mark Townsend
|
||||||
Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Boris, Peter Sdobnov
|
Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
Flame screensaver Copyright (C) 2002 Ronald Hordijk
|
Flame screensaver Copyright (C) 2002 Ronald Hordijk
|
||||||
Apophysis Copyright (C) 2001-2004 Mark Townsend
|
Apophysis Copyright (C) 2001-2004 Mark Townsend
|
||||||
Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Boris, Peter Sdobnov
|
Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -23,28 +23,28 @@ interface
|
|||||||
|
|
||||||
uses
|
uses
|
||||||
Windows, Forms, Graphics, ImageMaker,
|
Windows, Forms, Graphics, ImageMaker,
|
||||||
Render, xform, Controlpoint;
|
Render, xform, Controlpoint;
|
||||||
|
|
||||||
type
|
type
|
||||||
TRenderer64 = class(TBaseRenderer)
|
TRenderer64 = class(TBaseRenderer)
|
||||||
private
|
|
||||||
oversample: integer;
|
|
||||||
|
|
||||||
BucketWidth, BucketHeight: integer;
|
|
||||||
BucketSize: integer;
|
|
||||||
|
|
||||||
gutter_width: Integer;
|
|
||||||
max_gutter_width: Integer;
|
|
||||||
|
|
||||||
sample_density: extended;
|
|
||||||
|
|
||||||
Buckets: TBucketArray;
|
|
||||||
ColorMap: TColorMapArray;
|
|
||||||
|
|
||||||
|
protected
|
||||||
camX0, camX1, camY0, camY1, // camera bounds
|
camX0, camX1, camY0, camY1, // camera bounds
|
||||||
camW, camH, // camera sizes
|
camW, camH, // camera sizes
|
||||||
bws, bhs, cosa, sina, rcX, rcY: double;
|
bws, bhs, cosa, sina, rcX, rcY: double;
|
||||||
ppux, ppuy: extended;
|
ppux, ppuy: extended;
|
||||||
|
|
||||||
|
BucketWidth, BucketHeight: int64;
|
||||||
|
BucketSize: int64;
|
||||||
|
|
||||||
|
sample_density: extended;
|
||||||
|
oversample: integer;
|
||||||
|
gutter_width: Integer;
|
||||||
|
max_gutter_width: Integer;
|
||||||
|
|
||||||
|
Buckets: TBucketArray;
|
||||||
|
ColorMap: TColorMapArray;
|
||||||
|
|
||||||
FImageMaker: TImageMaker;
|
FImageMaker: TImageMaker;
|
||||||
|
|
||||||
procedure InitValues;
|
procedure InitValues;
|
||||||
@ -57,7 +57,7 @@ type
|
|||||||
|
|
||||||
procedure SetPixels;
|
procedure SetPixels;
|
||||||
|
|
||||||
private
|
protected
|
||||||
PropTable: array[0..SUB_BATCH_SIZE] of TXform;
|
PropTable: array[0..SUB_BATCH_SIZE] of TXform;
|
||||||
finalXform: TXform;
|
finalXform: TXform;
|
||||||
UseFinalXform: boolean;
|
UseFinalXform: boolean;
|
||||||
@ -216,8 +216,10 @@ begin
|
|||||||
try
|
try
|
||||||
SetLength(buckets, BucketSize);
|
SetLength(buckets, BucketSize);
|
||||||
except
|
except
|
||||||
on EOutOfMemory do
|
on EOutOfMemory do begin
|
||||||
Application.MessageBox('Error: not enough memory for this render!', 'Apophysis', 48)
|
Application.MessageBox('Error: not enough memory for this render!', 'Apophysis', 48);
|
||||||
|
FStop := true;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// share the buffer with imagemaker
|
// share the buffer with imagemaker
|
||||||
@ -241,7 +243,6 @@ var
|
|||||||
i: integer;
|
i: integer;
|
||||||
nsamples: Int64;
|
nsamples: Int64;
|
||||||
nrbatches: Integer;
|
nrbatches: Integer;
|
||||||
//points: TPointsArray;
|
|
||||||
IterateBatchProc: procedure of object;
|
IterateBatchProc: procedure of object;
|
||||||
begin
|
begin
|
||||||
Prepare;
|
Prepare;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
Flame screensaver Copyright (C) 2002 Ronald Hordijk
|
Flame screensaver Copyright (C) 2002 Ronald Hordijk
|
||||||
Apophysis Copyright (C) 2001-2004 Mark Townsend
|
Apophysis Copyright (C) 2001-2004 Mark Townsend
|
||||||
Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Boris, Peter Sdobnov
|
Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -22,34 +22,32 @@ unit Render64MT;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Windows, Classes, Graphics,
|
Windows, Forms, Classes, Graphics,
|
||||||
Render, Controlpoint, ImageMaker, BucketFillerthread;
|
Render, Controlpoint, ImageMaker, BucketFillerthread;
|
||||||
|
|
||||||
type
|
type
|
||||||
TRenderer64MT = class(TBaseRenderer)
|
TRenderer64MT = class(TBaseRenderer)
|
||||||
private
|
|
||||||
oversample: Int64;
|
|
||||||
batchcounter: Integer;
|
|
||||||
FNrBatches: Int64;
|
|
||||||
|
|
||||||
BucketWidth: Int64;
|
protected
|
||||||
BucketHeight: Int64;
|
camX0, camX1, camY0, camY1, // camera bounds
|
||||||
|
camW, camH, // camera sizes
|
||||||
|
bws, bhs, cosa, sina, rcX, rcY: double;
|
||||||
|
ppux, ppuy: extended;
|
||||||
|
|
||||||
|
BucketWidth, BucketHeight: Int64;
|
||||||
BucketSize: Int64;
|
BucketSize: Int64;
|
||||||
|
|
||||||
|
sample_density: extended;
|
||||||
|
oversample: integer;
|
||||||
gutter_width: Integer;
|
gutter_width: Integer;
|
||||||
max_gutter_width: Integer;
|
max_gutter_width: Integer;
|
||||||
|
|
||||||
sample_density: extended;
|
batchcounter: Integer;
|
||||||
|
FNrBatches: Int64;
|
||||||
|
|
||||||
Buckets: TBucketArray;
|
Buckets: TBucketArray;
|
||||||
ColorMap: TColorMapArray;
|
ColorMap: TColorMapArray;
|
||||||
|
|
||||||
camX0, camX1, camY0, camY1, // camera bounds
|
|
||||||
camW, camH, // camera sizes
|
|
||||||
Xsize, Ysize: double;
|
|
||||||
bws, bhs, cosa, sina, rcX, rcY: double;
|
|
||||||
// bounds: array[0..3] of extended;
|
|
||||||
// size: array[0..1] of extended;
|
|
||||||
ppux, ppuy: extended;
|
|
||||||
FNrOfTreads: integer;
|
FNrOfTreads: integer;
|
||||||
WorkingThreads: array of TBucketFillerThread;
|
WorkingThreads: array of TBucketFillerThread;
|
||||||
CriticalSection: TRTLCriticalSection;
|
CriticalSection: TRTLCriticalSection;
|
||||||
@ -119,7 +117,7 @@ var
|
|||||||
scale: double;
|
scale: double;
|
||||||
t0, t1: double;
|
t0, t1: double;
|
||||||
t2, t3: double;
|
t2, t3: double;
|
||||||
corner_x, corner_y: double;
|
corner_x, corner_y, Xsize, Ysize: double;
|
||||||
shift: Integer;
|
shift: Integer;
|
||||||
begin
|
begin
|
||||||
scale := power(2, fcp.zoom);
|
scale := power(2, fcp.zoom);
|
||||||
@ -184,6 +182,14 @@ begin
|
|||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
constructor TRenderer64MT.Create;
|
||||||
|
begin
|
||||||
|
inherited Create;
|
||||||
|
|
||||||
|
FImageMaker := TImageMaker.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
destructor TRenderer64MT.Destroy;
|
destructor TRenderer64MT.Destroy;
|
||||||
begin
|
begin
|
||||||
@ -210,8 +216,14 @@ begin
|
|||||||
Bucketwidth := oversample * fcp.width + 2 * max_gutter_width;
|
Bucketwidth := oversample * fcp.width + 2 * max_gutter_width;
|
||||||
BucketSize := BucketWidth * BucketHeight;
|
BucketSize := BucketWidth * BucketHeight;
|
||||||
|
|
||||||
if high(buckets) <> (BucketSize - 1) then begin
|
if high(buckets) <> (BucketSize - 1) then
|
||||||
|
try
|
||||||
SetLength(buckets, BucketSize);
|
SetLength(buckets, BucketSize);
|
||||||
|
except
|
||||||
|
on EOutOfMemory do begin
|
||||||
|
Application.MessageBox('Error: not enough memory for this render!', 'Apophysis', 48);
|
||||||
|
FStop := true;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// share the buffer with imagemaker
|
// share the buffer with imagemaker
|
||||||
@ -238,7 +250,7 @@ var
|
|||||||
begin
|
begin
|
||||||
nsamples := Round(sample_density * bucketSize / (oversample * oversample));
|
nsamples := Round(sample_density * bucketSize / (oversample * oversample));
|
||||||
FNrBatches := Round(nsamples / (fcp.nbatches * SUB_BATCH_SIZE));
|
FNrBatches := Round(nsamples / (fcp.nbatches * SUB_BATCH_SIZE));
|
||||||
batchcounter := 0;
|
batchcounter := 0;
|
||||||
Randomize;
|
Randomize;
|
||||||
|
|
||||||
InitializeCriticalSection(CriticalSection);
|
InitializeCriticalSection(CriticalSection);
|
||||||
@ -295,14 +307,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
constructor TRenderer64MT.Create;
|
|
||||||
begin
|
|
||||||
inherited Create;
|
|
||||||
|
|
||||||
FImageMaker := TImageMaker.Create;
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
procedure TRenderer64MT.Render;
|
procedure TRenderer64MT.Render;
|
||||||
begin
|
begin
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
Flame screensaver Copyright (C) 2002 Ronald Hordijk
|
Flame screensaver Copyright (C) 2002 Ronald Hordijk
|
||||||
Apophysis Copyright (C) 2001-2004 Mark Townsend
|
Apophysis Copyright (C) 2001-2004 Mark Townsend
|
||||||
Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Boris, Peter Sdobnov
|
Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -22,61 +22,31 @@ unit RenderMM;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Windows, Graphics,
|
Windows, Forms, Graphics,
|
||||||
Render, Controlpoint, ImageMaker, XForm;
|
Render64, Controlpoint, ImageMaker, XForm;
|
||||||
|
|
||||||
type
|
type
|
||||||
TRendererMM64 = class(TBaseRenderer)
|
TRendererMM64 = class(TRenderer64)
|
||||||
|
|
||||||
private
|
private
|
||||||
oversample: Integer;
|
image_Width, image_Height: Int64;
|
||||||
|
image_Center_X, image_Center_Y: double;
|
||||||
|
|
||||||
image_Width: Int64;
|
Slice, nrSlices: integer;
|
||||||
image_Height: Int64;
|
|
||||||
BucketWidth: Integer;
|
|
||||||
BucketHeight: Integer;
|
|
||||||
BucketSize: Integer;
|
|
||||||
gutter_width: Integer;
|
|
||||||
|
|
||||||
sample_density: extended;
|
|
||||||
|
|
||||||
Buckets: TBucketArray;
|
|
||||||
ColorMap: TColorMapArray;
|
|
||||||
|
|
||||||
camX0, camX1, camY0, camY1, // camera bounds
|
|
||||||
camW, camH, // camera sizes
|
|
||||||
bws, bhs, cosa, sina, rcX, rcY: double;
|
|
||||||
// bounds: array[0..3] of extended;
|
|
||||||
// size: array[0..1] of extended;
|
|
||||||
// FRotationCenter: array[0..1] of extended;
|
|
||||||
ppux, ppuy: extended;
|
|
||||||
nrSlices: int64;
|
|
||||||
Slice: int64;
|
|
||||||
FImageMaker: TImageMaker;
|
|
||||||
|
|
||||||
procedure InitValues;
|
procedure InitValues;
|
||||||
procedure InitBuffers;
|
procedure InitBuffers;
|
||||||
procedure ClearBuffers;
|
|
||||||
procedure ClearBuckets;
|
|
||||||
procedure CreateColorMap;
|
|
||||||
procedure CreateCamera;
|
procedure CreateCamera;
|
||||||
|
|
||||||
procedure AddPointsToBuckets(const points: TPointsArray);
|
|
||||||
procedure AddPointsToBucketsAngle(const points: TPointsArray);
|
|
||||||
|
|
||||||
procedure SetPixels;
|
|
||||||
protected
|
protected
|
||||||
function GetSlice: integer; override;
|
function GetSlice: integer; override;
|
||||||
function GetNrSlices: integer; override;
|
function GetNrSlices: integer; override;
|
||||||
|
|
||||||
public
|
public
|
||||||
constructor Create; override;
|
|
||||||
destructor Destroy; override;
|
|
||||||
|
|
||||||
function GetImage: TBitmap; override;
|
function GetImage: TBitmap; override;
|
||||||
procedure SaveImage(const FileName: String); override;
|
procedure SaveImage(const FileName: String); override;
|
||||||
|
|
||||||
procedure Render; override;
|
procedure Render; override;
|
||||||
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
@ -86,25 +56,6 @@ uses
|
|||||||
|
|
||||||
{ TRendererMM64 }
|
{ TRendererMM64 }
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
procedure TRendererMM64.ClearBuckets;
|
|
||||||
var
|
|
||||||
i: integer;
|
|
||||||
begin
|
|
||||||
for i := 0 to BucketSize - 1 do begin
|
|
||||||
buckets[i].Red := 0;
|
|
||||||
buckets[i].Green := 0;
|
|
||||||
buckets[i].Blue := 0;
|
|
||||||
buckets[i].Count := 0;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
procedure TRendererMM64.ClearBuffers;
|
|
||||||
begin
|
|
||||||
ClearBuckets;
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
procedure TRendererMM64.CreateCamera;
|
procedure TRendererMM64.CreateCamera;
|
||||||
var
|
var
|
||||||
@ -123,24 +74,12 @@ begin
|
|||||||
t1 := gutter_width / (oversample * ppuy);
|
t1 := gutter_width / (oversample * ppuy);
|
||||||
corner_x := fcp.center[0] - image_width / ppux / 2.0;
|
corner_x := fcp.center[0] - image_width / ppux / 2.0;
|
||||||
corner_y := fcp.center[1] - image_height / ppuy / 2.0;
|
corner_y := fcp.center[1] - image_height / ppuy / 2.0;
|
||||||
{
|
|
||||||
bounds[0] := corner0 - t0;
|
|
||||||
bounds[1] := corner1 - t1 + shift;
|
|
||||||
bounds[2] := corner0 + image_width / ppux + t0;
|
|
||||||
bounds[3] := corner1 + image_height / ppuy + t1; //+ shift;
|
|
||||||
if abs(bounds[2] - bounds[0]) > 0.01 then
|
|
||||||
size[0] := 1.0 / (bounds[2] - bounds[0])
|
|
||||||
else
|
|
||||||
size[0] := 1;
|
|
||||||
if abs(bounds[3] - bounds[1]) > 0.01 then
|
|
||||||
size[1] := 1.0 / (bounds[3] - bounds[1])
|
|
||||||
else
|
|
||||||
size[1] := 1;
|
|
||||||
}
|
|
||||||
camX0 := corner_x - t0;
|
camX0 := corner_x - t0;
|
||||||
camY0 := corner_y - t1 + shift;
|
camY0 := corner_y - t1 + shift;
|
||||||
camX1 := corner_x + image_width / ppux / 2.0;
|
camX1 := corner_x + image_width / ppux + t0;
|
||||||
camY1 := corner_y + image_height / ppuy + t1; //+ shift;
|
camY1 := corner_y + image_height / ppuy + t1; //+ shift;
|
||||||
|
|
||||||
camW := camX1 - camX0;
|
camW := camX1 - camX0;
|
||||||
if abs(camW) > 0.01 then
|
if abs(camW) > 0.01 then
|
||||||
Xsize := 1.0 / camW
|
Xsize := 1.0 / camW
|
||||||
@ -158,32 +97,11 @@ begin
|
|||||||
begin
|
begin
|
||||||
cosa := cos(FCP.FAngle);
|
cosa := cos(FCP.FAngle);
|
||||||
sina := sin(FCP.FAngle);
|
sina := sin(FCP.FAngle);
|
||||||
rcX := FCP.Center[0]*(1 - cosa) - FCP.Center[1]*sina - camX0;
|
rcX := image_Center_X*(1 - cosa) - image_Center_X*sina - camX0;
|
||||||
rcY := FCP.Center[1]*(1 - cosa) + FCP.Center[0]*sina - camY0;
|
rcY := image_Center_Y*(1 - cosa) + image_Center_Y*sina - camY0;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
procedure TRendererMM64.CreateColorMap;
|
|
||||||
var
|
|
||||||
i: integer;
|
|
||||||
begin
|
|
||||||
for i := 0 to 255 do begin
|
|
||||||
ColorMap[i].Red := (fcp.CMap[i][0] * fcp.white_level) div 256;
|
|
||||||
ColorMap[i].Green := (fcp.CMap[i][1] * fcp.white_level) div 256;
|
|
||||||
ColorMap[i].Blue := (fcp.CMap[i][2] * fcp.white_level) div 256;
|
|
||||||
// cmap[i][3] := fcp.white_level;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
destructor TRendererMM64.Destroy;
|
|
||||||
begin
|
|
||||||
FImageMaker.Free;
|
|
||||||
|
|
||||||
inherited;
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
function TRendererMM64.GetImage: TBitmap;
|
function TRendererMM64.GetImage: TBitmap;
|
||||||
begin
|
begin
|
||||||
@ -199,8 +117,14 @@ begin
|
|||||||
Bucketwidth := oversample * image_width + 2 * gutter_width;
|
Bucketwidth := oversample * image_width + 2 * gutter_width;
|
||||||
BucketSize := BucketWidth * BucketHeight;
|
BucketSize := BucketWidth * BucketHeight;
|
||||||
|
|
||||||
if high(buckets) <> (BucketSize - 1) then begin
|
if high(buckets) <> (BucketSize - 1) then
|
||||||
|
try
|
||||||
SetLength(buckets, BucketSize);
|
SetLength(buckets, BucketSize);
|
||||||
|
except
|
||||||
|
on EOutOfMemory do begin
|
||||||
|
Application.MessageBox('Error: not enough memory for this render!', 'Apophysis', 48);
|
||||||
|
FStop := true;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// share the buffer with imagemaker
|
// share the buffer with imagemaker
|
||||||
@ -214,7 +138,6 @@ begin
|
|||||||
image_Width := fcp.Width;
|
image_Width := fcp.Width;
|
||||||
|
|
||||||
CreateCamera;
|
CreateCamera;
|
||||||
|
|
||||||
InitBuffers;
|
InitBuffers;
|
||||||
|
|
||||||
CreateColorMap;
|
CreateColorMap;
|
||||||
@ -222,111 +145,6 @@ begin
|
|||||||
fcp.Prepare;
|
fcp.Prepare;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
procedure TRendererMM64.AddPointsToBuckets(const points: TPointsArray);
|
|
||||||
var
|
|
||||||
i: integer;
|
|
||||||
px, py: double;
|
|
||||||
// R: double;
|
|
||||||
// V1, v2, v3: integer;
|
|
||||||
Bucket: PBucket;
|
|
||||||
MapColor: PColorMapColor;
|
|
||||||
begin
|
|
||||||
for i := SUB_BATCH_SIZE - 1 downto 0 do begin
|
|
||||||
// if FStop then Exit;
|
|
||||||
|
|
||||||
px := points[i].x - camX0;
|
|
||||||
if (px < 0) or (px > camW) then continue;
|
|
||||||
py := points[i].y - camY0;
|
|
||||||
if (py < 0) or (py > camH) then continue;
|
|
||||||
|
|
||||||
Bucket := @buckets[Round(bws * px) + Round(bhs * py) * BucketWidth];
|
|
||||||
MapColor := @ColorMap[Round(points[i].c * 255)];
|
|
||||||
|
|
||||||
Inc(Bucket.Red, MapColor.Red);
|
|
||||||
Inc(Bucket.Green, MapColor.Green);
|
|
||||||
Inc(Bucket.Blue, MapColor.Blue);
|
|
||||||
Inc(Bucket.Count);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
procedure TRendererMM64.AddPointsToBucketsAngle(const points: TPointsArray);
|
|
||||||
var
|
|
||||||
i: integer;
|
|
||||||
px, py: double;
|
|
||||||
Bucket: PBucket;
|
|
||||||
MapColor: PColorMapColor;
|
|
||||||
begin
|
|
||||||
for i := SUB_BATCH_SIZE - 1 downto 0 do begin
|
|
||||||
// if FStop then Exit;
|
|
||||||
|
|
||||||
px := points[i].x * cosa + points[i].y * sina + rcX;
|
|
||||||
if (px < 0) or (px > camW) then continue;
|
|
||||||
py := points[i].y * cosa - points[i].x * sina + rcY;
|
|
||||||
if (py < 0) or (py > camH) then continue;
|
|
||||||
|
|
||||||
Bucket := @buckets[Round(bws * px) + Round(bhs * py) * BucketWidth];
|
|
||||||
MapColor := @ColorMap[Round(points[i].c * 255)];
|
|
||||||
|
|
||||||
Inc(Bucket.Red, MapColor.Red);
|
|
||||||
Inc(Bucket.Green, MapColor.Green);
|
|
||||||
Inc(Bucket.Blue, MapColor.Blue);
|
|
||||||
Inc(Bucket.Count);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
procedure TRendererMM64.SetPixels;
|
|
||||||
var
|
|
||||||
i: integer;
|
|
||||||
nsamples: Int64;
|
|
||||||
nrbatches: Integer;
|
|
||||||
points: TPointsArray;
|
|
||||||
begin
|
|
||||||
SetLength(Points, SUB_BATCH_SIZE);
|
|
||||||
|
|
||||||
nsamples := Round(sample_density * bucketSize / (oversample * oversample));
|
|
||||||
nrbatches := Round(nsamples / (fcp.nbatches * SUB_BATCH_SIZE));
|
|
||||||
Randomize;
|
|
||||||
|
|
||||||
for i := 0 to nrbatches do begin
|
|
||||||
if FStop then
|
|
||||||
Exit;
|
|
||||||
|
|
||||||
if (i and $F = 0) then
|
|
||||||
if nrbatches > 0 then
|
|
||||||
Progress(i / nrbatches)
|
|
||||||
else
|
|
||||||
Progress(0);
|
|
||||||
|
|
||||||
// generate points
|
|
||||||
{
|
|
||||||
case Compatibility of
|
|
||||||
0: fcp.iterate_Old(SUB_BATCH_SIZE, points);
|
|
||||||
1: fcp.iterateXYC(SUB_BATCH_SIZE, points);
|
|
||||||
end;
|
|
||||||
}
|
|
||||||
fcp.IterateXYC(SUB_BATCH_SIZE, points);
|
|
||||||
|
|
||||||
if FCP.FAngle = 0 then
|
|
||||||
AddPointsToBuckets(points)
|
|
||||||
else
|
|
||||||
AddPointsToBucketsAngle(points);
|
|
||||||
end;
|
|
||||||
|
|
||||||
Progress(1);
|
|
||||||
end;
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
constructor TRendererMM64.Create;
|
|
||||||
begin
|
|
||||||
inherited Create;
|
|
||||||
|
|
||||||
FImageMaker := TImageMaker.Create;
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
procedure TRendererMM64.Render;
|
procedure TRendererMM64.Render;
|
||||||
const
|
const
|
||||||
@ -338,8 +156,8 @@ var
|
|||||||
begin
|
begin
|
||||||
FStop := False;
|
FStop := False;
|
||||||
|
|
||||||
// FRotationCenter[0] := fcp.center[0];
|
image_Center_X := fcp.center[0];
|
||||||
// FRotationCenter[1] := fcp.center[1];
|
image_Center_Y := fcp.center[1];
|
||||||
|
|
||||||
image_height := fcp.Height;
|
image_height := fcp.Height;
|
||||||
image_Width := fcp.Width;
|
image_Width := fcp.Width;
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
Flame screensaver Copyright (C) 2002 Ronald Hordijk
|
Flame screensaver Copyright (C) 2002 Ronald Hordijk
|
||||||
Apophysis Copyright (C) 2001-2004 Mark Townsend
|
Apophysis Copyright (C) 2001-2004 Mark Townsend
|
||||||
Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Boris, Peter Sdobnov
|
Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov
|
||||||
|
|
||||||
This program is free software; you can redistribute it and/or modify
|
This program is free software; you can redistribute it and/or modify
|
||||||
it under the terms of the GNU General Public License as published by
|
it under the terms of the GNU General Public License as published by
|
||||||
@ -23,75 +23,32 @@ interface
|
|||||||
|
|
||||||
uses
|
uses
|
||||||
Windows, Graphics,
|
Windows, Graphics,
|
||||||
Render, Controlpoint, ImageMaker, BucketFillerThread, XForm;
|
Render64MT, Controlpoint, ImageMaker, BucketFillerThread, XForm;
|
||||||
|
|
||||||
type
|
type
|
||||||
TRendererMM64_MT = class(TBaseRenderer)
|
TRendererMM64_MT = class(TRenderer64MT)
|
||||||
|
|
||||||
private
|
private
|
||||||
oversample: Integer;
|
image_Width, image_Height: integer;
|
||||||
|
image_Center_X, image_Center_Y: double;
|
||||||
|
|
||||||
image_Width, image_Height: integer; // we're not going to render images
|
Slice, nrSlices: integer;
|
||||||
BucketWidth, BucketHeight: integer; // more then 2^32 pixels wide, are we? :)
|
|
||||||
BucketSize: Integer;
|
|
||||||
gutter_width: Integer;
|
|
||||||
|
|
||||||
sample_density: extended;
|
|
||||||
|
|
||||||
Buckets: TBucketArray;
|
|
||||||
ColorMap: TColorMapArray;
|
|
||||||
|
|
||||||
camX0, camX1, camY0, camY1, // camera bounds
|
|
||||||
camW, camH, // camera sizes
|
|
||||||
bws, bhs, cosa, sina, rcX, rcY: double;
|
|
||||||
// bounds: array[0..3] of extended;
|
|
||||||
// size: array[0..1] of extended;
|
|
||||||
// FRotationCenter: array[0..1] of extended;
|
|
||||||
|
|
||||||
ppux, ppuy: extended;
|
|
||||||
nrSlices: int64;
|
|
||||||
Slice: int64;
|
|
||||||
FImageMaker: TImageMaker;
|
|
||||||
FNrBatches: int64;
|
|
||||||
batchcounter: Integer;
|
|
||||||
|
|
||||||
FNrOfTreads: integer;
|
|
||||||
WorkingThreads: array of TBucketFillerThread;
|
|
||||||
CriticalSection: TRTLCriticalSection;
|
|
||||||
|
|
||||||
procedure InitValues;
|
procedure InitValues;
|
||||||
procedure InitBuffers;
|
procedure InitBuffers;
|
||||||
procedure ClearBuffers;
|
|
||||||
procedure ClearBuckets;
|
|
||||||
procedure CreateColorMap;
|
|
||||||
procedure CreateCamera;
|
procedure CreateCamera;
|
||||||
|
|
||||||
procedure AddPointsToBuckets(const points: TPointsArray);
|
|
||||||
procedure AddPointsToBucketsAngle(const points: TPointsArray);
|
|
||||||
|
|
||||||
procedure SetPixels;
|
|
||||||
procedure SetPixelsMT;
|
|
||||||
procedure SetNrOfTreads(const Value: integer);
|
|
||||||
|
|
||||||
function NewThread: TBucketFillerThread;
|
|
||||||
protected
|
protected
|
||||||
function GetSlice: integer; override;
|
function GetSlice: integer; override;
|
||||||
function GetNrSlices: integer; override;
|
function GetNrSlices: integer; override;
|
||||||
|
|
||||||
public
|
public
|
||||||
constructor Create; override;
|
|
||||||
destructor Destroy; override;
|
|
||||||
|
|
||||||
function GetImage: TBitmap; override;
|
function GetImage: TBitmap; override;
|
||||||
procedure SaveImage(const FileName: String); override;
|
|
||||||
|
|
||||||
procedure Render; override;
|
procedure Render; override;
|
||||||
procedure Stop; override;
|
procedure Stop; override;
|
||||||
|
|
||||||
procedure Pause(paused: boolean); override;
|
procedure Pause(paused: boolean); override;
|
||||||
|
|
||||||
property NrOfTreads: integer
|
|
||||||
read FNrOfTreads
|
|
||||||
write SetNrOfTreads;
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
@ -101,25 +58,6 @@ uses
|
|||||||
|
|
||||||
{ TRendererMM64_MT }
|
{ TRendererMM64_MT }
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
procedure TRendererMM64_MT.ClearBuckets;
|
|
||||||
var
|
|
||||||
i: integer;
|
|
||||||
begin
|
|
||||||
for i := 0 to BucketSize - 1 do begin
|
|
||||||
buckets[i].Red := 0;
|
|
||||||
buckets[i].Green := 0;
|
|
||||||
buckets[i].Blue := 0;
|
|
||||||
buckets[i].Count := 0;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
procedure TRendererMM64_MT.ClearBuffers;
|
|
||||||
begin
|
|
||||||
ClearBuckets;
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
procedure TRendererMM64_MT.CreateCamera;
|
procedure TRendererMM64_MT.CreateCamera;
|
||||||
var
|
var
|
||||||
@ -160,32 +98,11 @@ begin
|
|||||||
begin
|
begin
|
||||||
cosa := cos(FCP.FAngle);
|
cosa := cos(FCP.FAngle);
|
||||||
sina := sin(FCP.FAngle);
|
sina := sin(FCP.FAngle);
|
||||||
rcX := FCP.Center[0]*(1 - cosa) - FCP.Center[1]*sina - camX0;
|
rcX := image_Center_X*(1 - cosa) - image_Center_X*sina - camX0;
|
||||||
rcY := FCP.Center[1]*(1 - cosa) + FCP.Center[0]*sina - camY0;
|
rcY := image_Center_Y*(1 - cosa) + image_Center_Y*sina - camY0;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
procedure TRendererMM64_MT.CreateColorMap;
|
|
||||||
var
|
|
||||||
i: integer;
|
|
||||||
begin
|
|
||||||
for i := 0 to 255 do begin
|
|
||||||
ColorMap[i].Red := (fcp.CMap[i][0] * fcp.white_level) div 256;
|
|
||||||
ColorMap[i].Green := (fcp.CMap[i][1] * fcp.white_level) div 256;
|
|
||||||
ColorMap[i].Blue := (fcp.CMap[i][2] * fcp.white_level) div 256;
|
|
||||||
// cmap[i][3] := fcp.white_level;
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
destructor TRendererMM64_MT.Destroy;
|
|
||||||
begin
|
|
||||||
FImageMaker.Free;
|
|
||||||
|
|
||||||
inherited;
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
function TRendererMM64_MT.GetImage: TBitmap;
|
function TRendererMM64_MT.GetImage: TBitmap;
|
||||||
begin
|
begin
|
||||||
@ -215,111 +132,7 @@ begin
|
|||||||
image_height := fcp.Height;
|
image_height := fcp.Height;
|
||||||
image_Width := fcp.Width;
|
image_Width := fcp.Width;
|
||||||
|
|
||||||
CreateCamera;
|
inherited;
|
||||||
|
|
||||||
InitBuffers;
|
|
||||||
|
|
||||||
CreateColorMap;
|
|
||||||
|
|
||||||
fcp.Prepare;
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
procedure TRendererMM64_MT.AddPointsToBuckets(const points: TPointsArray);
|
|
||||||
var
|
|
||||||
i: integer;
|
|
||||||
px, py: double;
|
|
||||||
// R: double;
|
|
||||||
// V1, v2, v3: integer;
|
|
||||||
Bucket: PBucket;
|
|
||||||
MapColor: PColorMapColor;
|
|
||||||
begin
|
|
||||||
for i := SUB_BATCH_SIZE - 1 downto 0 do begin
|
|
||||||
// if FStop then Exit;
|
|
||||||
|
|
||||||
px := points[i].x - camX0;
|
|
||||||
if (px < 0) or (px > camW) then continue;
|
|
||||||
py := points[i].y - camY0;
|
|
||||||
if (py < 0) or (py > camH) then continue;
|
|
||||||
|
|
||||||
Bucket := @buckets[Round(bws * px) + Round(bhs * py) * BucketWidth];
|
|
||||||
MapColor := @ColorMap[Round(points[i].c * 255)];
|
|
||||||
|
|
||||||
Inc(Bucket.Red, MapColor.Red);
|
|
||||||
Inc(Bucket.Green, MapColor.Green);
|
|
||||||
Inc(Bucket.Blue, MapColor.Blue);
|
|
||||||
Inc(Bucket.Count);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
procedure TRendererMM64_MT.AddPointsToBucketsAngle(const points: TPointsArray);
|
|
||||||
var
|
|
||||||
i: integer;
|
|
||||||
px, py: double;
|
|
||||||
Bucket: PBucket;
|
|
||||||
MapColor: PColorMapColor;
|
|
||||||
begin
|
|
||||||
for i := SUB_BATCH_SIZE - 1 downto 0 do begin
|
|
||||||
// if FStop then Exit;
|
|
||||||
|
|
||||||
px := points[i].x * cosa + points[i].y * sina + rcX;
|
|
||||||
if (px < 0) or (px > camW) then continue;
|
|
||||||
py := points[i].y * cosa - points[i].x * sina + rcY;
|
|
||||||
if (py < 0) or (py > camH) then continue;
|
|
||||||
|
|
||||||
Bucket := @buckets[Round(bws * px) + Round(bhs * py) * BucketWidth];
|
|
||||||
MapColor := @ColorMap[Round(points[i].c * 255)];
|
|
||||||
|
|
||||||
Inc(Bucket.Red, MapColor.Red);
|
|
||||||
Inc(Bucket.Green, MapColor.Green);
|
|
||||||
Inc(Bucket.Blue, MapColor.Blue);
|
|
||||||
Inc(Bucket.Count);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
procedure TRendererMM64_MT.SetPixels;
|
|
||||||
var
|
|
||||||
i: integer;
|
|
||||||
nsamples: Int64;
|
|
||||||
nrbatches: Integer;
|
|
||||||
points: TPointsArray;
|
|
||||||
AddPointsProc: procedure (const points: TPointsArray) of object;
|
|
||||||
begin
|
|
||||||
if FCP.FAngle = 0 then
|
|
||||||
AddPointsProc := AddPointsToBuckets
|
|
||||||
else
|
|
||||||
AddPointsProc := AddPointsToBucketsAngle;
|
|
||||||
|
|
||||||
SetLength(Points, SUB_BATCH_SIZE);
|
|
||||||
|
|
||||||
nsamples := Round(sample_density * bucketSize / (oversample * oversample));
|
|
||||||
nrbatches := Round(nsamples / (fcp.nbatches * SUB_BATCH_SIZE));
|
|
||||||
Randomize;
|
|
||||||
|
|
||||||
for i := 0 to nrbatches do begin
|
|
||||||
if FStop then
|
|
||||||
Exit;
|
|
||||||
|
|
||||||
if (i and $F = 0) then
|
|
||||||
if nrbatches > 0 then
|
|
||||||
Progress(i / nrbatches)
|
|
||||||
else
|
|
||||||
Progress(0);
|
|
||||||
|
|
||||||
// generate points
|
|
||||||
{ case Compatibility of
|
|
||||||
0: fcp.iterate_Old(SUB_BATCH_SIZE, points);
|
|
||||||
1: fcp.iterateXYC(SUB_BATCH_SIZE, points);
|
|
||||||
end;
|
|
||||||
}
|
|
||||||
fcp.IterateXYC(SUB_BATCH_SIZE, points);
|
|
||||||
|
|
||||||
AddPointsProc(points)
|
|
||||||
end;
|
|
||||||
|
|
||||||
Progress(1);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@ -333,6 +146,7 @@ begin
|
|||||||
inherited;
|
inherited;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
procedure TRendererMM64_MT.Pause(paused: boolean);
|
procedure TRendererMM64_MT.Pause(paused: boolean);
|
||||||
var
|
var
|
||||||
i: integer;
|
i: integer;
|
||||||
@ -347,14 +161,6 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
constructor TRendererMM64_MT.Create;
|
|
||||||
begin
|
|
||||||
inherited Create;
|
|
||||||
|
|
||||||
FImageMaker := TImageMaker.Create;
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
procedure TRendererMM64_MT.Render;
|
procedure TRendererMM64_MT.Render;
|
||||||
const
|
const
|
||||||
@ -366,17 +172,17 @@ var
|
|||||||
begin
|
begin
|
||||||
FStop := False;
|
FStop := False;
|
||||||
|
|
||||||
// FRotationCenter[0] := fcp.center[0];
|
image_Center_X := fcp.center[0];
|
||||||
// FRotationCenter[1] := fcp.center[1];
|
image_Center_Y := fcp.center[1];
|
||||||
|
|
||||||
image_height := fcp.Height;
|
image_height := fcp.Height;
|
||||||
image_Width := fcp.Width;
|
image_Width := fcp.Width;
|
||||||
oversample := fcp.spatial_oversample;
|
oversample := fcp.spatial_oversample;
|
||||||
|
|
||||||
// entered memory - imagesize
|
// entered memory - imagesize
|
||||||
MaxMemory := FMaxMem * 1024 * 1024 - 4 * image_height * image_width;
|
MaxMemory := FMaxMem * 1024 * 1024 - 4 * image_height * int64(image_width);
|
||||||
|
|
||||||
ApproxMemory := 32 * oversample * oversample * image_height * image_width;
|
ApproxMemory := 32 * oversample * oversample * image_height * int64(image_width);
|
||||||
|
|
||||||
if (MaxMemory < 0) then
|
if (MaxMemory < 0) then
|
||||||
Exit;
|
Exit;
|
||||||
@ -444,93 +250,6 @@ begin
|
|||||||
Result := NrSlices;
|
Result := NrSlices;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
procedure TRendererMM64_MT.SaveImage(const FileName: String);
|
|
||||||
begin
|
|
||||||
FImageMaker.SaveImage(FileName);
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
procedure TRendererMM64_MT.SetNrOfTreads(const Value: integer);
|
|
||||||
begin
|
|
||||||
FNrOfTreads := Value;
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
procedure TRendererMM64_MT.SetPixelsMT;
|
|
||||||
var
|
|
||||||
i: integer;
|
|
||||||
nsamples: Int64;
|
|
||||||
bc : integer;
|
|
||||||
begin
|
|
||||||
nsamples := Round(sample_density * bucketSize / (oversample * oversample));
|
|
||||||
FNrBatches := Round(nsamples / (fcp.nbatches * SUB_BATCH_SIZE));
|
|
||||||
batchcounter := 0;
|
|
||||||
Randomize;
|
|
||||||
|
|
||||||
InitializeCriticalSection(CriticalSection);
|
|
||||||
|
|
||||||
SetLength(WorkingThreads, NrOfTreads);
|
|
||||||
for i := 0 to NrOfTreads - 1 do
|
|
||||||
WorkingThreads[i] := NewThread;
|
|
||||||
|
|
||||||
for i := 0 to NrOfTreads - 1 do
|
|
||||||
WorkingThreads[i].Resume;
|
|
||||||
|
|
||||||
bc := 0;
|
|
||||||
while (Not FStop) and (bc < FNrBatches) do begin
|
|
||||||
sleep(200);
|
|
||||||
try
|
|
||||||
EnterCriticalSection(CriticalSection);
|
|
||||||
if batchcounter > 0 then
|
|
||||||
Progress(batchcounter / FNrBatches)
|
|
||||||
else
|
|
||||||
Progress(0);
|
|
||||||
|
|
||||||
bc := batchcounter;
|
|
||||||
finally
|
|
||||||
LeaveCriticalSection(CriticalSection);
|
|
||||||
end;
|
|
||||||
end;
|
|
||||||
|
|
||||||
DeleteCriticalSection(CriticalSection);
|
|
||||||
Progress(1);
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
function TRendererMM64_MT.NewThread: TBucketFillerThread;
|
|
||||||
begin
|
|
||||||
Result := TBucketFillerThread.Create(fcp);
|
|
||||||
Result.BucketWidth := BucketWidth;
|
|
||||||
Result.BucketHeight := BucketHeight;
|
|
||||||
Result.Buckets := @Buckets;
|
|
||||||
{
|
|
||||||
Result.size[0] := size[0];
|
|
||||||
Result.size[1] := size[1];
|
|
||||||
Result.bounds[0] := Bounds[0];
|
|
||||||
Result.bounds[1] := Bounds[1];
|
|
||||||
Result.bounds[2] := Bounds[2];
|
|
||||||
Result.bounds[3] := Bounds[3];
|
|
||||||
Result.RotationCenter[0] := FRotationCenter[0];
|
|
||||||
Result.RotationCenter[1] := FRotationCenter[1];
|
|
||||||
}
|
|
||||||
Result.camX0 := camX0;
|
|
||||||
Result.camY0 := camY0;
|
|
||||||
Result.camW := camW;
|
|
||||||
Result.camH := camH;
|
|
||||||
Result.bws := bws;
|
|
||||||
Result.bhs := bhs;
|
|
||||||
Result.cosa := cosa;
|
|
||||||
Result.sina := sina;
|
|
||||||
Result.rcX := rcX;
|
|
||||||
Result.rcY := rcY;
|
|
||||||
|
|
||||||
Result.ColorMap := colorMap;
|
|
||||||
Result.CriticalSection := CriticalSection;
|
|
||||||
Result.Nrbatches := FNrBatches;
|
|
||||||
Result.batchcounter := @batchcounter;
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user