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 
19 unit uzeentwithmatrix;
20 {$INCLUDE def.inc}
21 
22 interface
23 uses uzgldrawcontext,uzedrawingdef,uzecamera,uzeentity,uzbtypesbase,uzbtypes,
24      gzctnrvectortypes,uzbgeomtypes,uzegeometry,uzeentsubordinated,uzeentitiestree;
25 type
26 {EXPORT+}
27 PGDBObjWithMatrix=^GDBObjWithMatrix;
28 GDBObjWithMatrix={$IFNDEF DELPHI}packed{$ENDIF} object(GDBObjEntity)
29                        ObjMatrix:DMatrix4D;(*'OCS Matrix'*)(*oi_readonly*)(*hidden_in_objinsp*)
30                        constructor initnul(owner:PGDBObjGenericWithSubordinated);
GetMatrixnull31                        function GetMatrix:PDMatrix4D;virtual;
32                        procedure CalcObjMatrix;virtual;
33                        procedure FormatEntity(var drawing:TDrawingDef;var DC:TDrawContext);virtual;
34                        procedure createfield;virtual;
35                        procedure transform(const t_matrix:DMatrix4D);virtual;
36                        procedure ReCalcFromObjMatrix;virtual;abstract;
37                        procedure CalcInFrustumByTree(frustum:ClipArray;infrustumactualy:TActulity;visibleactualy:TActulity;var enttree:TEntTreeNode;var totalobj,infrustumobj:GDBInteger; ProjectProc:GDBProjectProc;const zoom,currentdegradationfactor:GDBDouble);virtual;
38                        procedure ProcessTree(const frustum:ClipArray;infrustumactualy:TActulity;visibleactualy:TActulity;var enttree:TEntTreeNode;OwnerInFrustum:TInBoundingVolume;OwnerFuldraw:TDrawType;var totalobj,infrustumobj:GDBInteger; ProjectProc:GDBProjectProc;const zoom,currentdegradationfactor:GDBDouble);virtual;
39                  end;
40 {EXPORT-}
41 implementation
42 //uses
43 //    log{,zcadsysvars};
44 procedure GDBObjWithMatrix.ProcessTree(const frustum:ClipArray;infrustumactualy:TActulity;visibleactualy:TActulity;var enttree:TEntTreeNode;OwnerInFrustum:TInBoundingVolume;OwnerFuldraw:TDrawType;var totalobj,infrustumobj:GDBInteger; ProjectProc:GDBProjectProc;const zoom,currentdegradationfactor:GDBDouble);
45 var
46      ImInFrustum:TInBoundingVolume;
47      pobj:PGDBObjEntity;
48      ir:itrec;
49      v1{,v2,v3}:gdbvertex;
50      tx:double;
51      //bb:GDBBoundingBbox;
52 begin
53      if OwnerFuldraw=TDTFulDraw then
54      begin
55      {вариант с точным расчетом - медленный((
56      gdb.GetCurrentDWG^.myGluProject2(createvertex(enttree.BoundingBox.LBN.x,enttree.BoundingBox.LBN.y,enttree.BoundingBox.LBN.Z),v1);
57      bb.LBN:=v1;
58      bb.RTF:=v1;
59      gdb.GetCurrentDWG^.myGluProject2(createvertex(enttree.BoundingBox.RTF.x,enttree.BoundingBox.LBN.y,enttree.BoundingBox.LBN.Z),v1);
60      concatBBandPoint(bb, v1);
61      gdb.GetCurrentDWG^.myGluProject2(createvertex(enttree.BoundingBox.RTF.x,enttree.BoundingBox.RTF.y,enttree.BoundingBox.LBN.Z),v1);
62      concatBBandPoint(bb, v1);
63      gdb.GetCurrentDWG^.myGluProject2(createvertex(enttree.BoundingBox.LBN.x,enttree.BoundingBox.RTF.y,enttree.BoundingBox.LBN.Z),v1);
64      concatBBandPoint(bb, v1);
65 
66      gdb.GetCurrentDWG^.myGluProject2(createvertex(enttree.BoundingBox.LBN.x,enttree.BoundingBox.LBN.y,enttree.BoundingBox.RTF.Z),v1);
67      concatBBandPoint(bb, v1);
68      gdb.GetCurrentDWG^.myGluProject2(createvertex(enttree.BoundingBox.RTF.x,enttree.BoundingBox.LBN.y,enttree.BoundingBox.RTF.Z),v1);
69      concatBBandPoint(bb, v1);
70      gdb.GetCurrentDWG^.myGluProject2(createvertex(enttree.BoundingBox.RTF.x,enttree.BoundingBox.RTF.y,enttree.BoundingBox.RTF.Z),v1);
71      concatBBandPoint(bb, v1);
72      gdb.GetCurrentDWG^.myGluProject2(createvertex(enttree.BoundingBox.LBN.x,enttree.BoundingBox.RTF.y,enttree.BoundingBox.RTF.Z),v1);
73      concatBBandPoint(bb, v1);
74      v1:=bb.RTF;
75      v2:=bb.LBN;}
76 
77      {вариант с  неточным расчетом - неточный}
78      {ProjectProc(enttree.BoundingBox.LBN,v1);
79      ProjectProc(enttree.BoundingBox.RTF,v2);
80 
81      if abs((v2.x-v1.x)*(v2.y-v1.y))<10 then
82                                             begin
83                                                  ProjectProc(createvertex(enttree.BoundingBox.LBN.x,enttree.BoundingBox.RTF.y,enttree.BoundingBox.LBN.Z),v1);
84                                                  ProjectProc(createvertex(enttree.BoundingBox.RTF.x,enttree.BoundingBox.LBN.y,enttree.BoundingBox.RTF.Z),v2);
85                                                  if abs((v2.x-v1.x)*(v2.y-v1.y))<10 then
86                                                                                         enttree.FulDraw:=false
87                                                                                     else
88                                                                                         enttree.FulDraw:=true;
89                                             end
90                                          else
91                                              enttree.FulDraw:=true;}
92      v1:=uzegeometry.VertexSub(enttree.BoundingBox.RTF,enttree.BoundingBox.LBN);
93      tx:=uzegeometry.oneVertexlength(v1);
94      if tx/zoom<currentdegradationfactor then
95                                                                                         enttree.NodeData.FulDraw:=TDTSimpleDraw
96                                                                                     else
97                                                                                         enttree.NodeData.FulDraw:=TDTFulDraw;
98      end
99      else
100          enttree.NodeData.FulDraw:=TDTSimpleDraw;
101      case OwnerInFrustum of
102      IREmpty:begin
103                    OwnerInFrustum:=OwnerInFrustum;
104              end;
105      IRFully:begin
106                    enttree.NodeData.infrustum:=infrustumactualy;
107                    pobj:=enttree.nulbeginiterate(ir);
108                    if pobj<>nil then
109                    repeat
110                          pobj^.SetInFrustumFromTree(frustum,infrustumactualy,visibleactualy,totalobj,infrustumobj,ProjectProc,zoom,currentdegradationfactor);
111                          //pobj^.infrustum:=infrustumactualy;
112                          pobj:=enttree.nuliterate(ir);
113                    until pobj=nil;
114                    if assigned(enttree.pminusnode) then
115                                                        ProcessTree(frustum,infrustumactualy,visibleactualy,PTEntTreeNode(enttree.pminusnode)^,IRFully,enttree.NodeData.FulDraw,totalobj,infrustumobj,ProjectProc,zoom,currentdegradationfactor);
116                    if assigned(enttree.pplusnode) then
117                                                        ProcessTree(frustum,infrustumactualy,visibleactualy,PTEntTreeNode(enttree.pplusnode)^,IRFully,enttree.NodeData.FulDraw,totalobj,infrustumobj,ProjectProc,zoom,currentdegradationfactor);
118              end;
119  IRPartially:begin
120                   ImInFrustum:=CalcAABBInFrustum(enttree.BoundingBox,frustum);
121                   case ImInFrustum of
122                        IREmpty:begin
123                                      OwnerInFrustum:=OwnerInFrustum;
124                                end;
125                        IRFully{,IRPartially}:begin
126                                      enttree.NodeData.infrustum:=infrustumactualy;
127                                      pobj:=enttree.nulbeginiterate(ir);
128                                      if pobj<>nil then
129                                      repeat
130                                            pobj^.SetInFrustumFromTree(frustum,infrustumactualy,visibleactualy,totalobj,infrustumobj,ProjectProc,zoom,currentdegradationfactor);
131                                            //pobj^.infrustum:=infrustumactualy;
132                                            pobj:=enttree.nuliterate(ir);
133                                      until pobj=nil;
134                                      if assigned(enttree.pminusnode) then
135                                                                          ProcessTree(frustum,infrustumactualy,visibleactualy,PTEntTreeNode(enttree.pminusnode)^,ImInFrustum,enttree.NodeData.FulDraw,totalobj,infrustumobj,ProjectProc,zoom,currentdegradationfactor);
136                                      if assigned(enttree.pplusnode) then
137                                                                          ProcessTree(frustum,infrustumactualy,visibleactualy,PTEntTreeNode(enttree.pplusnode)^,ImInFrustum,enttree.NodeData.FulDraw,totalobj,infrustumobj,ProjectProc,zoom,currentdegradationfactor);
138 
139                               end;
140                   IRPartially:begin
141                                      enttree.NodeData.infrustum:=infrustumactualy;
142                                      pobj:=enttree.nulbeginiterate(ir);
143                                      if pobj<>nil then
144                                      repeat
145                                            if pobj^.CalcInFrustum(frustum,infrustumactualy,visibleactualy,totalobj,infrustumobj,ProjectProc,zoom,currentdegradationfactor) then
146                                            begin
147                                                 pobj^.SetInFrustumFromTree(frustum,infrustumactualy,visibleactualy,totalobj,infrustumobj,ProjectProc,zoom,currentdegradationfactor);
148                                            end;
149                                            pobj:=enttree.nuliterate(ir);
150                                      until pobj=nil;
151                                      if assigned(enttree.pminusnode) then
152                                                                          ProcessTree(frustum,infrustumactualy,visibleactualy,PTEntTreeNode(enttree.pminusnode)^,IRPartially,enttree.NodeData.FulDraw,totalobj,infrustumobj,ProjectProc,zoom,currentdegradationfactor);
153                                      if assigned(enttree.pplusnode) then
154                                                                          ProcessTree(frustum,infrustumactualy,visibleactualy,PTEntTreeNode(enttree.pplusnode)^,IRPartially,enttree.NodeData.FulDraw,totalobj,infrustumobj,ProjectProc,zoom,currentdegradationfactor);
155 
156                               end;
157                   end;
158 
159              end;
160      end;
161 end;
162 
163 procedure GDBObjWithMatrix.CalcInFrustumByTree(frustum:ClipArray;infrustumactualy:TActulity;visibleactualy:TActulity;var enttree:TEntTreeNode;var totalobj,infrustumobj:GDBInteger; ProjectProc:GDBProjectProc;const zoom,currentdegradationfactor:GDBDouble);
164 begin
165      ProcessTree(frustum,infrustumactualy,visibleactualy,enttree,IRPartially,TDTFulDraw,totalobj,infrustumobj,ProjectProc,zoom,currentdegradationfactor)
166 end;
167 
168 procedure GDBObjWithMatrix.transform(const t_matrix:DMatrix4D);
169 begin
170      ObjMatrix:=uzegeometry.MatrixMultiply(ObjMatrix,t_matrix);
171 end;
172 procedure GDBObjWithMatrix.createfield;
173 begin
174      inherited;
175      objmatrix:=onematrix;
176 end;
GDBObjWithMatrix.GetMatrixnull177 function GDBObjWithMatrix.GetMatrix;
178 begin
179      result:=@ObjMatrix;
180 end;
181 procedure GDBObjWithMatrix.CalcObjMatrix;
182 begin
183      ObjMatrix:=OneMatrix;
184 end;
185 procedure GDBObjWithMatrix.FormatEntity(var drawing:TDrawingDef;var DC:TDrawContext);
186 begin
187      CalcObjMatrix;
188 end;
189 constructor GDBObjWithMatrix.initnul;
190 begin
191      inherited initnul(owner);
192      CalcObjMatrix;
193 end;
194 begin
195 end.
196