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