2
0
Эх сурвалжийг харах

std.geom fixes and updates.

Mark Sibly 8 жил өмнө
parent
commit
71b2ae8ec4

+ 4 - 4
modules/std/geom/box.monkey2

@@ -130,8 +130,8 @@ Struct Box<T>
 	Operator|:Box( p:Vec3<T> )
 		Return New Box(
 			Min( min.x,p.x ),
-			Min( min.x,p.y ),
-			Min( min.x,p.z ),
+			Min( min.y,p.y ),
+			Min( min.z,p.z ),
 			Max( max.x,p.x ),
 			Max( max.y,p.y ),
 			Max( max.z,p.z ) )
@@ -139,8 +139,8 @@ Struct Box<T>
 	
 	Operator|=( p:Vec3<T> )
 		min.x=Min( min.x,p.x )
-		min.y=Min( min.x,p.y )
-		min.z=Min( min.x,p.z )
+		min.y=Min( min.y,p.y )
+		min.z=Min( min.z,p.z )
 		max.x=Max( max.x,p.x )
 		max.y=Max( max.y,p.y )
 		max.z=Max( max.z,p.z )

+ 1 - 7
modules/std/geom/mat3.monkey2

@@ -31,12 +31,6 @@ Struct Mat3<T>
 		k.x=kx; k.y=ky; k.z=kz
 	End
 	
-	Method New( m:Mat4<T> )
-		i.x=m.i.x ; i.y=m.i.y ; i.z=m.i.z
-		j.x=m.j.x ; j.y=m.j.y ; j.z=m.j.z
-		k.x=m.k.x ; k.y=m.k.y ; k.z=m.k.z
-	End
-	
 	Operator To<C>:Mat3<C>()
 		Return New Mat3<C>( i,j,k )
 	End
@@ -220,5 +214,5 @@ Struct Mat3<T>
 	Function Scaling:Mat3( t:T )
 		Return New Mat3( t,t,t )
 	End
-	
+
 End

+ 69 - 2
modules/std/geom/mat4.monkey2

@@ -42,10 +42,53 @@ Struct Mat4<T>
 		Return New Mat4<C>( i,j,k,t )
 	End
 	
+	Operator To:Mat3<T>()
+		Return New Mat3<T>( Cast<Vec3<T>>( i ),Cast<Vec3<T>>( j ),Cast<Vec3<T>>( k ) )
+	End
+	
+	Operator To:AffineMat4<T>()
+		Return New AffineMat4<T>( Cast<Mat3<T>>( Self ),Cast<Vec3<T>>( t ) )
+	End
+		
 	Operator To:String()
 		Return "Mat4("+i+","+j+","+k+","+t+")"
 	End
 	
+	Operator~:Mat4()
+		Return New Mat4(
+			New Vec4<T>( i.x,j.x,k.x,t.x ),
+			New Vec4<T>( i.y,j.y,k.y,t.y ),
+			New Vec4<T>( i.z,j.z,k.z,t.z ),
+			New Vec4<T>( i.w,j.w,k.w,t.w ) )
+	End
+	
+	Operator-:Mat4()
+		Local ii:=New Vec4<T>(
+			 j.y * k.z * t.w - j.y * k.w * t.z - k.y * j.z * t.w + k.y * j.w * t.z + t.y * j.z * k.w - t.y * j.w * k.z,
+			-i.y * k.z * t.w + i.y * k.w * t.z + k.y * i.z * t.w - k.y * i.w * t.z - t.y * i.z * k.w + t.y * i.w * k.z,
+			 i.y * j.z * t.w - i.y * j.w * t.z - j.y * i.z * t.w + j.y * i.w * t.z + t.y * i.z * j.w - t.y * i.w * j.z,
+			-i.y * j.z * k.w + i.y * j.w * k.z + j.y * i.z * k.w - j.y * i.w * k.z - k.y * i.z * j.w + k.y * i.w * j.z )
+		Local jj:=New Vec4<T>(
+			-j.x * k.z * t.w + j.x * k.w * t.z + k.x * j.z * t.w - k.x * j.w * t.z - t.x * j.z * k.w + t.x * j.w * k.z,
+			 i.x * k.z * t.w - i.x * k.w * t.z - k.x * i.z * t.w + k.x * i.w * t.z + t.x * i.z * k.w - t.x * i.w * k.z,
+			-i.x * j.z * t.w + i.x * j.w * t.z + j.x * i.z * t.w - j.x * i.w * t.z - t.x * i.z * j.w + t.x * i.w * j.z,
+			 i.x * j.z * k.w - i.x * j.w * k.z - j.x * i.z * k.w + j.x * i.w * k.z + k.x * i.z * j.w - k.x * i.w * j.z )
+		Local kk:=New Vec4<T>(
+			 j.x * k.y * t.w - j.x * k.w * t.y - k.x * j.y * t.w + k.x * j.w * t.y + t.x * j.y * k.w - t.x * j.w * k.y,
+			-i.x * k.y * t.w + i.x * k.w * t.y + k.x * i.y * t.w - k.x * i.w * t.y - t.x * i.y * k.w + t.x * i.w * k.y,
+			 i.x * j.y * t.w - i.x * j.w * t.y - j.x * i.y * t.w + j.x * i.w * t.y + t.x * i.y * j.w - t.x * i.w * j.y,
+			-i.x * j.y * k.w + i.x * j.w * k.y + j.x * i.y * k.w - j.x * i.w * k.y - k.x * i.y * j.w + k.x * i.w * j.y )
+		Local tt:=New Vec4<T>(
+			-j.x * k.y * t.z + j.x * k.z * t.y + k.x * j.y * t.z - k.x * j.z * t.y - t.x * j.y * k.z + t.x * j.z * k.y,
+			 i.x * k.y * t.z - i.x * k.z * t.y - k.x * i.y * t.z + k.x * i.z * t.y + t.x * i.y * k.z - t.x * i.z * k.y,
+			-i.x * j.y * t.z + i.x * j.z * t.y + j.x * i.y * t.z - j.x * i.z * t.y - t.x * i.y * j.z + t.x * i.z * j.y,
+			 i.x * j.y * k.z - i.x * j.z * k.y - j.x * i.y * k.z + j.x * i.z * k.y + k.x * i.y * j.z - k.x * i.z * j.y )
+			
+		Local c:T=1/(i.x*ii.x + i.y * jj.x + i.z * kk.x + i.w * tt.x)
+		
+		Return New Mat4( ii*c,jj*c,kk*c,tt*c )
+	End
+	
 	Operator*:Mat4( m:Mat4 )
 		Local r:Mat4
 		
