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