May 11, 2021, 02:43:00 AM

### Author Topic: [bb] 3D math functions by N [ 1+ years ago ]  (Read 739 times)

#### BlitzBot

• Jr. Member
• Posts: 1
##### [bb] 3D math functions by N [ 1+ years ago ]
« on: June 29, 2017, 12:28:41 AM »
Title : 3D math functions
Author : N
Posted : 1+ years ago

Description : Various functions used in Vein R3; if you don't know what it does, chances are you don't need it.

Code :
Code: BlitzBasic
1. ;#Region DESCRIPTION
2.         ;; Math functions, Vector class taken from the Anima engine (written by me)
3. ;#End Region
4.
5. ;#Region CLASSES
6.         Type Vector
7.                 Field X#
8.                 Field Y#
9.                 Field Z#
10.         End Type
11.
12.         Type Size
13.                 Field Width#
14.                 Field Height#
15.                 Field Depth#
16.         End Type
17.
18.         Type Cube
19.                 Field Position.Vector
20.                 Field Size.Size
21.         End Type
22.
23.         Type Rectangle
24.                 Field X,Y,Width,Height
25.                 Field Onscreen
26.         End Type
27. ;#End Region
28.
29. ;#Region PROCEDURES
30.         Function Size.Size(Width#=0,Height#=0,Depth#=0)
31.                 Local s.Size = New Size
32.                 sWidth = Width
33.                 sHeight = Height
34.                 sDepth = Depth
35.                 Return s
36.         End Function
37.
38.         Function Vector.Vector(X#=0,Y#=0,Z#=0)
39.                 Local v.Vector = New Vector
40.                 vX = X
41.                 vY = Y
42.                 v = Z
43.                 Return v
44.         End Function
45.
47.                 aX =aX + bX
48.                 aY =aY + bY
49.                 a =a + b
50.         End Function
51.
52.         Function VectorSubtract(a.Vector,b.Vector)
53.                 aX =aX - bX
54.                 aY =aY - bY
55.                 a =a - b
56.         End Function
57.
58.         Function VectorSum.Vector(a.Vector,b.Vector)
59.                 Return Vector(aX+bX,aY+bY,a+b)
60.         End Function
61.
62.         Function VectorDifference.Vector(a.Vector,b.Vector)
63.                 Return Vector(aX-bX,aY-bY,a-b)
64.         End Function
65.
66.         Function VectorMultiply(a.Vector,b.Vector)
67.                 aX =aX * bX
68.                 aY =aY * bY
69.                 a =a * b
70.         End Function
71.
72.         Function VectorDivide(a.Vector,b.Vector)
73.                 aX =aX / bX
74.                 aY =aY / bY
75.                 a =a / b
76.         End Function
77.
78.         Function VectorProduct.Vector(a.Vector,b.Vector)
79.                 Return Vector(aX*bX,aY*bY,a*b)
80.         End Function
81.
82.         Function VectorQuotient.Vector(a.Vector,b.Vector)
83.                 Return Vector(aX/bX,aY/bY,a/b)
84.         End Function
85.
86.         Function VectorCross.Vector(a.Vector,b.Vector)
87.                 Return Vector( (aY*b)-(a*bY), (a*bX)-(aX*b), (aX*bY)-(aY*bX) )
88.         End Function
89.
90.         Function VectorDot#(a.Vector,b.Vector)
91.                 Return (aX*bX) + (aY*bY) + (a*b)
92.         End Function
93.
94.         Function VectorAngle#(a.Vector,b.Vector)
95.                 Local d# = VectorDot(a,b)
96.                 Local m# = VectorMagnitude(a)*VectorMagnitude(b)
97.                 Return ACos(d#/m#)
98.         End Function
99.
100.         Function VectorNormalize(a.Vector)
101.                 Local m# = VectorMagnitude(a)
102.                 aX = aX / m#
103.                 aY = aY / m#
104.                 a = a / m#
105.         End Function
106.
107.         Function VectorMagnitude#(a.Vector)
108.                 Return Sqr(aX*aX + aY*aY + a*a)
109.         End Function
110.
111.         Function VectorScale(a.Vector,b#)
112.                 aX = aX * b#
113.                 aY = aY * b#
114.                 a = a * b#
115.         End Function
116.
117.         Function VectorSDivide(a.Vector,b#)
118.                 aX = aX / b#
119.                 aY = aY / b#
120.                 a = a / b#
121.         End Function
122.
123.         Function MinF#(A#,B#)
124.                 If A < B Then Return B
125.                 Return A
126.         End Function
127.
128.         Function MinI%(A%,B%)
129.                 If A < B Then Return B
130.                 Return A
131.         End Function
132.
133.         Function MaxF#(A#,B#)
134.                 If A > B Then Return B
135.                 Return A
136.         End Function
137.
138.         Function MaxI%(A%,B%)
139.                 If A > B Then Return B
140.                 Return A
141.         End Function
142.
143.         Function ConstrictF#(A#,B#,C#)
144.                 If A > C Then
145.                         While A > C
146.                                 A = A - (C-B)
147.                         Wend
148.                 ElseIf A < B Then
149.                         While A < B
150.                                 A = A + (C-B)
151.                         Wend
152.                 EndIf
153.                 Return A
154.         End Function
155.
156.         Function ConstrictI#(A%,B%,C%)
157.                 If A > C Then
158.                         While A > C
159.                                 A = A - (C-B)
160.                         Wend
161.                 ElseIf A < B Then
162.                         While A < B
163.                                 A = A + (C-B)
164.                         Wend
165.                 EndIf
166.                 Return A
167.         End Function
168.
169.         Function PointInRect(PX,PY,RX,RY,W,H)
170.                 Return (PX >= RX) And (PY >= RY) And (PX <= RX+W) And (PY <= RY+H)
171.         End Function
172.
173.         Function NearestPower(N#)
174.                 v# = 1
175.                 While N# > v#
176.                         v# = v# * 2
177.                 Wend
178.                 k# = v# - N#
179.                 Return v/(1 Or (k# > v/4))
180.         End Function
181.
182.         Function GetCube.Cube(Camera,x#,y#,z#,sx#,sy#,sz#)
183.                 Local MinX=9999,MinY=9999,MaxX=-9999,MaxY=-9999,MaxZ=-9999
184.
185.                 Local c = Camera
186.
187.                 CameraProject c,x,y,z
188.                 px = ProjectedX()
189.                 py = ProjectedY()
190.                 pz = ProjectedZ()
191.
192.                 If px < MinX Then MinX = px
193.                 If py < MinY Then MinY = py
194.                 If px > MaxX Then MaxX = px
195.                 If py > MaxY Then MaxY = py
196.                 If pz > MaxZ Then MaxZ = pz
197.
198.                 CameraProject c,sx,y,z
199.                 px = ProjectedX()
200.                 py = ProjectedY()
201.                 pz = ProjectedZ()
202.
203.                 If px < MinX Then MinX = px
204.                 If py < MinY Then MinY = py
205.                 If px > MaxX Then MaxX = px
206.                 If py > MaxY Then MaxY = py
207.                 If pz > MaxZ Then MaxZ = pz
208.
209.                 CameraProject c,sx,y,sz
210.                 px = ProjectedX()
211.                 py = ProjectedY()
212.                 pz = ProjectedZ()
213.
214.                 If px < MinX Then MinX = px
215.                 If py < MinY Then MinY = py
216.                 If px > MaxX Then MaxX = px
217.                 If py > MaxY Then MaxY = py
218.                 If pz > MaxZ Then MaxZ = pz
219.
220.                 CameraProject c,x,y,sz
221.                 px = ProjectedX()
222.                 py = ProjectedY()
223.                 pz = ProjectedZ()
224.
225.                 If px < MinX Then MinX = px
226.                 If py < MinY Then MinY = py
227.                 If px > MaxX Then MaxX = px
228.                 If py > MaxY Then MaxY = py
229.                 If pz > MaxZ Then MaxZ = pz
230.
231.                 CameraProject c,x,sy,z
232.                 px = ProjectedX()
233.                 py = ProjectedY()
234.                 pz = ProjectedZ()
235.
236.                 If px < MinX Then MinX = px
237.                 If py < MinY Then MinY = py
238.                 If px > MaxX Then MaxX = px
239.                 If py > MaxY Then MaxY = py
240.                 If pz > MaxZ Then MaxZ = pz
241.
242.                 CameraProject c,sx,sy,z
243.                 px = ProjectedX()
244.                 py = ProjectedY()
245.                 pz = ProjectedZ()
246.
247.                 If px < MinX Then MinX = px
248.                 If py < MinY Then MinY = py
249.                 If px > MaxX Then MaxX = px
250.                 If py > MaxY Then MaxY = py
251.                 If pz > MaxZ Then MaxZ = pz
252.
253.                 CameraProject c,sx,sy,sz
254.                 px = ProjectedX()
255.                 py = ProjectedY()
256.                 pz = ProjectedZ()
257.
258.                 If px < MinX Then MinX = px
259.                 If py < MinY Then MinY = py
260.                 If px > MaxX Then MaxX = px
261.                 If py > MaxY Then MaxY = py
262.                 If pz > MaxZ Then MaxZ = pz
263.
264.                 CameraProject c,x,sy,sz
265.                 px = ProjectedX()
266.                 py = ProjectedY()
267.                 pz = ProjectedZ()
268.
269.                 If px < MinX Then MinX = px
270.                 If py < MinY Then MinY = py
271.                 If px > MaxX Then MaxX = px
272.                 If py > MaxY Then MaxY = py
273.                 If pz > MaxZ Then MaxZ = pz
274.
275.                 i.Cube = New Cube
276.                 iPosition = Vector(MinX,MinY,-1)
277.                 iSize = Size(MaxX-MinX,MaxY-MinY,MaxZ)
278.                 Return i
279.         End Function
280.
281.         Function CubeInCamera(Camera,x#,y#,z#,sx#,sy#,sz#)
282.                 Local c = Camera
283.                 Local MinX=9999,MinY=9999,MaxX=-9999,MaxY=-9999
284.
285.                 CameraProject c,x,y,z
286.                 px = ProjectedX()
287.                 py = ProjectedY()
288.                 If ProjectedZ() >= 1 Then
289.                         If px < MinX Then MinX = px
290.                         If px > MaxX Then MaxX = px
291.                         If py < MinY Then MinY = py
292.                         If py > MaxY Then MaxY = py
293.                 EndIf
294.                 z = z + ProjectedZ()
295.
296.                 CameraProject c,sx,y,z
297.                 px = ProjectedX()
298.                 py = ProjectedY()
299.                 If ProjectedZ() >= 1 Then
300.                         If px < MinX Then MinX = px
301.                         If px > MaxX Then MaxX = px
302.                         If py < MinY Then MinY = py
303.                         If py > MaxY Then MaxY = py
304.                 EndIf
305.                 z = z + ProjectedZ()
306.
307.                 CameraProject c,sx,y,sz
308.                 px = ProjectedX()
309.                 py = ProjectedY()
310.                 If ProjectedZ() >= 1 Then
311.                         If px < MinX Then MinX = px
312.                         If px > MaxX Then MaxX = px
313.                         If py < MinY Then MinY = py
314.                         If py > MaxY Then MaxY = py
315.                 EndIf
316.                 z = z + ProjectedZ()
317.
318.                 CameraProject c,x,y,sz
319.                 px = ProjectedX()
320.                 py = ProjectedY()
321.                 If ProjectedZ() >= 1 Then
322.                         If px < MinX Then MinX = px
323.                         If px > MaxX Then MaxX = px
324.                         If py < MinY Then MinY = py
325.                         If py > MaxY Then MaxY = py
326.                 EndIf
327.                 z = z + ProjectedZ()
328.
329.                 CameraProject c,x,sy,z
330.                 px = ProjectedX()
331.                 py = ProjectedY()
332.                 If ProjectedZ() >= 1 Then
333.                         If px < MinX Then MinX = px
334.                         If px > MaxX Then MaxX = px
335.                         If py < MinY Then MinY = py
336.                         If py > MaxY Then MaxY = py
337.                 EndIf
338.                 z = z + ProjectedZ()
339.
340.                 CameraProject c,sx,sy,z
341.                 px = ProjectedX()
342.                 py = ProjectedY()
343.                 If ProjectedZ() >= 1 Then
344.                         If px < MinX Then MinX = px
345.                         If px > MaxX Then MaxX = px
346.                         If py < MinY Then MinY = py
347.                         If py > MaxY Then MaxY = py
348.                 EndIf
349.                 z = z + ProjectedZ()
350.
351.                 CameraProject c,sx,sy,sz
352.                 px = ProjectedX()
353.                 py = ProjectedY()
354.                 If ProjectedZ() >= 1 Then
355.                         If px < MinX Then MinX = px
356.                         If px > MaxX Then MaxX = px
357.                         If py < MinY Then MinY = py
358.                         If py > MaxY Then MaxY = py
359.                 EndIf
360.                 z = z + ProjectedZ()
361.
362.                 CameraProject c,x,sy,sz
363.                 px = ProjectedX()
364.                 py = ProjectedY()
365.                 If ProjectedZ() >= 1 Then
366.                         If px < MinX Then MinX = px
367.                         If px > MaxX Then MaxX = px
368.                         If py < MinY Then MinY = py
369.                         If py > MaxY Then MaxY = py
370.                 EndIf
371.                 z = z + ProjectedZ()
372.                 Stop
373.                 If z <= 0 Then Return
374.
375.                 Return RectsOverlap(0,0,GraphicsWidth(),GraphicsHeight(),MinX,MinY,maxx-minx,maxy-miny)
376.         End Function
377.
378.         Function GetMeshAABB.Cube(Mesh,glbl=1)
379.                 c.Cube = New Cube
380.                 cPosition = Vector()
381.                 cSize = Size()
382.
383.                 Local min#[3]
384.                 Local max#[3]
385.
386.                 For x# = 0 To 3
387.                         min[x] = 65536
388.                         max[x] = -65536
389.                 Next
390.
391.                 Local MX = 1
392.                 Local MY = 2
393.                 Local MZ = 3
394.
395.                 For surfaces = 1 To CountSurfaces(Mesh)
396.                         s = GetSurface(Mesh,surfaces)
397.                         For i = 0 To CountVertices(s)-1
398.                                 x# = VertexX(s,i)
399.                                 y# = VertexY(s,i)
400.                                 z# = VertexZ(s,i)
401.
402.                                 If glbl Then
403.                                         TFormPoint x,y,z,Mesh,0
404.                                         x = TFormedX()
405.                                         y = TFormedY()
406.                                         z = TFormedZ()
407.                                 EndIf
408.
409.                                 If x < min[MX] Then min[MX] = x
410.                                 If x > max[MX] Then max[MX] = x
411.
412.                                 If y < min[MY] Then min[MY] = y
413.                                 If y > max[MY] Then max[MY] = y
414.
415.                                 If z < min[MZ] Then min[MZ] = z
416.                                 If z > max[MZ] Then max[MZ] = z
417.                         Next
418.                 Next
419.
420.                 cPositionx = min[MX]-.1
421.                 cPositiony = min[MY]-.1
422.                 cPositionz = min[MZ]-.1
423.                 cSizeWidth = max[MX]-min[MX]+.2
424.                 cSizeheight = max[MY]-min[MY]+.2
425.                 cSizedepth = max[MZ]-min[MZ]+.2
426.                 Return c
427.         End Function
428.
429.         Function AABBToScreen.Rectangle(Camera,x#,y#,z#,width#,height#,depth#)
430.                 r.Rectangle = New Rectangle
431.
432.                 Local minx=16777215,miny=16777215,maxx=-16777215,maxy=-16777215
433.
434.                 CameraProject Camera,x,y,z
435.                 zs = zs + (ProjectedZ() > 0)
436.                 px = ProjectedX()
437.                 py = ProjectedY()
438.
439.                 If px > maxx Then maxx = px
440.                 If px < minx Then minx = px
441.
442.                 If py > maxy Then maxy = py
443.                 If py < miny Then miny = py
444.
445.                 CameraProject Camera,x+width,y,z
446.                 zs = zs + (ProjectedZ() > 0)
447.                 px = ProjectedX()
448.                 py = ProjectedY()
449.
450.                 If px > maxx Then maxx = px
451.                 If px < minx Then minx = px
452.
453.                 If py > maxy Then maxy = py
454.                 If py < miny Then miny = py
455.
456.                 CameraProject Camera,x+width,y,z+depth
457.                 zs = zs + (ProjectedZ() > 0)
458.                 px = ProjectedX()
459.                 py = ProjectedY()
460.
461.                 If px > maxx Then maxx = px
462.                 If px < minx Then minx = px
463.
464.                 If py > maxy Then maxy = py
465.                 If py < miny Then miny = py
466.
467.                 CameraProject Camera,x,y,z+depth
468.                 zs = zs + (ProjectedZ() > 0)
469.                 px = ProjectedX()
470.                 py = ProjectedY()
471.
472.                 If px > maxx Then maxx = px
473.                 If px < minx Then minx = px
474.
475.                 If py > maxy Then maxy = py
476.                 If py < miny Then miny = py
477.
478.                 CameraProject Camera,x,y+height,z
479.                 zs = zs + (ProjectedZ() > 0)
480.                 px = ProjectedX()
481.                 py = ProjectedY()
482.
483.                 If px > maxx Then maxx = px
484.                 If px < minx Then minx = px
485.
486.                 If py > maxy Then maxy = py
487.                 If py < miny Then miny = py
488.
489.                 CameraProject Camera,x+width,y+height,z
490.                 zs = zs + (ProjectedZ() > 0)
491.                 px = ProjectedX()
492.                 py = ProjectedY()
493.
494.                 If px > maxx Then maxx = px
495.                 If px < minx Then minx = px
496.
497.                 If py > maxy Then maxy = py
498.                 If py < miny Then miny = py
499.
500.                 CameraProject Camera,x+width,y+height,z+depth
501.                 zs = zs + (ProjectedZ() > 0)
502.                 px = ProjectedX()
503.                 py = ProjectedY()
504.
505.                 If px > maxx Then maxx = px
506.                 If px < minx Then minx = px
507.
508.                 If py > maxy Then maxy = py
509.                 If py < miny Then miny = py
510.
511.                 CameraProject Camera,x,y+height,z+depth
512.                 zs = zs + (ProjectedZ() > 0)
513.                 px = ProjectedX()
514.                 py = ProjectedY()
515.
516.                 If px > maxx Then maxx = px
517.                 If px < minx Then minx = px
518.
519.                 If py > maxy Then maxy = py
520.                 If py < miny Then miny = py
521.
522.                 rOnscreen = 1
523.                 rx = minx
524.                 ry = miny
525.                 rwidth = maxx-minx
526.                 rheight = maxy-miny
527.
528.                 Return r
529.         End Function
530.
531.         Function FreeCube(c.Cube)
532.                 If c = Null Then Return
533.                 Delete cSize
534.                 Delete cPosition
535.                 Delete c
536.         End Function
537.
538.         Function PointInCube(x#,y#,z#,c.Cube)
539.                 Return (x >= cPositionX And x <= cPositionX+cSizeWidth And y => cPositionY And y <= cPositionY+cSizeHeight And z => cPosition And z <= cPosition+cSizeDepth)
540.         End Function
541.
542.         Function CreateMeshBox(Entity)
543.                 Local MinX#,MinY#,MinZ#
544.                 Local MaxX#,MaxY#,MaxZ#
545.                 For n = 1 To CountSurfaces(Entity)
546.                         s = GetSurface(Entity,n)
547.                         For i = 0 To CountVertices(s)-1
548.                                 x# = VertexX(s,i)
549.                                 y# = VertexY(s,i)
550.                                 z# = VertexZ(s,i)
551.
552.                                 If x < MinX Then MinX = x
553.                                 If x > MaxX Then MaxX = x
554.
555.                                 If y < MinY Then MinY = y
556.                                 If y > MaxY Then MaxY = y
557.
558.                                 If z < MinZ Then MinZ = z
559.                                 If z > MaxZ Then MaxZ = z
560.                         Next
561.                 Next
562.                 EntityBox Entity,MaxX,MaxY,MaxZ,MinX-MaxX,MinY-MaxY,MinZ-MaxZ
563.         End Function
564. ;#End Region