@@ -126,6 +169,21 @@ Struct Mat4<T>
 		Return r
 	End
 	
+	Operator*:Vec4<T>( v:Vec4<T> )
+		Return New Vec4<T>( 
+			i.x*v.x+j.x*v.y+k.x*v.z+t.x*v.w,
+		 	i.y*v.x+j.y*v.y+k.y*v.z+t.y*v.w,
+		 	i.z*v.x+j.z*v.y+k.z*v.z+t.z*v.w,
+		 	i.w*v.x+j.w*v.y+k.w*v.z+t.w*v.w )
+	End
+	
+	Operator*:Vec3<T>( v:Vec3<T> )
+		Return New Vec3<T>(
+			i.x*v.x+j.x*v.y+k.x*v.z+t.x,
+		 	i.y*v.x+j.y*v.y+k.y*v.z+t.y,
+		 	i.z*v.x+j.z*v.y+k.z*v.z+t.z ) / (i.w*v.x+j.w*v.y+k.w*v.z+t.w)
+	End
+	
 	#rem monkeydoc Creates a translation matrix.
 	#end
 	Function Translation:Mat4( tv:Vec3<T> )
@@ -164,7 +222,7 @@ Struct Mat4<T>
 
 	#rem monkeydoc Creates an orthographic projection matrix.
 	#End	
-	Function Ortho:Mat4( left:Double,right:Double,bottom:Double,top:Double,near:Double,far:Double )
+	Function Ortho:Mat4( left:T,right:T,bottom:T,top:T,near:T,far:T )
 
 		Local w:=right-left,h:=top-bottom,d:=far-near,r:Mat4
 
@@ -179,7 +237,7 @@ Struct Mat4<T>
 		Return r
 	End
 	
-	Function Frustum:Mat4( left:Double,right:Double,bottom:Double,top:Double,near:Double,far:Double )
+	Function Frustum:Mat4( left:T,right:T,bottom:T,top:T,near:T,far:T )
 	
 		Local w:=right-left,h:=top-bottom,d:=far-near,near2:=near*2,r:Mat4
 
@@ -194,4 +252,13 @@ Struct Mat4<T>
 		Return r
 	End
 	
+	Function Perspective:Mat4( fovy:Double,aspect:T,znear:T,zfar:T )
+		
+		Local h:T=Tan(fovy * Pi / 360.0) * znear
+
+		Local w:T=h * aspect
+		
+		Return Frustum( -w,w,-h,h,znear,zfar )
+	End
+	
 End

+ 8 - 0
modules/std/geom/vec4.monkey2

@@ -32,6 +32,14 @@ Struct Vec4<T>
 	Method New( v:Vec2<T>,z:T,w:T )
 		x=v.x;y=v.y;Self.z=z;Self.w=w
 	End
+
+	Method To<C>:Vec4<C>()
+		Return New Vec4<C>( x,y,z )
+	End
+		
+	Method To:Vec3<T>()
+		Return New Vec3<T>( x,y,z )
+	End
 	
 	Property X:T()
 		Return x