1 {
2 *****************************************************************************
3 *                                                                           *
4 *  This file is part of the ZCAD                                            *
5 *                                                                           *
6 *  See the file COPYING.modifiedLGPL.txt, included in this distribution,    *
7 *  for details about the copyright.                                         *
8 *                                                                           *
9 *  This program is distributed in the hope that it will be useful,          *
10 *  but WITHOUT ANY WARRANTY; without even the implied warranty of           *
11 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.                     *
12 *                                                                           *
13 *****************************************************************************
14 }
15 {
16 @author(Andrey Zubarev <zamtmn@yandex.ru>)
17 }
18 {$MODE OBJFPC}
19 unit uzerasterizer;
20 {$INCLUDE def.inc}
21 interface
22 uses
23   uzbtypesbase,uzbgeomtypes,
24   uzedrawingsimple,uzgldrawcontext,uzgldrawergeneral2d,uzgldrawerabstract,
25   uzegeometry,uzeconsts,
26   uzeiopalette,uzepalette,uzcutils,
27   LazLogger,Graphics,Classes,
28   uzgldrawercanvas;
29 type
30   TRasterizeColor=(PC_Color,PC_Grayscale,PC_Monochrome);
31   PTRasterizeParams=^TRasterizeParams;
32   TRasterizeParams=packed record
33     FitToPage:GDBBoolean;
34     Center:GDBBoolean;
35     Scale:GDBDouble;
36     Palette:TRasterizeColor;
37   end;
38 procedure rasterize(cdwg:PTSimpleDrawing;pw,ph:integer;point1,point2:GDBVertex;PrintParam:TRasterizeParams;Canvas: TCanvas;PrinterDrawer:TZGLGeneral2DDrawer);
39 implementation
40 procedure rasterize(cdwg:PTSimpleDrawing;pw,ph:integer;point1,point2:GDBVertex;PrintParam:TRasterizeParams;Canvas: TCanvas;PrinterDrawer:TZGLGeneral2DDrawer);
41  var
42   dx,dy,sx,sy,scale:gdbdouble;
43   tmatrix,_clip:DMatrix4D;
44   _frustum:ClipArray;
45   DC:TDrawContext;
46 
47   modelMatrix:DMatrix4D;
48   projMatrix:DMatrix4D;
49   viewport:IMatrix4;
50   pd1,pd2:GDBvertex2D;
51 
52   oldforegroundindex:integer;
53 begin
54 
55   dx:=point2.x-point1.x;
56   if dx=0 then
57               dx:=1;
58   dy:=point2.y-point1.y;
59   if dy=0 then
60               dy:=1;
61 
62   if PrintParam.FitToPage then
63      begin
64           sx:=(({Printer.PageWidth}pw))/dx;
65           sy:=(({Printer.PageHeight}ph))/dy;
66           scale:=sy;
67           if sx<sy then
68                        scale:=sx;
69           PrintParam.Scale:=scale;
70      end
71   else
72       scale:=PrintParam.Scale;
73 
74   if sx>sy then begin
75     sx:=sx/sy;
76     sy:=1;
77   end else begin
78     sy:=sy/sx;
79     sx:=1;
80   end;
81 
82   //smatrix:=CreateScaleMatrix(CreateVertex(scale,scale,scale));
83 
84   //projMatrix:=ortho(point1.x,point2.x,point1.y,point2.y,-1,1,@onematrix);
85 
86   projMatrix:=onematrix;
87   projMatrix:=ortho(-dx/2,dx/2,-dy/2,dy/2,-1,1,@projMatrix);
88   projMatrix:=MatrixMultiply(projMatrix,CreateTranslationMatrix(CreateVertex(-(point1.x+point2.x)/dx,-(point1.y+point2.y)/dy,0)));
89   projMatrix:=MatrixMultiply(projMatrix,CreateScaleMatrix(CreateVertex(1/sx,1/sy,1)));
90 
91 
92 
93 
94   modelMatrix:=OneMatrix;
95   //modelMatrix:=CreateTranslationMatrix(CreateVertex(-dx/{2}5,{dy/2}0,0));
96   //projMatrix:=onematrix;
97   //projMatrix:=MatrixMultiply(projMatrix,smatrix);
98 
99   {point1:=VectorTransform3D(point1,projMatrix);
100   point1.x:=-point1.x;
101   point1.y:=(Printer.PageHeight-point1.y);}
102 
103   //smatrix:=CreateTranslationMatrix(point1);
104   //projMatrix:=MatrixMultiply(projMatrix,smatrix);
105 
106   //projMatrix:=MatrixMultiply(projMatrix,CreateScaleMatrix(CreateVertex(1,-1,1)));
107 
108   //point1:=VectorTransform3D(CreateVertex(0,0,0),projMatrix);
109   //point1:=VectorTransform3D(CreateVertex(1,1,0),projMatrix);
110 
111 
112   //prn.scalex:=prn.scalex*scale;
113   //prn.scaley:=prn.scaley*scale;
114 
115   tmatrix:=cdwg^.pcamera^.projMatrix;
116   //drawings.GetCurrentDWG^.pcamera^.projMatrix:=prn.project;
117   //drawings.GetCurrentDWG^.pcamera^.modelMatrix:=prn.model;
118   //try
119 
120   if PrintParam.Palette<>PC_Color then
121   case PrintParam.Palette of
122     PC_Monochrome:PushAndSetNewPalette(MonochromePalette);
123     PC_Grayscale:begin
124                    DebugLn('{WH}Print: Grayscale palette not yet implemented, use monochrome palette');
125                    PushAndSetNewPalette(grayscalepalette);
126                   end;
127   end;
128 
129   //----Printer.Title := 'zcadprint';
130   //----Printer.BeginDoc;
131 
132   cdwg^.pcamera^.NextPosition;
133   inc(cdwg^.pcamera^.DRAWCOUNT);
134   //_clip:=MatrixMultiply(prn.model,prn.project);
135   cdwg^.pcamera^.getfrustum(@cdwg^.pcamera^.modelMatrix,   @cdwg^.pcamera^.projMatrix,   cdwg^.pcamera^.clip,   cdwg^.pcamera^.frustum);
136   //_frustum:=calcfrustum(@_clip);
137   cdwg^.wa.param.firstdraw := TRUE;
138   //cdwg^.OGLwindow1.param.debugfrustum:=cdwg^.pcamera^.frustum;
139   //cdwg^.OGLwindow1.param.ShowDebugFrustum:=true;
140   dc:=cdwg^.CreateDrawingRC(true);
141   dc.DrawMode:=true;
142   dc.MaxDetail:=true;
143   //PrinterDrawer:=TZGLCanvasDrawer.create;
144   dc.drawer:=PrinterDrawer;
145   oldforegroundindex:=dc.DrawingContext.ForeGroundColorIndex;
146   dc.DrawingContext.ForeGroundColorIndex:=uzeconsts.ClBlack;
147 
148 
149   //modelMatrix:=onematrix;
150   //projMatrix:DMatrix4D;
151   viewport[0]:=0;
152   viewport[1]:=0;
153   viewport[2]:=pw;
154   viewport[3]:=ph;
155   dc.DrawingContext.matrixs.pmodelMatrix:=@modelMatrix;
156   dc.DrawingContext.matrixs.pprojMatrix:=@projMatrix;
157   dc.DrawingContext.matrixs.pviewport:=@viewport;
158 
159   dc.drawer.startrender(TRM_ModelSpace,dc.DrawingContext.matrixs);
160   //PrinterDrawer.pushMatrixAndSetTransform(projMatrix);
161   PrinterDrawer.canvas:=Canvas;
162 
163   PrinterDrawer.WorkAreaResize(Rect(0,0,pw,ph));
164 
165   //Printer.Canvas.Line(0,0,pw,ph);
166 
167   _clip:=MatrixMultiply(modelMatrix,projMatrix);
168   _frustum:=calcfrustum(@_clip);
169 
170   cdwg^.GetCurrentROOT^.CalcVisibleByTree(_frustum,cdwg^.pcamera^.POSCOUNT,cdwg^.pcamera^.VISCOUNT,cdwg^.GetCurrentROOT^.ObjArray.ObjTree,cdwg^.pcamera^.totalobj,cdwg^.pcamera^.infrustum,@cdwg^.myGluProject2,cdwg^.pcamera^.prop.zoom,0);
171   cdwg^.GetCurrentROOT^.FormatEntity(cdwg^,dc);
172   //drawings.GetCurrentDWG^.OGLwindow1.draw;
173   //prn.startrender;
174 
175   pd1:=PrinterDrawer.ProjectPoint3DInModelSpace(point1,dc.DrawingContext.matrixs);
176   pd2:=PrinterDrawer.ProjectPoint3DInModelSpace(point2,dc.DrawingContext.matrixs);
177   PrinterDrawer.canvas.ClipRect:=rect(round(pd1.x),round(pd1.y),round(pd2.x),round(pd2.y));
178   PrinterDrawer.canvas.Clipping:=true;
179   cdwg^.wa.treerender(cdwg^.GetCurrentROOT^.ObjArray.ObjTree,0,{0}dc);
180   //prn.endrender;
181   inc(cdwg^.pcamera^.DRAWCOUNT);
182 
183   //----Printer.EndDoc;
184   cdwg^.pcamera^.projMatrix:=tmatrix;
185 
186   if PrintParam.Palette<>PC_Color then
187     PopPalette;
188   dc.DrawingContext.ForeGroundColorIndex:=oldforegroundindex;
189 
190   {except
191     on E:Exception do
192     begin
193       Printer.Abort;
194       ZCMsgCallBackInterface.TextMessage(e.message,TMWOShowError);
195     end;
196   end;}
197   zcRedrawCurrentDrawing;
198 end;
199 
200 begin
201 end.
202